Tag: epsilon

为浮点比较选择Epsilon值

我的团队正在使用财务软件,它将货币价值暴露为C#浮点数的两倍。 有时,我们需要比较这些值,看它们是否等于零,或者是否属于特定限制。 当我注意到这个逻辑中的意外行为时,我很快就了解了浮点双精度中固有的舍入误差(例如1.1 + 2.2 = 3.3000000000000003)。 到目前为止,我主要使用C#小数来表示货币值。 我的团队决定使用epsilon值方法解决这个问题。 基本上,当你比较两个数字时,如果这两个数字之间的差异小于epsilon,它们被认为是相等的。 我们以下面文章中描述的类似方式实现了这种方法: https : //www.codeproject.com/Articles/383871/Demystify-Csharp-floating-point-equality-and-relat 我们的挑战是为epsilon确定合适的价值。 我们的货币值最多可以包含小数点右侧的3位数(比例= 3)。 这意味着我们可以使用的最大epsilon是0.0001(任何更大的东西都会被忽略)。 由于epsilon值应该很小,我们决定将它再移出一个小数点到.00001(只是为了安全,你可以说)。 C#双精度具有至少15位的精度,所以我相信如果小数点左边的数字小于或等于10位数(15 – 5 = 10,其中5是数字,则epsilon的值应该有效)数字epsilon位于小数点右侧)。 使用10位数字,我们可以将数值表示为数十亿,最高可达9,999,999,999.999。 我们可能有数亿的数字,但我们不希望达到数十亿,所以这个限制就足够了。 我选择这个epsilon值的理由是正确的吗? 我找到了很多讨论这种方法的资源,但是我找不到很多资源来提供选择epsilon的指导。

为什么将double.epsilon添加到一个值会产生相同的值,完全相同?

我有一个unit testing,测试边界: [TestMethod] [ExpectedException(typeof(ArgumentOutOfRangeException))] public void CreateExtent_InvalidTop_ShouldThrowArgumentOutOfRangeException() { var invalidTop = 90.0 + Double.Epsilon; new Extent(invalidTop, 0.0, 0.0, 0.0); } public static readonly double MAX_LAT = 90.0; public Extent(double top, double right, double bottom, double left) { if (top > GeoConstants.MAX_LAT) throw new ArgumentOutOfRangeException(“top”); // not hit } 我以为我只是通过添加最小可能的正双倍来向尖端90.0倾斜,但是现在没有抛出exception,任何想法为什么? 调试时,我看到top为90,当它应该是90.00000000 …. 编辑:我应该想一点, 90+Double.Epsilon将失去其分辨率。 似乎最好的方法是做一些转移。 解: […]

获得下一个最小的双号

作为unit testing的一部分,我需要测试一些边界条件。 一种方法接受System.Double参数。 有没有办法获得下一个最小的双值? (即将尾数减1个单位值)? 我考虑使用Double.Epsilon但这是不可靠的,因为它只是从零开始的最小增量,因此不适用于较大的值(即9999999999 – Double.Epsilon == 9999999999 )。 那么所需的算法或代码是什么: NextSmallest(Double d) < d ……总是如此。