我有一个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 ++代码或编译器出了问题。
答案 0 :(得分:6)
这似乎是由于float
类型的精度有限,这可能导致其中一个操作被有效地丢弃,因为一个操作数的大小比另一个大得多,导致重大变化结果。 (参见this extremely contrived example,它显示了这可能是什么样子。)
如果您重写代码以使用更准确的double
类型,那么the result is 26.810783将与我在评估Maxima中的公式时获得的结果相匹配。
进一步阅读:What Every Computer Scientist Should Know About Floating-Point Arithmetic