Math.nextUp(arg)总是与arg + Math.ulp(arg)相同?

时间:2018-02-05 14:53:40

标签: java floating-point

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)......

1 个答案:

答案 0 :(得分:3)

没有。考虑-1。 -1的ULP为2 -52 。区间(-2,-1)中的数字间隔为2 -52 。然而,区间(-1,-½)中的数字间隔为2 -53 因此,从-1开始的下一个数字是-1 + 2 -53 ,而不是-1 + 2 -52