-2

我必须计算一些简单的数学表达式,但是当我连续计算时,结果总是为零。但正确的结果显然不是零。它很有趣,但是当我分开表达的部分时,我得到了正确的答案。稍后我会用这个结果除,所以它不应该是 0。

表达式是这样的:

(X-X1)/(X2-X1)

在这种情况下,增量:0

double delta = (x - x1) / (x2 - x1);

但是这样增量是正确的:

double top = x - x1;
double bottom = x2 - x1;
double delta = top/bottom;

你有什么想法,这怎么会发生?

4

4 回答 4

11

这是“用整数除法做浮点值”的典型案例。如果x,x1x2都是整数,那么编译器应该按照 C 和 C++ 的规则使用整数计算来计算x-x1x2-x1,然后将它们的差异作为整数除法。如果x2-x1大于x-x1,则结果为零 [假设为 7/14 等正值。-14 / -7 显然是 2]。

The easy fix is to convert the type of one expression to a floating point type:

double delta = static_cast<double>(x - x1) / (x2 - x1);
于 2013-03-21T14:50:39.290 回答
2

在第一种情况下,整数/整数,结果仍然是整数,然后将整数转换为双精度。

在第二种情况下,双倍/双倍,那么你会得到正确的结果。

于 2013-03-21T14:49:41.577 回答
1

在第一种情况下,您正在执行int / int这将产生一个int值。因此,如果您的分母大于分子,则结果将被截断为 0。

在第二种情况下,您正在评估一个double/double将评估为一个double值的表达式,因此保留了小数和整数部分。

于 2013-03-21T14:50:29.780 回答
0

You have to cast the integer division to double. type casting

于 2013-03-21T15:52:18.923 回答