C++和Octave结果因简单算术而异

The*_*ere 1 c++ math floating-point octave pow

我有一个C++代码和一个Octave,它们都计算相同的方程式

在C++中

#include <math.h>
int main()
{
    float x = 1.5f;
    float y = pow(x, 6) * 235809835.41f - pow(x, 5) * 2110439254.2f + pow(x, 4) *7869448124.8f - pow(x, 3) * 15648965509.0f + pow(x, 2) * 17503313074.0f - (x)* 10440563329.0f + 2594694745.0f; // result y = 3584
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Octave

x = 1.5
y = (x ^ 6) * 235809835.41 - (x ^ 5) * 2110439254.2 + (x ^ 4) *7869448124.8 - (x ^ 3) * 15648965509 + (x ^ 2) * 17503313074 - (x)* 10440563329 + 2594694745? // result y = 26
Run Code Online (Sandbox Code Playgroud)

在两种情况下,y的计算值不同.C++计算y为3584,Octave计算y为26.这可能是导致这种分歧的原因?

编辑:Excel产生与Octave相同的结果,结果在等式的上下文中也是合乎逻辑的.所以,C++代码或编译器出了问题.

cdh*_*wie 6

这似乎是由于该float类型的精度有限,这可能导致其中一个操作被有效地丢弃,因为一个操作数的幅度小于另一个操作数,从而导致结果的显着变化.(参见这个非常人为的例子,它显示了这可能是什么样子.)

如果你重写代码以使用double更精确的类型,那么结果是26.810783,它与我在评估Maxima中的公式时得到的结果相匹配.

进一步阅读:每个计算机科学家应该知道的浮点运算