首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >机器Epsilon

机器Epsilon
EN

Stack Overflow用户
提问于 2014-02-06 16:13:53
回答 3查看 4.5K关注 0票数 5

我正在研究一种简单的方法来近似Java中的Machine:

代码语言:javascript
复制
float machEps = 1.0f;

do
    machEps /= 2.0f;
while ((float) (1.0 + (machEps / 2.0)) != 1.0);

System.out.println( machEps);

这将返回:

代码语言:javascript
复制
1.1920929E-7

但是,当我在float循环中移除到while的转换时:

代码语言:javascript
复制
float machEps = 1.0f;

do
   machEps /= 2.0f;
while ( (1.0 + (machEps / 2.0)) != 1.0);

System.out.println( machEps);

我得到:

代码语言:javascript
复制
2.220446E-16

我不太清楚为什么is....my 猜测是在第二种情况下,Java试图将machEpsfloat扩展到double。然而,我不确定这是否是一个准确的陈述,或是否有另一个原因,我得到了两个不同的答案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-06 16:15:57

1.02.0double的。

doubles和floats之间的算术将隐式地将floats转换为doubles

您需要通过在所有文本中添加float后缀来强制整个表达式使用f

票数 7
EN

Stack Overflow用户

发布于 2014-02-06 16:20:54

你在找java.lang.Math.ulp

返回参数的ulp的大小。一个双值的ulp是这个浮点值和第二个更大的值之间的正距离。

票数 3
EN

Stack Overflow用户

发布于 2014-02-06 16:19:46

使用Math.nextUp(1.0f),您可以很容易地找到严格大于1.0的最小浮点数。

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

https://stackoverflow.com/questions/21608161

复制
相关文章

相似问题

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