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

时间:2014-10-24 16:54:06

标签: 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;
}

在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

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

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

1 个答案:

答案 0 :(得分:6)

这似乎是由于float类型的精度有限,这可能导致其中一个操作被有效地丢弃,因为一个操作数的大小比另一个大得多,导致重大变化结果。 (参见this extremely contrived example,它显示了这可能是什么样子。)

如果您重写代码以使用更准确的double类型,那么the result is 26.810783将与我在评估Maxima中的公式时获得的结果相匹配。

进一步阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic