C++中double类型直接赋值后用==比较是否安全?
double直接赋值后用==比较的安全性问题
结论先行
直接把一个double变量赋值给另一个后,a == b绝对会成立,这种场景下用==完全安全,没必要额外加布尔字段记录。
为什么没问题?
现在几乎所有平台和编译器都遵循IEEE 754浮点数标准,当你执行b = a这种直接赋值操作时,b会完整复制a的二进制位——说白了就是内存里存的东西一模一样,用==比较自然会返回true。
GCC给出的“比较不安全”警告,是针对通过计算得到的浮点数的情况:比如两个理论上相等的计算逻辑,因为浮点数精度损失,实际结果可能不一样。但你已经明确说这种情况可以接受,只关心直接赋值的场景,所以这个警告对你来说是多余的。
对应你的代码
看你给出的示例:
double a, b; a = calculate_A(); b = calculate_B(); if (a == b) // 计算导致的不等你能接受,不用管这里的警告 a = calculate_A(); b = a; if (a == b) // 这个判断肯定是true,放心用
小建议
要是看着GCC的警告难受,可以用编译指令临时屏蔽这个浮点数比较的警告,比如:
#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wfloat-equal" if (a == b) { // 你的逻辑 } #pragma GCC diagnostic pop
这样既保留了其他场景下的警告提示,又能消除你明确安全的代码里的警告。
内容的提问来源于stack exchange,提问作者Ethouris
相关产品推荐
相关产品推荐

