我正在寻找定点 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 是有限制的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)