Che cosa significano questi tre speciali valori in virgola mobile: infinito positivo, infinito negativo, NaN?

StackOverflow https://stackoverflow.com/questions/1007586

Domanda

Come possiamo usarli nei nostri codici e cosa causerà NaN (non un numero)?

È stato utile?

Soluzione

Questo può essere un buon riferimento se vuoi saperne di più sul floating numeri di punti in Java.

L'Infinito positivo è un numero positivo così grande che non può essere rappresentato normalmente. L'Infinito negativo è un numero negativo così grande che non può essere rappresentato normalmente. NaN significa " Not a Number " e risulta da un'operazione matematica che non produce un numero come dividere 0 per 0.

In Java, le classi Double e Float hanno entrambe costanti per rappresentare tutti e tre i casi. Sono POSITIVE_INFINITY, NEGATIVE_INFINITY e NaN.

Inoltre considera questo:

double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN

Matematicamente, tutti possono vedere che è 0. Ma per la macchina, è un "Infinito" - " Infinity " (dello stesso rango), che è davvero NaN.

Altri suggerimenti

  • L'infinito positivo significa andare all'infinito nella direzione positiva - andare in valori sempre più grandi nella direzione positiva.
  • L'infinito negativo significa andare all'infinito nella direzione negativa - andare in valori sempre più grandi nella direzione negativa.
  • Not-a-number (NaN) è qualcosa che non è definito, come il risultato di 0/0 .

E le costanti dalla specifica del Classe float :

Ulteriori informazioni sono disponibili nella pagina IEEE-754 in Wikipedia .

Ecco un piccolo programma per illustrare le tre costanti:

System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);

Output:

NaN
Infinity
-Infinity
  • 1/0 si tradurrà in infinito positivo.
  • 0/0 comporterà Nan. Puoi usare NaN come qualsiasi altro numero, ad es .: NaN + NaN = NaN, NaN + 2.0 = NaN
  • -1/0 comporterà l'infinito negativo.

Infinito (in java) significa che il risultato di un'operazione sarà un numero positivo o negativo così grande che non può essere rappresentato normalmente.

L'idea è di rappresentare numeri speciali che possono derivare naturalmente dalle operazioni su "normale". numeri. Potresti vedere l'infinito (sia positivo che negativo) come "overflow" della rappresentazione in virgola mobile, con l'idea che almeno in alcune condizioni, avere un tale valore restituito da una funzione dia ancora risultati significativi. Hanno ancora alcune proprietà di ordinamento, ad esempio (quindi non avvitano le operazioni di ordinamento, ad esempio).

Nan è molto particolare: se x è Nan, x == x è falso (questo è in realtà un modo per testare nan, almeno in C, di nuovo). Questo può essere abbastanza confuso se non sei abituato alle peculiarità in virgola mobile. A meno che non facciate un calcolo scientifico, direi che far tornare Nan da un'operazione è un bug, almeno nella maggior parte dei casi che mi viene in mente. Nan può venire per varie operazioni: 0/0, inf - inf, inf / inf, 0 * inf. Anche Nan non ha alcuna proprietà per l'ordinazione.

Puoi usarli come qualsiasi altro numero:

per esempio:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
  

L'Infinito positivo è un numero positivo così grande che non può essere   rappresentato normalmente. L'infinito negativo è un numero negativo così grande   che non può essere rappresentato normalmente. NaN significa " Not a Number " e   risulta da una operazione matematica che non produce un numero -   come dividere 0 per 0.

questa non è una risposta completa (o non sufficientemente chiarita) - considera questo:

double a = Math.pow(10,600) - Math.pow(10,600); //==NaN

matematicamente tutti possono vedere che è 0. ma per la macchina è un "Infinito" - La strega "infinito" (dello stesso ordine) è davvero NaN ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top