计算此平方根时,什么被接受为IEEE-754正确的结果?

Ver*_*ian 2 c++ math floating-point matlab computer-science

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

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

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

Ste*_*non 6

0x3f7fffff1.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)

如果我们插上-ux,我们得到:

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),如上所述.

  • @StephenCanon:唯一的"to"舍入模式是"to nearest"和"to odd".其他人都是"朝向"; 例如,在朝向零的方向上进行一轮,而不是一直到零.虽然这会简化实施并提高速度.:-) (2认同)