机器Epsilon

But*_*ass 5 java precision

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

float machEps = 1.0f;

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

System.out.println( machEps);
Run Code Online (Sandbox Code Playgroud)

返回:

1.1920929E-7
Run Code Online (Sandbox Code Playgroud)

但是,当我floatwhile循环中删除转换时:

float machEps = 1.0f;

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

System.out.println( machEps);
Run Code Online (Sandbox Code Playgroud)

我明白了:

2.220446E-16
Run Code Online (Sandbox Code Playgroud)

我不太清楚为什么会这样....我的猜测是在第二种情况下Java尝试machEps从a 扩展float到a double.但是,我不确定这是否是一个准确的陈述,或者我还有另外一个原因可以得到两个不同的答案.

SLa*_*aks 6

1.0并且2.0double.

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

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