История изменений
Исправление
sambist,
(текущая версия)
:
Мда... В общем написал реализацию, проверил, работает. Вот только выигрыш... Кхем. Немного не в ту сторону:
float: 100000x1000 cycles took 9.280323 s
sqrti: 100000x1000 cycles took 42.152074 s
uint32_t sqrti(uint32_t value)
{
uint32_t p;
uint32_t n = value;
do
{
p = n;
n = (p + value / p) >> 1;
}
while (p > n);
return n;
}
Все что менял, это:
if ((target.x == line.p1.x) && (target.y == line.p1.y))
return SML_GRAD_MIN;
//float AB = sqrt(SML_SQR(line.p1.x - line.p2.x) +
uint32_t AB = sqrti(SML_SQR(line.p1.x - line.p2.x) +
SML_SQR(line.p1.y - line.p2.y));
//float AT = sqrt(SML_SQR(line.p1.x - target.x) +
uint32_t AT = sqrti(SML_SQR(line.p1.x - target.x) +
SML_SQR(line.p1.y - target.y));
if (AT > AB)
return SML_GRAD_MAX;
return SML_GRAD_MAX * AT / AB;
Исходная версия
sambist,
:
Мда... В общем написал реализацию, проверил, работает. Вот только выигрыш... Кхем. Немного не в ту сторону:
float: 100000x1000 cycles took 9.280323 s
sqrti: 100000x1000 cycles took 42.152074 s
uint32_t sqrti(uint32_t value)
{
uint32_t p;
uint32_t n = value;
do
{
p = n;
n = (p + value / p) >> 1;
}
while (p > n);
return n;
}