language-agnostic - 机器 epsilon 的使用是否适合浮点相等性测试?

标签 language-agnostic floating-point epsilon precision

这是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 ≠  0

1  + 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/

相关文章:

c++ - 用C++实现Matlab的eps(x)函数

c++ - float 错误。 c++怎么知道0.99999982是1?

language-agnostic - 查找图中的所有完整子图

Python 从 float 中获取最低有效数字(不使用字符串操作)

language-agnostic - 我应该编写自己的论坛软件吗?

Excel将我的数字变成 float

Python - 如何将 float 向下舍入到 1 位有效数字

c++ - 为什么我的 double 可以包含低于机器 epsilon 的值?

language-agnostic - 复杂性(初学者问题)

language-agnostic - 将EBNF转换为BNF