Math.nextUp(arg)
总是与arg + Math.ulp(arg)
相同,还是我错过了什么?
System.out.println( 0.5 + Math.ulp(0.5)); // 0.5000000000000001
System.out.println( Math.nextUp(0.5)); // EXACTLY same
System.out.println( Math.nextAfter(0.5, 1000)); // EXACTLY same
但 -1,-2,-0.5是"规则"中唯一的排除(?)。到目前为止发现了以上。此外,差异始终只在最右边的十进制数字上打印:
System.out.println(Math.nextUp(-0.5)); // -0.49999999999999994
System.out.println(-0.5 + Math.ulp(-0.5)); // -0.4999999999999999
System.out.println(Math.nextUp(-1.0)); // -0.9999999999999999
System.out.println(-1.0 + Math.ulp(-1.0)); // -0.9999999999999998
System.out.println(Math.nextUp(-2.0)); // -1.9999999999999998
System.out.println(-2.0 + Math.ulp(-2.0)); // -1.9999999999999996
public static double ulp(double d)
返回参数的ulp大小。最后一个ulp单元 地方,双重值是之间的正距离 浮点值和接下来幅度的双值。
特定实数值的ulp是两者之间的距离 浮点值 包围该数值。
public static double nextUp(double d)
返回浮点值 在正无穷大方向上与d相邻。
根据API,Math.nextUp(arg)
和arg + Math.ulp(arg)
应该等同于任何arg(除了一些特殊值,如NaN,Infinity,MAX_VALUE,MIN_VALUE)......
答案 0 :(得分:3)
没有。考虑-1。 -1的ULP为2 -52 。区间(-2,-1)中的数字间隔为2 -52 。然而,区间(-1,-½)中的数字间隔为2 -53 因此,从-1开始的下一个数字是-1 + 2 -53 ,而不是-1 + 2 -52 。