【发布时间】:2012-09-19 16:39:12
【问题描述】:
虽然“我们都知道”x == y 可能有问题,其中x 和y 是浮点值,但这个问题更具体一点:
int x = random.Next(SOME_UPPER_LIMIT);
float r = x;
// Is the following ALWAYS true?
r == x
现在,由于float的范围远大于整数(但精度不足以在边缘唯一呈现整数),如果回答这个问题还解决了上述x的哪些值可以保证,如果可以保证的话。
目前我的代码 做出这个假设(对于相对较小的 x 值) - 我想确保我不会被咬 :)
这将失败并显示“不等于:16777217”(cast float -> int):
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if ((int)f != i) throw new Exception("not equal " + i);
}
这个类似的代码不会失败(只有 int -> float);然而,由于转换中的损失,有几个浮点数可以“等于”同一个整数,并且可能代表一个无声的错误:
for (int i = 0; i < int.MaxValue; i++) {
float f = i;
if (f != i) throw new Exception("not equal " + i);
}
【问题讨论】:
-
循环通过
Int32.MinValue到Int32.MaxValue,每次比较演员的结果。收集比较错误并且您有答案的案例(至少对于您的架构而言)。 -
@pst:老实说,不要认为这个问题有 any 通用的正确答案。假设“总是”永远不会在不同的机器上工作,所以它永远不会总是。如果,自然,我们在这里谈论的是肯定的答案。
标签: c# floating-point equality