C++ 不正确的浮点数学?
这是一个在过去几个小时里让我完全困惑的问题 我的程序中硬编码了一个等式:C++ 不正确的浮点数学?,c++,floating-point,C++,Floating Point,这是一个在过去几个小时里让我完全困惑的问题 我的程序中硬编码了一个等式: double s2; s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 每次我运行这个程序,计算机都会给出3作为答案,但是手工计算,我得到4。更进一步,在将方程输入Matlab之后,我也得到了答案4。这是怎么回事 我能想到的唯一一件事就是这里出错了,那就是四舍五入的错误。然而,由于最多有5个舍入误差,再加上使用双精度数学,我的最大误差将非常小,因此我怀疑这是问题所在 有人能提供任何解
double s2;
s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42;
每次我运行这个程序,计算机都会给出3作为答案,但是手工计算,我得到4。更进一步,在将方程输入Matlab之后,我也得到了答案4。这是怎么回事
我能想到的唯一一件事就是这里出错了,那就是四舍五入的错误。然而,由于最多有5个舍入误差,再加上使用双精度数学,我的最大误差将非常小,因此我怀疑这是问题所在
有人能提供任何解决方案吗
提前感谢,
-法肯你把整数除法和浮点除法搞混了。3是整数除法的正确答案。如果你把这些值转换成浮点数,你会得到4。你实际上不是在做浮点数数学,而是在做整数数学,这将降低除法的结果 在C++中,5/4=1,而不是1.25——因为5和4都是整数,所以结果是整数,因此结果的小数部分被丢弃。
另一方面,5.0/4.0将等于约1.25,因为5.0和4.0中至少有一个是浮点数,因此结果也将是浮点数。其中一些是使用整数算法计算的。尝试在数字中添加一个小数位,例如
6.0
而不是6
,告诉编译器您不需要整数算术
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.;
做你想做的。事实上,那将是一个
.f
,而不仅仅是f
。嗯,谢谢你的帮助。应该早点到这里,哦,1.25和4.0以及5.0一样,都可以用base 2表示。应该是准确的。因为这是一个武断的例子dmckee,我决定使用更安全的说法。:)