Skip to main content
 首页 » 编程设计

c++之计算这个平方根时,什么被认为是 IEEE-754 正确的结果

2024年05月29日20dudu

我正在使用牛顿拉夫森平方根算法来计算输入值的单精度平方根。然而,使用我输入的测试平台,我发现某些输入值不会收敛到最接近实际平方根的答案。当我说实际平方根时,我的意思是您将获得比 32 位 IEEE-754 更精确的结果。 因此,我想知道在 IEEE-754 中执行平方根时获得的正确值是什么。这个论坛上的一些人告诉我,最接近的值不一定是最正确的,这就是我问的原因。

计算单精度 IEEE-754 32 位值 0x3f7fffff 的平方根时,什么被认为是正确的结果?为什么?

此外,计算0x7F7FFFFF的平方根时,什么才是正确的结果?

请您参考如下方法:

0x3f7fffff1.0 - u,其中 u = 2**-24sqrt(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-u1 之间的精确中间点>;由于泰勒级数中的下一项为负,因此 sqrt(1 - u) 的值稍微小一点,因此结果向下舍入为 1 - u >.

0x7f7fffff 只是 2**128*(1-u),因此数学上精确的平方根是 2**64*(1 - u)/2 - u^2/8 - ...),向下舍入为 2**64 * (1-u),如上所述。