math - 定点的逆平方

标签 math fixed-point inverse sqrt

我正在为定点 16.16 数字寻找最佳的平方根平方根算法。下面的代码是我到目前为止所拥有的(但基本上它取平方根并除以原始数字,我想在没有除法的情况下得到平方根的倒数)。如果它改变了任何东西,代码将被编译为 armv5te。

uint32_t INVSQRT(uint32_t n)
{
    uint64_t op, res, one;
    op = ((uint64_t)n<<16);
    res = 0;
    one = (uint64_t)1 << 46;
    while (one > op) one >>= 2;
    while (one != 0)
    {
        if (op >= res + one)
        {
            op -= (res + one);
            res +=  (one<<1);
        }
        res >>= 1;
        one >>= 2;
    }
    res<<=16;
    res /= n;
    return(res);
}

最佳答案

诀窍是将牛顿方法应用于问题 x - 1/y^2 = 0。因此,给定 x,使用迭代方案求解 y。

Y_(n+1) = y_n * (3 - x*y_n^2)/2

除以 2 只是一个位移,或者最坏的情况是乘以 0.5。该方案完全按照要求收敛到 y=1/sqrt(x),并且根本没有任何真正的除法。

唯一的问题是你需要一个合适的 y 起始值。我记得迭代收敛的估计 y 是有限制的。

关于math - 定点的逆平方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6286450/

相关文章:

mysql - 在 Ruby on Rails 中处理定点/精度小数的最佳方法

floating-point - 定点 MATLAB DSP 算法

python - Python中的平方根倒数

c++ - 对将玩家移动到鼠标位置的简单公式感到困惑

java - 将 3D 点投影到 2D 屏幕坐标

math - x86-64 大整数表示?

java - 获取 Java boolean 值的倒数的最简洁方法是什么?

java - 在 Java2D AWT 框架中使用世界坐标

multiplication - 采用交叉乘法的 32 位小数乘法(无 64 位中间结果)

RegEx 颠倒列表顺序?