首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java双epsilon

Java双epsilon
EN

Stack Overflow用户
提问于 2014-08-07 11:07:17
回答 4查看 25.9K关注 0票数 23

我目前需要一个埃普西隆类型的double (首选是java库中的常量,而不是自己的实现/定义)

据我所见,DoubleMIN_VALUEMAX_VALUE作为静态成员。

为什么没有EPSILON

epsilon<double>是什么?

std::numeric_limits< double >::epsilon()有什么区别吗?

Epsilon:对于数据类型来说,最小值大于1的差值。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-07 11:13:21

我假设你指的是这个值上的错误。即.

如果是这样的话,那么在Java中,它被称为ULP (最后一个单元)。您可以通过使用java.lang.Math包和Math.ulp()方法找到它。见这里的javadocs

该值不是作为静态成员存储的,因为它将根据您所关注的double而有所不同。

编辑:根据OP对epsilon的定义,现在问题中,值为1.0的双倍的ULP为2.220446049250313E-16,表示为双倍。(即Math.ulp(1.0)的返回值。)

票数 24
EN

Stack Overflow用户

发布于 2017-06-27 15:58:09

通过编辑这个问题,解释EPSILON的含义,这个问题现在已经很清楚了,但最好指出以下几点:

我认为,最初的问题是由一个事实触发的,即在C中有一个常数DBL_EPSILON,它在标准头文件float.h中定义,它捕获了问题所指的内容。相同的标准头文件包含常量DBL_MINDBL_MAX的定义,它们显然分别对应于Double.MIN_VALUEDouble.MAX_VALUE。因此,很自然地假设,通过类推,Java还应该包含类似Double.EPSILON的定义,其含义与C中的DBL_EPSILON相同。更奇怪的是,C#确实包含一个定义double.EPSILON,但它有一个不同的含义,即在C中由常量DBL_MIN覆盖的定义和由Double.MIN_VALUE覆盖的定义。当然,这种情况可能会导致一些混淆,因为它使术语EPSILON模棱两可。

票数 3
EN

Stack Overflow用户

发布于 2015-07-30 10:20:17

不使用数学软件包:

代码语言:javascript
复制
Double.longBitsToDouble(971l << 52)        

这是2^-52 (971 =1023(双指数偏差)- 52,移位52是因为尾数存储在前52位上)。

它比Math.ulp(1.0)要快一点;

另外,如果您需要这样做来比较双值,那么有一篇非常有用的文章:https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25180950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档