Java 为什么MathnextUp不增加Double.MIN_值?

Java 为什么MathnextUp不增加Double.MIN_值?,java,math,floating-point,Java,Math,Floating Point,这是我从学校学到的 它基本上说: 返回正无穷方向上与d相邻的浮点值 特别是: 如果参数为零,则结果为Double.MIN_值 按照这种逻辑: Math.nextUpdouble x-x应始终为Double.MIN_值 所以我测试了一下: double d_up = Math.nextUp(0); System.out.println(d_up); // 1.401298464324817E-45 System.out.println(d_up ==

这是我从学校学到的

它基本上说:

返回正无穷方向上与d相邻的浮点值

特别是:

如果参数为零,则结果为Double.MIN_值

按照这种逻辑:

Math.nextUpdouble x-x应始终为Double.MIN_值

所以我测试了一下:

double d_up = Math.nextUp(0);
System.out.println(d_up);                        // 1.401298464324817E-45
System.out.println(d_up == Double.MIN_VALUE);    // false
System.out.println(Double.MIN_VALUE);            // 4.9E-324
它甚至不适用于零

为什么Math.nextUpdouble x不等于x+Double.MIN\u值?

试试这个:

double d_up = Math.nextUp(0d); // see the little `d` there :)
或者,它也可以工作:

double d_up = Math.nextUp(0.0); // `0.0` is a `double` literal
你需要通过一个替身才能使广告中的合同生效。现在你的测试成功了

4.9E-324
true
4.9E-324
要明确的是,您之前传递了一个float,所以这是执行的方法:

public static float nextUp​(float f)
。。。自然地,当int作为参数传递时,返回Float.MIN_值,因为它会自动转换为Float。底线:注意你的类型,确保投到正确的类型

关于你问题的最后一部分,没有理由认为这个方程会起作用:Math.nextUpx-x==Double.MIN_值。双倍数字的间隔不均匀,任意两个数字之间的距离不一定是double.MIN_值


这与计算机中的十进制值无法精确表示这一事实有关,它是一个近似值,取决于用于表示它们的位数,这是一个有限的量——在任意两个实数之间有无限个实数。

浮点数与此类似:0,1,2,3,4,5、6、7、8、9、10、20、30、40、50、60、70、80、90、100、200、300、400、500


“相邻”表示此列表中两个数字相邻。对于此列表中的数字,Math.nextupx-x可能产生1、10或100,具体取决于列表中x的位置。

您将获得Float.MIN\u值。此方法在数学类中重载。您正在调用Math.nextUpFloat x。我刚刚读了标题。。。所以你期望Float.MIN_值,但你仍然对结果感到惊讶?@Gendarme,但它似乎只适用于0.0,而不适用于其他值。我认为Math.nextUpdouble x==double x+double.MIN\u值Math.nextUpdouble x-double x应该始终是double.MIN\u值-只有当所有的double都是等距分布时,你的假设才是正确的,但它们当然不是。或者使用0.0作为双文本。但是Math.nextUpdouble x-double x==double.MIN\u值呢?看起来不是这样,只对0起作用。0@Code_Control_jxie0755我不明白为什么会这样,方法的契约说它只返回右边的下一个相邻值,为什么差值w.r.t.原始值应该是最小值?。这肯定是个小数字,但不是零。双精度值之间的距离不是固定不变的。@Code\U Control\U jxie0755双精度值之间的间隔不均匀。它们的大小越大,它们之间的距离就越远。这样想:如果它只是以Float.MIN_值递增,为什么会存在这种方法?