LINUX.ORG.RU

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

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