этот код
System.out.println(Double.MAX_VALUE+12345 == Double.MAX_VALUE);
System.out.println(Integer.MAX_VALUE+12345 == Integer.MAX_VALUE);
возвращается
true
false
Просьба уточнить эту разницу.
Правила те же, что и Double.MAX_VALUE
настолько велико, что 12345
примерно на 300 порядков (10 300 раз) меньше. Добавление числа, которое намного меньше Double.MAX_VALUE
не изменяет его значение. Добавление числа, которое имеет тот же порядок величины, будет иметь значение, хотя:
Double.MAX_VALUE + 1E300
дает положительный результат бесконечности, который не совпадает с Double.MAX_VALUE
(demo)
Поведение добавления к максимальному значению отличается от int и double двумя очень важными способами:
Double.MAX_VALUE
и следующим двойным меньше, чем около 2e292. Абсолютное значение разницы между 1.0 и ближайшим двойным меньше, чем около 1,1e-16.Integer.MAX_VALUE
в Integer.MAX_VALUE
завершается в Integer.MIN_VALUE
. Добавив достаточно большое положительное число, чтобы иметь значение Double.MAX_VALUE
результат Double.POSITIVE_INFINITY
, представленный одним из зарезервированных битовых шаблонов. int
основано на двоичной арифметике с двумя дополнениями. Он разработан как компактный, эффективный и позволяет очень быструю арифметику.
double
имеет больше предвзятости к функциональности. Часто арифметика с плавающей запятой занимает более одного машинного цикла. Он может позволить себе иметь зарезервированные битовые шаблоны, такие как бесконечности, которые требуют специальной обработки.