我曾经用#define替换const,但在下面的示例中,它打印 false 。
#include <iostream>
#define x 3e+38
using namespace std;
int main() {
float p = x;
if (p==x)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
return 0;
}
但如果我更换
#define x 3e+38
与
const float x = 3e+38;
它完美无缺,问题是为什么? (我知道有几个主题讨论#define vs const,但是真的没有得到这个,请赐教我)
答案 0 :(得分:5)
在c ++中,文字是双精度的。在第一个例子中,数字3e + 38首先在变量初始化中转换为float,然后在比较中返回双精度。转换不是必需的,因此数字可能不同。在第二个示例中,数字始终保持浮动状态。要解决此问题,您可以将p
更改为double
,然后写入
#define x 3e+38f
(定义浮点文字),或将比较更改为
if (p == static_cast<float>(x))
执行与变量初始化相同的转换,然后以单精度进行比较。
同样评论浮点数与==
的比较通常不是一个好主意,因为舍入错误会产生意外结果,例如,x*y
可能与y*x
不同。 / p>
答案 1 :(得分:1)
3e + 38的数量因其幅度而翻倍。
作业
float p = x;
导致3e + 38在p
存储时失去其精度,因此失去其值。
这就是比较的原因:
if(p==x)
导致错误,因为p
的值不同于3e + 38。