我必须计算一些简单的数学表达式,但是当我在一行中计算时,结果总是为零。但正确的结果显然不是零。这很有趣,但是当我将表达的各个部分分开时,我得到了正确的答案。
稍后我会用这个结果除,所以它不应该是0。
表达式是这样的:
(X-X1)/(X2-X1)
在这种情况下delta: 0
double delta = (x - x1) / (x2 - x1);
但这样一来delta将是正确的:
double top = x - x1;
double bottom = x2 - x1;
double delta = top/bottom;
你知道这怎么会发生吗?
这是“用于生成浮点值的整数除法”的典型情况。如果x
, x1
and x2
都是整数,那么编译器应该按照C和C++的规则使用整数计算来计算x-x1
and x2-x1
,然后将它们的差除以整数除法。如果x2-x1
大于x-x1
,那么结果为零[假设正值如 7/14. -14 / -7 显然是 2]。
简单的解决方法是将一个表达式的类型转换为浮点类型:
double delta = static_cast<double>(x - x1) / (x2 - x1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)