LINUX.ORG.RU

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

Исправление sambist, (текущая версия) :

Вот те варианты вычислений что пробовал:

uint32_t sqrti(uint32_t value)
{
    //heron
    uint32_t p;
    uint32_t n = value;
    do
    {
        p = n;
        n = (p + value / p) >> 1;
    }
    while (p > n);

    return n;

//    return n;

    //fast
//       unsigned int m, y, b;
//       m = 0x4000;
//       y = 0;
//       while (m != 0){
//          b = y | m;
//          y = y >> 1;
//          if (value >= b) {
//             value = value - b;
//             y = y | m;
//          }
//          m = m >> 2;
//       }
//       return y;

    // chld
//    uint32_t c = 0;
//    uint32_t d = 1;
//    while (value)
//    {
//        value -= d;
//        c++;
//        d += 2;
//    }
//    return c;

    //root a few iterations
//    uint32_t x;
//    x = (value / 0x3f + 0x3f) >> 1;
//    x = (value / x + x) >> 1;
//    x = (value / x + x) >> 1;
//    return x;
}

Все на двух корнях показывают 42, на одном 30 секунд.

Исходная версия sambist, :

Вот те варианты вычислений что пробовал:

uint32_t sqrti(uint32_t value)
{
    //heron
    uint32_t p;
    uint32_t n = value;
    do
    {
        p = n;
        n = (p + value / p) >> 1;
    }
    while (p > n);

    return n;

//    return n;

    //fast
//       unsigned int m, y, b;
//       m = 0x4000;
//       y = 0;
//       while (m != 0){
//          b = y | m;
//          y = y >> 1;
//          if (value >= b) {
//             value = value - b;
//             y = y | m;
//          }
//          m = m >> 2;
//       }
//       return y;

    // chld
//    uint32_t c = 0;
//    uint32_t d = 1;
//    while (value)
//    {
//        value -= d;
//        c++;
//        d += 2;
//    }
//    return c;

    //root a few iterations
//    uint32_t x;
//    x = (value / 0x3f + 0x3f) >> 1;
//    x = (value / x + x) >> 1;
//    x = (value / x + x) >> 1;
//    return x;
}