在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
是a
NaN
,那么
a==b
将是假的,即使
a
b
具有相同的位模式。其次,IEEE浮点中有两个零——正零和负零负零。如果
a
是正零,
b
是负零,那么
a==b
将为真,即使
a
b
具有不同的位模式。

如果您试图测试两个
是否在数值上相等,您需要测试
a==b


如果您试图测试两个
double
s是否具有相同的二进制表示形式,则需要首先获取二进制表示形式。似乎
位转换器.doubletotInt64位
是一个可以为您执行此操作的函数。然后在两位模式之间进行整数比较rns


数字相等和位对位相等之间有两个区别。首先,如果
a
b
是a
NaN
,那么
a==b
将是假的,即使
a
b
具有相同的位模式。其次,IEEE浮点中有两个零——正零和负零负零。如果
a
是正零,
b
是负零,那么
a==b
将是真的,即使
a
b
有不同的位模式。

你确定你的双变量中存储了你一开始就认为的准确值吗?我不在乎v值实际上等于它们所代表的真实世界的值(实际上我确信在大多数情况下它们并不相同).这些变量是我在本例中试图比较的原始变量。你确定你的双变量中存储了你认为你首先要做的准确值吗?我不在乎这些值是否实际上等于它们所代表的真实值(我确实确信在大多数情况下它们不相同)他问如何检查两个
double
s是否相等,而不是两个double是否在某个范围内