这是Testing for floating-point value equality: Is there a standard name for the “precision” constant?的后续.
有一个非常相似的问题 Double.Epsilon
for equality, greater than, less than, less than or equal to, greater than or equal to .
众所周知,对两个浮点值 x 和 y 的相等测试应该更像这样(而不是简单的 =):
abs( x - y ) < epsilon , where epsilon is some very small value.
如何选择 epsilon 的值?
显然最好为 epsilon 选择一个尽可能小的值,以获得最高可能的相等性检查精度。
例如,.NET 框架提供了一个常量
System.Double.Epsilon
(= 4.94066 × 10-324),表示最小的正数 System.Double
大于零的值。然而,事实证明这个特定值不能可靠地用作 epsilon,因为:
0 +
System.Double.Epsilon
≠ 01 +
System.Double.Epsilon
= 1 (!)
也就是说,如果我理解正确的话,因为该常数小于 machine epsilon .
→ 这是正确的吗?
→ 这是否也意味着我可以可靠地使用 epsilon := machine epsilon 进行相等性测试?
Removed these two questions, as they are already adequately answered by the second SO question linked-to above.
链接到维基百科的文章说,对于 64 位浮点数(即许多语言中的
double
类型),机器 epsilon 等于:2-53, or approx. 0.000000000000000111 (a number with 15 zeroes after the decimal point)
→ 是否由此得出所有 64 位浮点值都保证精确到 14(如果不是 15)位?
最佳答案
How to choose a value for epsilon?
简答:您取一个适合您的应用程序需求的小值。
长答案:没有人知道您的应用程序进行了哪些计算以及如何计算 准确 你期望你的结果是。由于舍入误差总和机器 epsilon 几乎总是太大,因此您必须选择自己的值。根据您的需要,0.01 就足够了,或者 0.00000000000001 或更少。
问题是,您真的想要/需要对浮点值进行相等测试吗 ?也许你应该重新设计你的算法。
关于language-agnostic - 机器 epsilon 的使用是否适合浮点相等性测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281237/