Come detto Chirag, i numeri interi generano eccezioni quando superano mentre i doppi non lo fanno. Non per diventare troppo specifici ma, fondamentalmente, i doppi in memoria sono memorizzati in modo molto simile alla notazione scientifica, in quanto sono alcuni interi * 2^(un po 'di potenza), e quindi non eccedono davvero ma moltiplicano per un 2^grande o piccolo (un po 'di potere) che perdono completamente la loro precisione. Quindi puoi pensare al doppio overflow come quando perdono completamente la loro precisione e vengono stampati come Infinity
o -Infinity
.
Quindi, è necessario verificare manualmente che si sia verificato un overflow verificando se il valore risultante è Double.POSITIVE_INFINITY
o Double.NEGATIVE_INFINITY
.
Ecco alcuni esempi di codice per mostrare quello che voglio dire:
public static void main(String[] args) throws Exception
{
double a = Double.MAX_VALUE; // highest possible double
double b = Double.MAX_VALUE; // highest possible double
if (Math.pow(a, b) == Double.POSITIVE_INFINITY || Math.pow(a, b) == Double.NEGATIVE_INFINITY)
{
throw new ArithmeticException("Double Overflow");
}
}
Penso che dovresti menzionare anche "LongMath.checkedPow". Penso che (anche se potrei sbagliarmi) è banale per 'int' perché ogni' int' può essere rappresentato come un double, quindi devi solo fare 'Math.pow (a, b)' e confrontare con 'Integer.MAX_VALUE '. –
@Louis Se utilizzo il 'BigInteger' non posso preoccuparmi della dimensione del numero ottenuto? – Claudia
@Claudia [BigInteger] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html): "numeri interi arbitrari di precisione ... Tutti i dettagli nella Specifica relativa l'overflow viene ignorato, dato che i BigInteger sono grandi quanto necessario per adattarsi ai risultati di un'operazione. " –