Почему Math # nextUp не увеличивается на Double.MIN_VALUE? - PullRequest
0 голосов
/ 15 февраля 2019

Я узнал об этом из документации Java

В основном говорится, что:

Возвращает значение с плавающей точкой, смежное с d, в направлении положительногобесконечность.

и особенно:

Если аргумент равен нулю, результат равен Double.MIN_VALUE

При такой логике:

Math.nextUp(double x) - x всегда должно быть Double.MIN_VALUE.

Итак, я проверил это:

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.nextUp(double x) не равно x + Double.MIN_VALUE?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Числа с плавающей точкой похожи на это: 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.nextup(x) - x может выдавать 1, 10 или 100, в зависимости от того, где в списке x находится.

0 голосов
/ 15 февраля 2019

Попробуйте это:

double d_up = Math.nextUp(0d); // see the little `d` there :)

Или вот это тоже работает:

double d_up = Math.nextUp(0.0); // `0.0` is a `double` literal

Вам нужно пройти double , чтобы объявленный контракт работал,Теперь ваш тест работает!

4.9E-324
true
4.9E-324

Просто чтобы прояснить, вы уже проходили float раньше, поэтому был выполнен этот метод:

public static float nextUp​(float f)

... Иестественно, он возвращает Float.MIN_VALUE, когда 0 (int) передается в качестве параметра, потому что он автоматически приводится к float.Итог: помните о ваших типах, обязательно приведите правильное.

Что касается последней части вашего вопроса, нет причины, почему это уравнение должно работать: Math.nextUp(x) - x == Double.MIN_VALUE.double числа не разделены равномерно, «расстояние» между любыми двумя числами не обязательно Double.MIN_VALUE.

Это связано с тем фактом, что десятичные значения в компьютере не могут быть представлены точно, это всеприближение, которое зависит от количества битов, используемых для их представления, и это конечное количество - и между любыми двумя действительными числами существует бесконечное число вещественных чисел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...