康斯特与 #define(奇怪的行为)

const vs #define (strange behavior)

本文关键字:#define 康斯特      更新时间:2023-10-16

我曾经用 #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有几个话题,但真的没有得到这个,请启发我)

在 c++ 中,文字是双精度。在第一个示例中,数字 3e+38 首先在变量初始化中转换为浮点数,然后在比较中返回双精度。转换不一定准确,因此数字可能会有所不同。在第二个示例中,数字始终保持浮动。要修复它,您可以将p更改为double,写入

#define x 3e+38f

(定义浮点文本),或将比较更改为

if (p == static_cast<float>(x))

它执行与变量初始化相同的转换,然后以单精度进行比较。

此外,正如评论的那样,将浮点数与==进行比较通常不是一个好主意,因为舍入误差会产生意外的结果,例如,x*y可能与y*x不同。

数字 3e+38 由于其星等而翻倍。

作业

float p = x; 

导致 3E+38 在存储在 p 中时失去其精度并因此失去其值。

这就是为什么比较:

if(p==x)

结果为 false,因为p的值与 3E+38 不同。