Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Извлечение корня   Alexey Belyaev   24 Jun 2002 21:53:36 
 Извлечение корня   Roman Kukushkin   25 Jun 2002 21:30:52 
 целочисленный коpень   Yuri Burger   25 Jun 2002 22:38:14 
 коpень   Yuri Burger   25 Jun 2002 22:38:31 
 Re: целочисленный коpень   Alexandr A. Redchuck   29 Jun 2002 04:17:04 
 Re: целочисленный коpень   Alexandr A. Redchuck   29 Jun 2002 18:07:54 
Архивное /ru.algorithms/627044e5b5c4.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional