Как изменить double по наименьшему приращению


8 принят

Общая идея состоит в том, чтобы сначала преобразовать двойное в свое длинное представление (используя, doubleToLongBitsкак вы это сделали getRealBinary), увеличить его на 1, и, наконец, преобразовать новый длинный назад в double, через который он представляет longBitsToDouble.

EDIT: Java (с 1.5) обеспечивает Math.ulp(double), что я предполагаю , что вы можете использовать для вычисления следующего более высокого значения , непосредственно следующим образом: x + Math.ulp(x).


Числа с плавающей запятой не распределяются равномерно по числовой строке, как целочисленные. Они более плотно упакованы около 0 и очень далеко друг от друга, когда вы приближаетесь к бесконечности. Поэтому нет постоянной, которую вы можете добавить к числу с плавающей запятой, чтобы перейти к следующему номеру с плавающей запятой.


4

Ваш код плохо сформирован. Вы пытаетесь добавить минимальное двойное значение и ожидаете, что результат будет отличаться от исходного. Проблема в том, что double.MinValue настолько мал, что результат округлен и не затрагивается.

Предлагаемое чтение: http://en.wikipedia.org/wiki/Machine_epsilon

В статье в Википедии есть код Java. Эпсилон по определению является наименьшим числом, таким как (X + eps * X! = X), а eps * X называется «относительным-эпсилон»


2

Поскольку Java 1.8 java.lang.Math.nextUp(double)выполняет именно то, что вы хотите. Существует и противоположное java.lang.Math.nextDown(double).


0

Если вы хотите использовать класс BigDecimal, есть и BigDecimal.ulp()метод.

Java, двойной, IEEE-754,

java,double,ieee-754,

7

Ответов: 5


8 принят

Общая идея состоит в том, чтобы сначала преобразовать двойное в свое длинное представление (используя, doubleToLongBitsкак вы это сделали getRealBinary), увеличить его на 1, и, наконец, преобразовать новый длинный назад в double, через который он представляет longBitsToDouble.

EDIT: Java (с 1.5) обеспечивает Math.ulp(double), что я предполагаю , что вы можете использовать для вычисления следующего более высокого значения , непосредственно следующим образом: x + Math.ulp(x).


Числа с плавающей запятой не распределяются равномерно по числовой строке, как целочисленные. Они более плотно упакованы около 0 и очень далеко друг от друга, когда вы приближаетесь к бесконечности. Поэтому нет постоянной, которую вы можете добавить к числу с плавающей запятой, чтобы перейти к следующему номеру с плавающей запятой.


4

Ваш код плохо сформирован. Вы пытаетесь добавить минимальное двойное значение и ожидаете, что результат будет отличаться от исходного. Проблема в том, что double.MinValue настолько мал, что результат округлен и не затрагивается.

Предлагаемое чтение: http://en.wikipedia.org/wiki/Machine_epsilon

В статье в Википедии есть код Java. Эпсилон по определению является наименьшим числом, таким как (X + eps * X! = X), а eps * X называется «относительным-эпсилон»


2

Поскольку Java 1.8 java.lang.Math.nextUp(double)выполняет именно то, что вы хотите. Существует и противоположное java.lang.Math.nextDown(double).


0

Если вы хотите использовать класс BigDecimal, есть и BigDecimal.ulp()метод.

Java, двойной, IEEE-754,
Похожие вопросы