Как указано Chirag, целые числа бросают исключения, когда они переполняются, а двойники - нет. Не для того, чтобы стать слишком конкретным, но, в основном, удвоения в памяти хранятся очень похожими на научную нотацию, поскольку они представляют собой целое число * 2^(некоторая мощность) и, следовательно, никогда не переполняются, а умножаются на такие большие или малые 2^некоторая власть), что они полностью теряют свою точность. Поэтому вы можете думать о двойном переполнении, когда они полностью теряют свою точность и печатаются либо как Infinity
, либо -Infinity
.
Итак, вам нужно будет вручную проверить, произошло ли переполнение, проверив, имеет ли результирующее значение Double.POSITIVE_INFINITY
или Double.NEGATIVE_INFINITY
.
Вот некоторые примеры кода, чтобы показать, что я имею в виду:
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");
}
}
Я думаю, вы также должны упомянуть 'LongMath.checkedPow'. Я думаю (хотя я мог ошибаться), это тривиально для 'int', потому что каждый' int' может быть представлен как double, поэтому вам просто нужно сделать 'Math.pow (a, b)' и сравнить с 'Integer.MAX_VALUE '. –
@Louis Если я использую 'BigInteger', я не могу беспокоиться о размере полученного числа? – Claudia
@Claudia [BigInteger] (https://docs.oracle.com/javase/8/docs/api/java/math/BigInteger.html): «целые числа произвольной точности ... Все детали в Спецификации, касающиеся переполнение игнорируется, так как BigIntegers сделаны настолько большими, насколько это необходимо для учета результатов операции ». –