|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Alexandr A. Redchuck 2:5020/400 29 Jun 2002 04:17:04 To : Yuri Burger Subject : Re: целочисленный коpень -------------------------------------------------------------------------------- 25-Jun-02 21:38 Yuri Burger wrote to Alexey Belyaev: YB> Hиколай Га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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/627044e5b5c4.html, оценка из 5, голосов 10
|