Domanda

In Java, (Numero / 0) genera un ArithmeticException mentre (Numero / 0.0) = Infinity. Perché accade questo?

È stato utile?

Soluzione

Poiché i numeri in virgola mobile IEEE-754 hanno una rappresentazione dell'infinito, mentre interi non lo fanno.

In altre parole, ogni configurazione di bit in int rappresenta un numero intero normale; valori in virgola mobile sono piuttosto più complicato con +/- l'infinito, "non un numero" valori (NaN), valori normalizzati, valori subnormali ecc.

Altri suggerimenti

Da qui

Lo standard a virgola mobile IEEE, supportato da quasi tutti i processori moderni, specifica che ogni operazione aritmetica in virgola mobile, compreso divisione per zero, ha un risultato ben definito. Lo standard supporta firmato a zero, così come l'infinito e NaN (non un numero). Ci sono due zeri, +0 (a zero positivo) e -0 (negativi zero) e questo elimina qualsiasi ambiguità nella divisione. In IEEE 754 aritmetica, un ÷ +0 è infinito positivo quando a è positivo, l'infinito negativo quando a è negativo, e NaN quando a = ± 0. I segni infinity cambiano quando dividendo per -0 al posto.

Integer divisione per zero è solitamente gestito in modo diverso da virgola mobile poiché non v'è alcuna rappresentazione intera per il risultato. Alcuni processori generano un'eccezione quando si tenta di dividere un numero intero per zero, anche se altri continueranno semplicemente e generare un risultato errato per la divisione. Il risultato dipende da come viene implementato divisione, e può essere sia nullo, o talvolta il più grande intero possibile.

Inoltre è possibile controllare il JLS che dice:


15.17.2 Divisione Operator D'altra parte, se il valore del divisore in una divisione di integer è 0, un ArithmeticException è gettato.

Il risultato di una divisione in virgola mobile è determinata dalla specifica di aritmetica IEEE: Se il risultato non è NaN, il segno del risultato è positivo se entrambi gli operandi hanno lo stesso segno, negativo se gli operandi hanno segni diversi.
Divisione di un valore finito diverso da zero da uno zero risultati in un'infinità firmato. Il segno è determinato dalla regola di cui sopra.

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