这是一个让我在过去几个小时里完全感到困惑的问题......
我的程序中有一个硬编码的等式:
double s2;
s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42;
每次我运行程序时,计算机都会吐出3作为答案,但是手动进行数学计算,我得到4.更进一步,在将方程式输入Matlab之后,我也得到答案4.什么是正在进行的这里吗?
我唯一可以想到的是这里出错了就是圆满错误。然而,最多有5个舍入误差,加上使用双精度数学,我的最大误差将非常小,所以我怀疑这是问题。
任何人都能提供任何解决方案吗?
提前致谢,
-Faken
答案 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.;
做你期望的事。