在c#中检查浮点变量精确值相等的正确方法是什么?
我需要检查浮点(在c#中检查浮点变量精确值相等的正确方法是什么?,c#,.net,floating-point,C#,.net,Floating Point,我需要检查浮点(double)变量a值是否正好等于浮点(double)变量b值。我知道浮点类型与所有十进制值不完全匹配,这样的比较没有太多“物理意义”,但我仍然需要检查存储的值从二进制角度看是否完全相同。在这种情况下,使用=操作符可以吗?对于精确的相等,只要如果(a==b)或如果(a.Equals(b))(注意:如果涉及NaN,这两个表达式的结果可能不同) 但是如果你想解释浮点舍入误差(你应该这么做),它就更复杂了。理论上,你可以使用常数来检查数字之间的差值是否在正负ε之间。在实践中,人们普遍认
double
)变量a
值是否正好等于浮点(double
)变量b
值。我知道浮点类型与所有十进制值不完全匹配,这样的比较没有太多“物理意义”,但我仍然需要检查存储的值从二进制角度看是否完全相同。在这种情况下,使用=
操作符可以吗?对于精确的相等,只要如果(a==b)
或如果(a.Equals(b))
(注意:如果涉及NaN
,这两个表达式的结果可能不同)
但是如果你想解释浮点舍入误差(你应该这么做),它就更复杂了。理论上,你可以使用常数来检查数字之间的差值是否在正负ε之间。在实践中,人们普遍认为框架弄错了()并且使它太小了(MSDN文档-请参阅本页中间的注释),这样您就需要使用自己的小常量。1.0e-12或1.0e-15是常见的默认选项,但您真正要做的是分析数学以确定实际的舍入误差,并使用“ε”在此基础上为您的特定问题设置一个常量。不幸的是,此过程很容易出错,因此上面提到了常见的默认值。对于精确的相等,它只是
如果(a==b)
或如果(a.Equals(b))
(注意:如果涉及NaN
,则这两个表达式的结果可能不同
但是如果你想解释浮点舍入误差(你应该这么做),它就更复杂了。理论上,你可以使用常数来检查数字之间的差值是否在正负ε之间。在实践中,人们普遍认为框架弄错了()并且使它太小了(MSDN文档-请参阅本页中间的注释),这样您就需要使用自己的小常量。1.0e-12或1.0e-15是常见的默认选项,但您真正要做的是分析数学以确定实际的舍入误差,并使用“ε”不幸的是,这个过程很容易出错,因此上面提到了常见的默认值。如果
x
和y
都是类型double
,那么x==y
当且仅当x
和y
是二进制等价的。那么,如果你真的是如果x
和y
都是类型double
,那么x==y
当且仅当x
和y
是二进制等价的。因此,如果你真正寻找的是二进制等价,那么==code>正是您想要使用的。如果您试图测试两个double
s在数值上是否等于,a==b
如果您试图测试两个double
s是否具有相同的二进制表示形式,则需要首先获取二进制表示形式。似乎位转换器.doubletotInt64位
是一个可以为您执行此操作的函数。然后在两位模式之间进行整数比较rns
数字相等和位对位相等之间有两个区别。首先,如果a
或b
是aNaN
,那么a==b
将是假的,即使a
和b
具有相同的位模式。其次,IEEE浮点中有两个零——正零和负零负零。如果a
是正零,b
是负零,那么a==b
将为真,即使a
和b
具有不同的位模式。如果您试图测试两个双是否在数值上相等
,您需要测试a==b
如果您试图测试两个double
s是否具有相同的二进制表示形式,则需要首先获取二进制表示形式。似乎位转换器.doubletotInt64位
是一个可以为您执行此操作的函数。然后在两位模式之间进行整数比较rns
数字相等和位对位相等之间有两个区别。首先,如果a
或b
是aNaN
,那么a==b
将是假的,即使a
和b
具有相同的位模式。其次,IEEE浮点中有两个零——正零和负零负零。如果a
是正零,b
是负零,那么a==b
将是真的,即使a
和b
有不同的位模式。你确定你的双变量中存储了你一开始就认为的准确值吗?我不在乎v值实际上等于它们所代表的真实世界的值(实际上我确信在大多数情况下它们并不相同).这些变量是我在本例中试图比较的原始变量。你确定你的双变量中存储了你认为你首先要做的准确值吗?我不在乎这些值是否实际上等于它们所代表的真实值(我确实确信在大多数情况下它们不相同)他问如何检查两个double
s是否相等,而不是两个double是否在某个范围内