我正在使用牛顿拉夫森平方根算法来计算输入值的单精度平方根。然而,使用我输入的测试平台,我发现某些输入值不会收敛到最接近实际平方根的答案。当我说实际平方根时,我的意思是您将获得比 32 位 IEEE-754 更精确的结果。 因此,我想知道在 IEEE-754 中执行平方根时获得的正确值是什么。这个论坛上的一些人告诉我,最接近的值不一定是最正确的,这就是我问的原因。
计算单精度 IEEE-754 32 位值 0x3f7fffff 的平方根时,什么被认为是正确的结果?为什么?
此外,计算0x7F7FFFFF的平方根时,什么才是正确的结果?
请您参考如下方法:
0x3f7fffff
为 1.0 - u
,其中 u = 2**-24
。 sqrt(1 + x)
的泰勒级数为:
sqrt(1 + x) = 1 + x/2 - x^2/8 + O(x^3)
如果我们将 -u
代入 x
,我们会得到:
sqrt(1 - u) = 1 - u/2 - u^2/8 - O(u^3)
值 1 - u/2
是两个最接近的可表示 float 1-u
和 1
之间的精确中间点>;由于泰勒级数中的下一项为负,因此 sqrt(1 - u)
的值稍微小一点,因此结果向下舍入为 1 - u
>.
0x7f7fffff
只是 2**128*(1-u)
,因此数学上精确的平方根是 2**64*(1 - u)/2 - u^2/8 - ...)
,向下舍入为 2**64 * (1-u)
,如上所述。