LINUX.ORG.RU

История изменений

Исправление 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;
}