Ver*_*ian 2 c++ math floating-point matlab computer-science
我有一个Newton-Raphson平方根算法,我使用它计算输入值的单精度平方根.然而,使用我输入的测试平台,我发现某些输入值不会收敛到最接近实际平方根的答案.当我说实际平方根时,我的意思是你得到的结果比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)
Run Code Online (Sandbox Code Playgroud)
如果我们插上-u在x,我们得到:
sqrt(1 - u) = 1 - u/2 - u^2/8 - O(u^3)
Run Code Online (Sandbox Code Playgroud)
该值1 - u/2是两个最接近的可表示浮点数之间的确切中间点,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),如上所述.