C++错误的数学表达结果

Ste*_*Bay -2 c++ integer-division

我必须计算一些简单的数学表达式,但是当我在一行中执行时,结果总是为零.但正确的结果显然不是零.它很有趣但是当我分开表达的部分时,我得到了正确的答案.后来我将除以这个结果,所以它不应该是0.

表达式如下:

(X-X1)/(X2-X1)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,delta:0

double delta = (x - x1) / (x2 - x1);
Run Code Online (Sandbox Code Playgroud)

但这样三角洲将是正确的:

double top = x - x1;
double bottom = x2 - x1;
double delta = top/bottom;
Run Code Online (Sandbox Code Playgroud)

你知道吗,怎么会发生这种情况?

Mat*_*son 11

这是"用于产生浮点值的整数除法"的典型情况.如果x,x1并且x2都是整数,那么编译器应该根据C和C++的规则使用整数计算来计算x-x1x2-x1,然后将它们的差异除以整数除法.如果x2-x1大于x-x1,则结果为零[假设正值如7/14.-14/-7显然是2].

简单的解决方法是将一个表达式的类型转换为浮点类型:

double delta = static_cast<double>(x - x1) / (x2 - x1);
Run Code Online (Sandbox Code Playgroud)