2011-12-22 15 views
31

W java.lang.Double, istnieją następujące stałe deklaracje:P w ciągłym deklaracji

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

Co jest P za? Czy różnica w przypadku jest ważna?

Jestem świadomy L, D i F wykorzystywane do Long s, Double s oraz Float s, ale nigdy nie widziałem P wcześniej.

+0

Pętla szesnastkowa, być może? –

+0

"p" dla "moc" (?) Jako "e" może być źle rozumiane jako symbol szesnastkowy (?) – moala

Odpowiedz

25

Numer P (lub p) wskazuje heksadecymalnie floating-point literal, gdzie znaczeniezm jest określone w postaci heksadecymalnej.

Zamiast e używany jest kod p. Sufiksy d i f, które widziałeś, są ortogonalne: zarówno 0x1.0p+2f, jak i są poprawnymi literałami (jeden jest typu float, a drugi jest typu double).

Na pierwszy rzut oka może się wydawać, że prefiks 0x wystarczy do zidentyfikowania literału zmiennoprzecinkowego, dlaczego więc projektanci Javy zdecydowali się zmienić literę z e na p? Jest to związane z tym, że e jest poprawną cyfrą heksadecymalną, więc zachowanie jej spowodowałoby niejednoznaczność analizy. Rozważmy:

0x1e+2 

Czy to hex double lub sumy dwóch liczb całkowitych, 0x1e i 2? Kiedy zmienić e do p, dwuznaczność jest rozwiązany:

0x1p+2 
5

Składnia p jeżeli są wykorzystywane do definiowania podwójne dosłowny w hex. Jest to użyteczne, gdy chcesz zdefiniować jego dokładną reprezentację, ale nie jest użyteczne w ogólnym kodzie, ponieważ chcesz, aby podwójne było wartością dziesiętną, a nie pewnym wzorem szesnastkowym.

2

Służy do oznaczenia literału szesnastkowego zmiennoprzecinkowego.

zmiennoprzecinkowym dosłownym składa się z następujących części: całe numer części dziesiętną albo szesnastkowym punkt (reprezentowany przez okres ASCII znak), część frakcyjnej wykładnikiem oraz typ sufiksu. Numer zmiennoprzecinkowy może być zapisany jako wartość dziesiętna lub jako wartość heksadecymalna . W przypadku literałów dziesiętnych wykładnik, jeśli występuje, jest oznaczony literą e lub E w kodzie ASCII, a następnie opcjonalnie podpisaną liczbą całkowitą . W przypadku heksadecymalnych literałów wykładnik jest zawsze wymagany, a jest oznaczone literą ASCII p lub P, a następnie opcjonalną liczbą całkowitą ze znakiem ze znakiem .

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

3

Jest to szesnastkowy zmiennoprzecinkowej dosłowny, a składnia jest: znak * 0x * mantysy * p * wykładnik. Zobacz to blog, aby uzyskać wyjaśnienie.

Powiązane problemy