康斯特与 #define(奇怪的行为)
const vs #define (strange behavior)
我曾经用 #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 不同。
相关文章:
- 康斯特指针C++斯特劳斯特鲁普
- Static_cast 对于康斯特来说,会抛弃预选赛
- 东康斯泰克普/康斯蒂尼特/康斯特瓦尔在C++20 中允许吗?
- 康斯特正确性建议
- 从字符到康斯特* 字符的转换无效,代码有什么问题?
- T*上的部分排序...和康斯特·
- 调用"树:<int>:运算符==(树*&<int><int>,树*&)康斯特"没有匹配函数
- 抛弃康斯特,就是这种定义明确的行为
- 错误:类型为 '.&' 来自类型的临时 '..*康斯特'
- 无法push_back移动(不可复制与康斯特字段)到矢量
- 传递康斯特字符*的值
- mpg123_open()和康斯特
- 康斯特指针浅拷贝
- C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
- 康斯特是谎言吗?(因为康斯特可以被抛弃)
- 康斯特·查尔 * 变得腐败
- 康斯特查尔..改变
- 康斯特与 #define(奇怪的行为)
- 这是抛弃康斯特吗?
- 第二个康斯特在"const int const &someval"做什么?