c++数学表达式的错误结果

C++ wrong result of mathematical expression

本文关键字:错误 结果 表达式 c++      更新时间:2023-10-16

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

表达式是这样的:

(X-X1)/(X2-X1)

在这种情况下: 0

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

但是这样 δ 将是正确的:

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

你知道这是怎么发生的吗?

这是一个典型的"用整数除法得到浮点值"的例子。如果xx1x2均为整数,则编译器应根据C和c++的规则,用整数计算方法计算x-x1x2-x1,然后将它们的差除为整数除法。如果x2-x1大于x-x1,则结果为零[假设为7/14这样的正值。-14/-7显然是2]

简单的修复方法是将一个表达式的类型转换为浮点类型:
double delta = static_cast<double>(x - x1) / (x2 - x1);

在第一种情况下,integer/integer,结果仍然是整型,然后将整型转换为double

在第二种情况下,double/double,那么你得到正确的结果

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

在第二种情况下,您正在计算double/double表达式,该表达式将计算为double值,因此保留小数和整数部分。

必须将整型除法转换为双精度。型铸造