P в постоянной декларации
В java.lang.Double
имеются следующие объявления констант:
public static final double MAX_VALUE = 0x1.fffffffffffffP+1023;
public static final double MIN_NORMAL = 0x1.0p-1022;
Что такое P
для? Разница в важности?
Я знаю L
, D
и F
, используемые для Long
s, Double
и Float
s, но никогда не видел P
раньше.
Ответы
Ответ 1
P
(или P
) указывает шестнадцатеричный литерал с плавающей запятой, где значение указано в шестнадцатеричном формате.
Вместо e
используется P
. Суффиксы d
и f
, которые вы видели, ортогональны этому: оба 0x1.0p+2f
и 0x1.0p+2d
являются допустимыми литералами (один имеет тип float
, а другой имеет тип double
).
На первый взгляд может показаться, что префикс 0x
достаточен для идентификации литерала с шестнадцатеричной точкой с плавающей запятой, поэтому почему дизайнеры Java решили изменить букву от e
до P
? Это связано с тем, что e
является действительной шестнадцатеричной цифрой, поэтому сохранение этого приведет к разбору парсинга. Рассмотрим:
0x1e+2
Является ли это шестнадцатеричным double
или суммой двух целых чисел, 0x1e
и 2
? Когда мы меняем e
на P
, двусмысленность разрешается:
0x1p+2
Ответ 2
Синтаксис p
, если используется для определения двойного литерала в шестнадцатеричном формате. Это полезно, когда вы хотите определить его точное представление, но не полезно в общем коде, потому что вы хотите, чтобы double был десятичным значением, а не шестнадцатеричным.
Ответ 3
Это шестнадцатеричный литерал с плавающей запятой, а синтаксис: sign * 0x * importantand * p * exponent. Смотрите blog для объяснения.
Ответ 4
Он используется для обозначения шестнадцатеричного литерала с плавающей запятой.
Литерал с плавающей запятой имеет следующие части: часть целого числа, десятичная или шестнадцатеричная точка (представлена периодом ASCII символ), дробная часть, показатель степени и суффикс типа. число с плавающей запятой может быть записано либо как десятичное значение, либо как шестнадцатеричное значение. Для десятичных литералов показатель экспоненты, если присутствует, равен обозначенный буквой A или буквой ASCII, а затем необязательно подписанной целое число. Для шестнадцатеричных литералов показатель всегда требуется и обозначается буквой ASCII p или P, а затем необязательно целое число со знаком.
Из http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#230798