2013-04-01 17 views

risposta

6

Java utilizza 64 bit IEEE-754 rappresentazione, in modo che il numero più vicino più piccolo di uno è teoricamente 3FEFFFFFFFFFFFFF in esadecimali, che è 0 per il segno, -1 per l'esponente e 1.9999999999999997 per il significato di 52 bit. Questo equivale a circa 0.9999999999999998.

Riferimenti: IEEE-754 Calculator.

+1

Che dire di 0.999999999999999999? ha lo stesso numero di cifre, ma ha un 9 invece di un 8 alla fine. Quando ho 'System.out.println (0,999999999999999999 - 0,9999999999999998)', ottengo: 1.1102230246251565E-16 – Justin

+1

@gangqinlaohu L'ultima cifra non è precisa. Ho troncato il numero ottenuto dalla calcolatrice IEEE-754 (vedi il link nella risposta) per ottenere il numero. La cifra successiva dopo 8 è anche 8, quindi se si applica l'arrotondamento, il risultato diventa 0,9999,99999999999. – dasblinkenlight

+1

Oh, quindi 0.9999999999999999 è più vicino di 0.9999999999999998, perché 0.9999999999999998 viene troncato, quindi il doppio più vicino a 1 è 0.9999999999999999. – Justin

0

Il valore positivo più piccolo di un doppio è Double.MIN_NORMAL. Quindi, il numero più grande inferiore a 1,0 è 1.0-Double.MIN_NORMAL.

Double.MIN_NORMAL è uguale a 2 -1022, quindi la risposta è ancora estremamente vicino a 1,0. Avresti per stampare il valore di 1.0-Double.MIN_NORMAL a 308 cifre decimali prima di poter vedere tutto tranne che un 9.

+2

Dispari, quando encase '1.0 - Double.MIN_NORMAL == 1.0' in un System.out.println, ottengo vero. Ma quando incoraggio 0.999999999999999999 in System.out.println, ottengo il falso. Quindi vuol dire che 0.9999999999999999 è il doppio più vicino a uno? – Justin

+0

Hum ... No, quindi, MIN_NORMAL si applica al valore _closest su zero_ È di genere il più piccolo errore possibile sui valori IEEE-754. Ma dal momento che ti sei mosso verso l'1, parte della precisione si perde! – mjv

+0

'System.out.println (Double.MinNormal)' fornisce 2.2250738585072014E-308. Piuttosto piccolo. – Justin

4

Il numero che si desidera viene restituito da Math.nextAfter(1.0, -1.0).

Il nome della funzione è un po 'improprio. Math.nextAfter(a, 1.0) restituisce il valore minimo doppia che è maggiore di a (cioè, il successivo valore dopo a), e Math.nextAfter(a, -1.0) restituisce il massimo valore che è inferiore a (cioè, il valore primaa).

Nota: un altro poster ha dichiarato: 1.0-Double.MIN_NORMAL. È sbagliato. 1.0-Double.MIN_NORMAL è esattamente uguale a 1.0.