我正在测试一些接受Double值作为输入的函数的边界值。期望函数能够处理Double的任何值,但是无法比较双精度的最大值。
我试图孤立这些问题,发现大型双打的平等导致了我的问题。我试图将最大值更改为不紧密放置到最大值,但没有成功
// Evaluates to true.
var Equal11 = Double.MaxValue - 100d == Double.MaxValue - 200d;
var Equal12 = (Double.MaxValue - 100d).Equals(Double.MaxValue - 200d);
// Evaluates to false.
var Equal21 = 100d == 200d;
var Equal22 = (100d).Equals(200d);
我认为Equal11和Equal12是假的,就像Equal21和Equal22不相等一样。
我假设double以某种方式使其值接近Double.MaxValue,但是我不明白如何使用它。
假设Double
由IEEE 754 64位二进制浮点表示:
随着数字变大,连续浮点数之间的差距也会增大。在整个正常有限范围内,在[2n,2n + 1]范围内有252个值。
Double.MaxValue
约为1.7976931348623157e308。最大可表示值严格小于1.7976931348623155e308,差值1.9958403095347198e292。将googol从Double.MaxValue
轮减去Double.MaxValue
的结果,解释了减去100和减去200之间没有任何区别。
[ - (253),253]范围内的所有整数都是完全可表示的。该范围内的任何一对不同的整数将比较不相等,解释100不等于200。
我同意评论中的建议,以确定应用程序需要工作的范围,并测试该范围,而不是试图使其工作接近Double
算术的限制。您将需要处理浮点舍入的后果。通常,它会导致实数运算中值相等的不等式,但它也会导致相等,其中实数运算会导致不等式。