我正在寻找一种在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尝试将machEpsfloat扩展为double。但是,我不确定这是否是正确的陈述,或者是否有其他原因导致我得到两个不同的答案。

最佳答案

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

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

10-06 09:36