双边界值的平等

问题描述 投票:1回答:1

我正在测试一些接受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,但是我不明白如何使用它。

c# double
1个回答
3
投票

假设Double由IEEE 754 64位二进制浮点表示:

随着数字变大,连续浮点数之间的差距也会增大。在整个正常有限范围内,在[2n,2n + 1]范围内有252个值。

Double.MaxValue约为1.7976931348623157e308。最大可表示值严格小于1.7976931348623155e308,差值1.9958403095347198e292。将googolDouble.MaxValue轮减去Double.MaxValue的结果,解释了减去100和减去200之间没有任何区别。

[ - (253),253]范围内的所有整数都是完全可表示的。该范围内的任何一对不同的整数将比较不相等,解释100不等于200。

我同意评论中的建议,以确定应用程序需要工作的范围,并测试该范围,而不是试图使其工作接近Double算术的限制。您将需要处理浮点舍入的后果。通常,它会导致实数运算中值相等的不等式,但它也会导致相等,其中实数运算会导致不等式。

© www.soinside.com 2019 - 2024. All rights reserved.