这是对浮点值相等性测试的后续内容:“精度”常量是否有标准名称?.
对于相等,有一个非常相似的问题Double.Epsilon
,大于、小于、小于或等于、大于或等于。
众所周知,两个浮点值x和y的相等性测试应该看起来更像这样(而不是简单的 =):
abs( x - y ) < epsilon ,其中epsilon是一个非常小的值。
如何选择epsilon的值?
显然,最好为epsilon选择一个尽可能小的值,以便为相等性检查获得尽可能高的精度。
例如,.NET 框架提供了一个常数System.Double.Epsilon
(= 4.94066 × 10 -324System.Double
),它表示大于零的最小正值。
但是,事实证明,这个特定值不能可靠地用作epsilon,因为:
0+
System.Double.Epsilon
≠ 01 +
System.Double.Epsilon
= 1 (!)
也就是说,如果我理解正确,因为该常数小于machine epsilon。
→ 这是正确的吗?
→ 这是否也意味着我可以可靠地使用epsilon := machine epsilon进行相等测试?
删除了这两个问题,因为上面链接的第二个 SO 问题已经充分回答了它们。
链接到维基百科的文章说,对于 64 位浮点数(即double
许多语言中的类型),机器 epsilon 等于:
2 -53或大约。0.000000000000000111(小数点后有 15 个零的数字)
→ 是否由此得出所有 64 位浮点值都保证精确到 14 位(如果不是 15 位)?