在 C# 中哪里可以找到机器 epsilon?
机器 epsilon 被规范地定义为与 1 相加得到的结果与 1 不同的最小数字。
有一个 Double.Epsilon
但名称非常具有误导性:它是可表示的最小(非规范化)Double
值,因此对于任何类型的数字编程都是无用的。
我想获得 Double
类型的 true epsilon,这样就不必将容差硬编码到我的程序中。我该怎么做?
The machine epsilon is canonically defined as the smallest number which added to one, gives a result different from one.
There is a Double.Epsilon
but the name is very misleading: it is the smallest (denormalized) Double
value representable, and thus useless for any kind of numeric programming.
I'd like to get the true epsilon for the Double
type, so that not to have to hardcode tolerances into my program. How do I do this ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
它(在我的机器上):
您可以轻松计算它:
编辑:
我计算了 2 倍 epsilon,现在它应该是正确的。
It's(on my machine):
You can easily calculate it:
Edited:
I calcualted 2 times epsilon, now it should be correct.
Math.NET 库定义了一个 Precision 类,具有 DoubleMachineEpsilon 属性。
你可以查一下他们是怎么做的。
根据它是:
所以根据这个来源,它是
1,11022302462516E-16
。The Math.NET library defines a Precision class, which has a DoubleMachineEpsilon property.
You could check how they do it.
According to that it is:
So it is
1,11022302462516E-16
according to this source.只需对值进行硬编码:
或使用二的幂:
或使用您的定义(或多或少):
并参见 维基百科:机器 epsilon。
Just hard-code the value:
or use the power of two:
or use your definition (more or less):
And see Wikipedia: machine epsilon.
LAPACK + DLAMCH,64 位 INTEL 处理器,C#:
LAPACK + DLAMCH, 64-bit INTEL processor, C#:
参考号Meonester 的惯例:
实际上,退出 do ... while 循环时 machEps 的值是 1+machEps == 1。
要获得机器 epsilon,我们必须通过在循环后添加以下内容来返回到先前的值:
machEps *= 2.0D;
这将返回 2.2204460492503131e-16,与 Microsoft 文档中有关 Double.Epsilon 的建议一致。
Ref. the routine in Meonester's:
Actually the value of machEps on exit from the do ... while loop is such that 1+machEps == 1.
To obtain the machine epsilon we must go back to the previous value, by adding the following after the loop:
machEps *= 2.0D;
This will return 2.2204460492503131e-16 in agreement with the recommendation in Microsoft's documentation for Double.Epsilon.