机器Epsilon

时间:2014-02-06 16:13:53

标签: java precision

我正在寻找一种简单的方法来近似Java中的Machine Epsilon:

float machEps = 1.0f;

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

System.out.println( machEps);

返回:

1.1920929E-7

但是,当我在float循环中删除转化为while时:

float machEps = 1.0f;

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

System.out.println( machEps);

我明白了:

2.220446E-16

我不太确定这是为什么......我的 猜测 是在第二种情况下,Java尝试从{{{}}扩展machEps {1}}到float。但是,我不确定这是否是一个准确的陈述,或者是否还有其他原因可以得到两个不同的答案。

3 个答案:

答案 0 :(得分:6)

1.02.0double s。

doublefloat之间的算术会隐式将float转换为doubles

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

答案 1 :(得分:3)

您在寻找java.lang.Math.ulp吗?

  

返回参数的ulp大小。双值的ulp是此浮点值与接下来幅度较大的double值之间的正距离。

答案 2 :(得分:1)

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