2011-12-22 11 views
31

En java.lang.Double, existen las siguientes declaraciones de constantes:P en constante declaración

public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; 
public static final double MIN_NORMAL = 0x1.0p-1022; 

¿Cuál es el P para? ¿La diferencia en caso es importante?

Soy consciente de la L, D y F utilizado para Long s, s Double y Float s, pero nunca han visto un P antes.

+0

¿Un flotador hexadecimal, quizás? –

+0

"p" para "poder" (?) Como "e" podría ser mal entendido como un símbolo hexadecimal (?) – moala

Respuesta

25

P (o p) indica un hexadecimal floating-point literal, donde el significado se especifica en hexadecimal.

Se utiliza el p en lugar del e. Los sufijos d y f que ha visto son ortogonales a esto: ambos 0x1.0p+2f y son literales válidos (uno es del tipo float y el otro es del tipo double).

A primera vista podría parecer que el 0x prefijo es suficiente para identificar un hexágono de punto flotante literal, ¿por qué han elegido los diseñadores de Java para cambiar la letra e-p? Esto tiene que ver con e siendo un dígito hexadecimal válido, por lo que mantenerlo daría lugar a una ambigüedad de análisis. Consideremos:

0x1e+2 

¿Es eso un hexágono double o la suma de dos números enteros, 0x1e y 2? Cuando cambiamos e-p, la ambigüedad se resuelve:

0x1p+2 
5

La sintaxis p si se utiliza para definir un doble literal en hexadecimal. Esto es útil cuando quiere definir su representación exacta, pero no es útil en el código general porque quiere que el doble sea un valor decimal en lugar de un patrón hexadecimal.

2

Se usa para indicar un literal de coma flotante hexadecimal.

A-coma flotante literal tiene las siguientes partes: una parte de todo el número, un punto decimal o hexadecimal (representado por un período ASCII de caracteres), una parte fraccionaria, un exponente, y un tipo de sufijo. Un número de coma flotante se puede escribir como un valor decimal o como un valor hexadecimal . Para literales decimales, el exponente, si está presente, es indicado por la letra ASCII eo E seguido de un entero opcionalmente firmado. Para literales hexadecimales, siempre se requiere el exponente y se indica con la letra ASCII p o P seguida de un entero con signo opcionalmente.

De http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#230798

3

Es un hexadecimal de punto flotante literal, y la sintaxis es la siguiente: * firmar 0x * * significand p * exponente. Vea esto blog para una explicación.

Cuestiones relacionadas