检查预设双精度值的有效性

时间:2012-02-06 01:26:00

标签: c++

当我懒惰时,我有时会在代码中执行以下操作:

double d = 0;
 ...
if( condition1 ) d = 1.0;

...
if (d == 0) { //not sure if this is valid
}

我是否可以始终指望如果我将double设置为0,我可以稍后使用d == 0可靠地检入代码吗?

我理解如果我在上面的代码中对d进行计算,我绝不会指望d正好0,但如果我设置它,我认为我可以。到目前为止,我在各种系统上的所有测试似乎表明这是合法的。

2 个答案:

答案 0 :(得分:4)

是的,对于大多数情况(即不包括NaN):在作业a = b;之后,条件a == b为真。因此,只要您只分配和比较您分配的内容,这应该是可靠的,即使对于浮点类型也是如此。

答案 1 :(得分:1)

我会避免它。虽然比较几乎肯定会在您给出的示例中起作用,但是当您使用无法使用浮点变量精确表达的值时,它可能会意外地崩溃。如果某个值无法在浮点变量中精确表示,则从协处理器复制到内存时可能会丢失某些精度,这与整个协处理器中保留的值不匹配。

我的偏好是添加范围,例如if(fabs(d)< 0.0001)或将信息保存在布尔值中。

编辑:来自wikipedia:“例如,十进制数0.1不能以任何有限精度的二进制浮点表示;精确的二进制表示将具有”1100“序列无休止地继续:“

所以如果你有(d == 0.1)有可能造成大混乱 - 你确定永远不会以这种方式改变代码吗?