Re: целочисленный коpень
- From
- Alexandr A. Redchuck ()
- To
- Yuri Burger
- Date
- 2002-06-29T04:17:04Z
- Area
- RU.ALGORITHMS
From: "Alexandr A. Redchuck" <real@real.kiev.ua>
25-Jun-02 21:38 Yuri Burger wrote to Alexey Belyaev:
YB> Николай Гаpбyз
YB> nick@sf.demos.su
[^Y]
YB> testing with range[0..1000]
YB> Done.
Аналогично.
YB> range fpu1 cpu1 cpu2
YB> 1000 1.000 3.000 3.000
YB> 10000 1.000 3.000 4.000
YB> 100000 1.000 3.000 5.000
А нельзя ли уточнить - компиляция для 16-битного или 32-битного
режима? (мало ли, там выше бородатые времена поминались :-)
А то я рискую показаться назойливым (и сюда, и в RU.EMBEDDED
уже не раз постил):
unsigned short isqrt( unsigned long ul) {
unsigned long sqr = 0;
unsigned long temp;
unsigned long mask;
if( !(ul & 0xFFFFFF00) ) mask = 0x40;
else if( !(ul & 0xFFFF0000) ) mask = 0x4000;
else if( !(ul & 0xFF000000) ) mask = 0x400000;
else mask = 0x40000000;
do {
temp = sqr | mask;
sqr >>= 1;
if( temp <= ul ) {
sqr |= mask;
ul -= temp;
}
} while( mask >>= 2 );
//если не нужно округление - убрать эту строку
if( sqr < ul && sqr < 0xFFFF ) ++sqr;
return (unsigned short)sqr;
}
Из этого дела были убраны слова short и проверка sqr < 0xFFFF,
а также unsigned при long ul, чтобы вписалось в исходник
из предыдущего письма.
Результат (сделано по нескольку запусков):
16-bit compiler (bcc3.1)
// 2000 было слишком мало для Athlon-XP 1700+ / DDR266
#define count (2000*10)
range fpu1 cpu1 isqrt
1000 4.000 6.000 6.000
10000 4.000 5.000 7.000
100000 4.000 17.000 9.000
1000 3.000 7.000 6.000
10000 3.000 6.000 7.000
100000 3.000 18.000 8.000
1000 3.000 7.000 6.000
10000 3.000 6.000 7.000
100000 3.000 18.000 8.000
32-bit compiler (gcc/win32)
#define count (2000*10)
range fpu1 cpu1 isqrt
1000 2.000 3.000 1.000
10000 1.000 3.000 1.000
100000 2.000 3.000 2.000
1000 2.000 3.000 1.000
10000 2.000 2.000 2.000
100000 1.000 4.000 2.000
#define count (2000*10*5)
range fpu1 cpu1 isqrt
1000 7.000 16.000 6.000
10000 7.000 13.000 6.000
100000 7.000 20.000 8.000
wbr,
p.s. я уж не говорю о ситуации, когда у процессора нет команды
деления - типовая ситуация для RU.EMBEDDED :-)
p.s.2 вывод алгоритма и asm386 исходник (только без
округления и выбора mask в зависимости от диапазона) был в этой
эхе пару лет назад.
--
/* Alexandr Redchuck, Kyiv, Ukraine */
/* real на real тчк kiev тчк ua */
--- ifmail v.2.15dev5
* Origin: ReAl at home (2:5020/400)