История изменений
Исправление
sambist,
(текущая версия)
:
Подумал немного и модифицировал код из статьи. В общем рекорд в 9 секунд от float побит на целочисленном вычислении:
Код:
uint32_t sqrti(uint32_t value)
{
uint32_t div;
if (value & 0xFFFF0000U)
if (value & 0xFF000000U)
div = 0x3FFF;
else
div = 0x3FF;
else
if (value & 0x0000FF00U)
div = 0x3F;
else div = (value > 4) ? 0x7 : value;
uint32_t p;
uint32_t n = (value / div + div) >> 1;
do
{
p = n;
n = (p + value / p) >> 1;
}
while (p > n);
return n;
}
Результаты:
//float : 100000x1000 cycles took 9.280323 s
//heron : 100000x1000 cycles took 42.152074 s
//fast : 100000x1000 cycles took 42.063780 s
//chld : 100000x1000 cycles took 42.026744 s
//prer : 100000x1000 cycles took 10.264415 s
//premod: 100000x1000 cycles took 7.893720 s <<
Исходная версия
sambist,
:
Подумал немного и модифицировал код из статьи. В общем рекорд в 9 секунд от float побит на целочисленном вычислении:
Код:
uint32_t sqrti(uint32_t value)
{
uint32_t div;
if (value & 0xFFFF0000U)
if (value & 0xFF000000U)
div = 0x3FFF;
else
div = 0x3FF;
else
if (value & 0x0000FF00U)
div = 0x3F;
else div = (value > 4) ? 0x7 : value;
uint32_t p;
uint32_t n = (value / div + div) >> 1;
do
{
p = n;
n = (p + value / p) >> 1;
}
while (p > n);
return n;
}
Результаты:
//float : 100000x1000 cycles took 9.280323 s
//heron : 100000x1000 cycles took 42.152074 s
//fast : 100000x1000 cycles took 42.063780 s
//chld : 100000x1000 cycles took 42.026744 s
//prer : 100000x1000 cycles took 10.264415 s
//premod: 100000x1000 cycles took 7.893720 s <<