#include <stdio.h>
#define Cpl 830
#define Tl 1708
#define Td 2200
#define den 7200
int main()
{
double hd1 = Cpl*(Td - Tl);
double hd2 = Cpl*(Td - Tl)*den;
double hd3 = hd1 * den;
printf("%e\n", hd1);
printf("%e\n", hd2);
printf("%e\n", hd3);
return 0;
}
HD2和HD3不相等?提问的形式比问题本身要难得多。这些词的存在是因为它需要更多的话,使问题看起来很好。
2条答案
按热度按时间3lxsmp7m1#
那条线
执行整数计算,因为所有操作数都是整数常量,并将结果转换为
double
,而行执行浮点(双精度)计算,因为一个操作数是
double
类型的变量。在数字上添加一个小数点,将它们标记为
double
常量。还要注意的是,
Cpl*(Td - Tl)*den;
很可能导致 * 有符号整数溢出 * 和 * 未定义行为 *。oalqel3c2#
声明
相当于:
*
和-
操作的所有操作数的类型都是int
,因为这是integer constant的默认类型。这意味着操作的结果也总是int
类型。但是,在您的平台上,类型int
可能无法表示数学结果2,940,192,000
,因为int
(即INT_MAX
)可表示的最大值可能是32,767
或2,147,483,647
,具体取决于您使用的平台。因此,您有一个signed integer overflow,它调用未定义的行为。在大多数平台上,这将导致结果值被截断。数据类型
double
能够表示更大范围的数字。因此,如果您将操作数的类型更改为double
,则问题将消失。将数据类型更改为double
的最简单方法是在末尾添加.0
: