我正在寻找一种简单的方法来近似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)
但是,当我float在while循环中删除转换时:
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.但是,我不确定这是否是一个准确的陈述,或者我还有另外一个原因可以得到两个不同的答案.
1.0并且2.0是double.
doubles和floats 之间的算术将隐式地将floats 转换为doubles.
您需要float通过向f所有文字添加后缀来强制整个表达式使用s .