C++和Octave的结果对于简单的算术来说是不同的

C++ and Octave results differ for simple arithmetic

本文关键字:简单 是不同 Octave 结果 C++ 于简单      更新时间:2023-10-16

我有一个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;
}

八倍频程

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++代码或编译器出了问题。

这似乎是由于float类型的精度有限,这可能会导致其中一个操作被有效丢弃,因为一个操作数的大小小于另一个,从而导致结果发生重大更改。(看看这个极其做作的例子,它展示了这可能是什么样子。)

如果您重写代码以使用更精确的double类型,则结果为26.810783,这与我在Maxima中评估公式时得到的结果相匹配。

进一步阅读:每一位计算机科学家都应该知道的关于浮点算术

相关文章: