浮点数学不正确?

时间:2009-08-06 01:30:14

标签: c++ floating-point

这是一个让我在过去几个小时里完全感到困惑的问题......

我的程序中有一个硬编码的等式:

double s2;

s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42;

每次我运行程序时,计算机都会吐出3作为答案,但是手动进行数学计算,我得到4.更进一步,在将方程式输入Matlab之后,我也得到答案4.什么是正在进行的这里吗?

我唯一可以想到的是这里出错了就是圆满错误。然而,最多有5个舍入误差,加上使用双精度数学,我的最大误差将非常小,所以我怀疑这是问题。

任何人都能提供任何解决方案吗?

提前致谢,

-Faken

4 个答案:

答案 0 :(得分:17)

你实际上并没有在那里进行浮点数学运算,你正在进行整数数学运算,这将得到除法的结果。

在C ++中,5/4 = 1, 1.25 - 因为5和4都是整数,所以结果将是一个整数,因此结果的小数部分被丢弃。

另一方面,5.0 / 4.0将等于约。 1.25因为5.0和4.0中至少有一个是浮点数,所以结果也是浮点数。

答案 1 :(得分:7)

你将整数除法与浮点除法混淆。 3是整数除法的正确答案。如果将这些值转换为浮点数,则会得到4。

答案 2 :(得分:3)

其中一些是使用整数运算进行评估的。尝试为您的数字添加小数位,例如6.0而不是6告诉编译器你不想要整数运算。

答案 3 :(得分:3)

s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42;

产量3

s2 = -(0.*13.)/84.+6./42.-0./84.+24./12.+(6.*13.)/42.;

做你期望的事。