当前位置: 首页 > 编程语言 > C#

为什么给一个值加上double.epsilon会产生相同的值,完全一样?分享

时间:2023-04-10 14:28:07 C#

为什么给一个值加上double.epsilon会产生相同的值,完全一样?我有一个测试边界的单元测试:[TestMethod][ExpectedException(typeof(ArgumentOutOfRangeException))]publicvoidCreateExtent_InvalidTop_ShouldThrowArgumentOutOfRangeException(){varinvalidTop=90.0+Double.Epsilon;新范围(无效顶部,0.0,0.0)公共;静态只读双MAX_LAT=90.0;publicExtent(doubletop,doubleright,doublebottom,doubleleft){if(top>GeoConstants.MAX_LAT)抛出新的ArgumentOutOfRangeException("top");//nothit}我以为我刚刚通过添加最小可能的正双精度以向尖端90.0倾斜,但现在没有抛出异常,任何想法为什么?调试时,我看到top是90,而它应该是90.00000000....编辑:我应该考虑一下,90+Double.Epsilon将失去其分辨率。似乎最好的方法是进行一些转移。解释:[TestMethod][ExpectedException(typeof(ArgumentOutOfRangeException))]publicvoidCreateExtent_InvalidTop_ShouldThrowArgumentOutOfRangeException(){varinvalidTop=Utility.IncrementTiny(90);//90.000000000000014//varsameAsEpsilon=Utility.IncrementTiny(0);新范围(无效顶部,0、0、0);}//////以尽可能小的数量递增双精度数//////双精度数///递增数publicstaticdoubleIncrementTiny(doublenumber){#regionSANITYCHECKSif(Double.IsNaN(number)||Double.IsInfinity(number))thrownewArgumentOutOfRangeException("number");#endregionvarbits=BitConverter.DoubleToInt64Bits(number);//如果负数则相反if(number>0)returnBitConverter.Int64BitsToDouble(bits+1);elseif(number<0)returnBitConverter.Int64BitsToDouble(bits-1);否则返回Double.Epsilon;}//////以可能的最小量递减双精度数le//////双精度数///递减数publicstaticdoubleDecrementTiny(doublenumber){#regionSANITYCHECKSif(Double.IsNaN(number)||Double.IsInfinity(number))thrownewArgumentOutOfRangeException(“数字”);#endregionvarbits=BitConverter.DoubleToInt64Bits(number);//如果为负数则相反if(number>0)returnBitConverter.Int64BitsToDouble(bits-1);elseif(number<0)returnBitConverter.Int64BitsToDouble(bits+1);否则返回0-Double.Epsilon;}这样做根据Double.Epsilon的文档:Epsilon属性的值反映了Double实例的值为零时,这在数值运算或比较中很重要最小的正Double值。(强调我的。)将它添加到90.0不会产生“90.0之后的下一个最小值”,它只会再次产生90.0。Double.Epsilon是最小的正可表示值。仅仅因为它本身是可表示的并不意味着它是任何其他可表示值和下一个最高值之间的最小值。假设您有一个表示整数的系统。您可以表示任意整数到5位有效数字,以及比例(例如1-100范围内)。因此,例如,可以准确地表示这些值。在这个系统中,“epsilon”值将是1...但是如果您将1添加到12345000,您仍然会得到12345000,因为系统无法表示12345001的准确结果。现在应用相同的逻辑double,具有所有的复杂性,你会得到一个更小的epsilon,但是相同的一般原则:一个不同于零的值,但是当添加到一个更大的数字时最终仍然没有区别。请注意,较大的值也具有相同的属性-例如,如果x是一个非常大的双精度数,则x+1可能等于x,因为两个“相邻”双精度数之间的差距变得大于2,因为该值变大了。因为Double.Epsilon是双数中“最小的显着变化”(松散地说)。..但这并不意味着您使用它会产生任何影响。如您所知,浮点数/双精度数的分辨率随着它们包含的vlue的大小而变化。例如,Artificial:如果分辨率是这样,则Epsilon将为0.001,因为这是最小的变化。但是在这样的系统中1000000+0.001的预期结果是什么?在C99和C++中,执行您要执行的操作的函数称为nextafter,它位于math.h中。我不知道C#是否有任何等效项,但如果有,我希望它有一个相似的名称。以上是C#学习教程:为什么一个值加上double.epsilon会产生相同的值,完全一样?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: