Sono stato un po 'curioso di questo. Math.random() fornisce un valore nell'intervallo [0.0,1.0). Quindi quale potrebbe essere il valore più grande che può dare? In altre parole, qual è il doppio valore più vicino a 1.0 che è inferiore a 1.0?Java: Math.random() Valore massimo (doppio solo meno di 1)
risposta
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.
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.
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
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
'System.out.println (Double.MinNormal)' fornisce 2.2250738585072014E-308. Piuttosto piccolo. – Justin
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.
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
@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
Oh, quindi 0.9999999999999999 è più vicino di 0.9999999999999998, perché 0.9999999999999998 viene troncato, quindi il doppio più vicino a 1 è 0.9999999999999999. – Justin