различная политика переполнения для Double и Integer. Почему?

1

этот код

System.out.println(Double.MAX_VALUE+12345 == Double.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+12345 == Integer.MAX_VALUE);

возвращается

true
false

Просьба уточнить эту разницу.

  • 0
    Это отличается от вопроса, который вы задали час назад, как?
  • 0
    @Boris Spider Я думал, что эта формулировка лучше для SO
Теги:
numbers
double
integer-overflow
double-precision

2 ответа

2
Лучший ответ

Правила те же, что и Double.MAX_VALUE настолько велико, что 12345 примерно на 300 порядков (10 300 раз) меньше. Добавление числа, которое намного меньше Double.MAX_VALUE не изменяет его значение. Добавление числа, которое имеет тот же порядок величины, будет иметь значение, хотя:

Double.MAX_VALUE + 1E300

дает положительный результат бесконечности, который не совпадает с Double.MAX_VALUE (demo)

  • 1
    Правила одинаковы - я думаю, что это неправильно, потому что после переполнения целочисленные значения переходят в отрицательное значение, а двойные - в бесконечность
1

Поведение добавления к максимальному значению отличается от int и double двумя очень важными способами:

  1. Разница между каждым int, кроме максимума, и его непосредственным преемником равна 1, независимо от величины. Разница между последовательными удвоениями увеличивается с увеличением. Например, абсолютное значение разницы между Double.MAX_VALUE и следующим двойным меньше, чем около 2e292. Абсолютное значение разницы между 1.0 и ближайшим двойным меньше, чем около 1,1e-16.
  2. Каждый 32-разрядный битовый шаблон представляет собой номер int. Некоторые из 64-битных битовых шаблонов зарезервированы в двойном для NaN и бесконечных значениях. Добавление одного Integer.MAX_VALUE в Integer.MAX_VALUE завершается в Integer.MIN_VALUE. Добавив достаточно большое положительное число, чтобы иметь значение Double.MAX_VALUE результат Double.POSITIVE_INFINITY, представленный одним из зарезервированных битовых шаблонов.

int основано на двоичной арифметике с двумя дополнениями. Он разработан как компактный, эффективный и позволяет очень быструю арифметику.

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

  • 0
    У меня есть вопрос: есть ли между Double.MAX_VALUE и Double.POSITIVE_INFINITY какое-либо число?
  • 0
    @gstackoverflow No. Однако, когда вы добавляете положительное число к Double.MAX_VALUE, результат округляется в соответствии с обычными правилами округления, что может привести к возвращению Double.MAX_VALUE. Если вы хотите исследовать эти проблемы, посмотрите Math.nextUP и Math.nextAfter.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню