C语言中用#define定义常量后,hd2与hd3为何不相等?
为什么hd2和hd3的计算结果不一致?
问题出在整数运算溢出和运算类型转换的时机差异上:
- 你的所有
#define常量都是整数类型(int),不同计算路径的运算规则存在差异:- 计算
hd3时:hd1是double类型,乘以den(int)时,den会先被自动转换为double,整个运算全程是浮点数运算,不会出现溢出,结果正确。 - 计算
hd2时:Cpl*(Td-Tl)*den是纯整数链式运算,先算Td-Tl=492,再算830*492=408360,最后算408360*7200=2940192000。而普通32位int的最大值是2147483647,这个结果超出了int的取值范围,触发整数溢出(溢出后的结果会变成负数,因为补码机制),最后这个错误的整数值才被转换为double,导致hd2的结果错误。
- 计算
解决方法
有两种简单的修正方式:
- 把
#define的常量定义为浮点数,让运算全程以浮点数进行:#define Cpl 830.0 #define Tl 1708.0 #define Td 2200.0 #define den 7200.0 - 或者在运算时强制将第一个整数转换为
double,提前触发浮点数运算:double hd2 = (double)Cpl*(Td - Tl)*den;
修正后,hd2和hd3的计算结果就会完全一致。
内容的提问来源于stack exchange,提问作者Xuesong Gao
相关产品推荐
相关产品推荐

