Попробуйте это:
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
.
Это связано с тем фактом, что десятичные значения в компьютере не могут быть представлены точно, это всеприближение, которое зависит от количества битов, используемых для их представления, и это конечное количество - и между любыми двумя действительными числами существует бесконечное число вещественных чисел.