Для маленького проекта (проблема 10 Euler Проекта) я пытался подвести итог всех простых чисел ниже 2 миллионов. Таким образом, я использовал метод грубой силы и выполнил итерации от 0 до 2'000'000 и проверил, является ли число началом. Если это, я добавил он к сумме:
private int sum = 0;
private void calculate() {
for (int i = 0; i < 2000000; i++) {
if (i.isPrime()) {
sum = sum + i;
}
}
sysout(sum)
}
Результат этого вычисления 1179908154, но это неправильно. Таким образом, я изменил интервал на BigInteger, и теперь я получаю корректную сумму 142913828922. Очевидно, диапазон интервала был переполнен. Но почему Java не может сказать мне это? (например, исключением)
Потому что вполне возможно, что вы захотите, чтобы он вел себя традиционным целочисленным способом. Исключения зарезервированы для вещей, которые определенно и бесповоротно неправильны.
ETA : Из спецификации языка:
«Встроенные целочисленные операторы не указывают на переполнение или уменьшение какого-либо способа. Единственные числовые операторы, которые {{ 1}} может вызвать исключение (§11): оператор целочисленного деления / (§15.17.2) и оператор целочисленного остатка% (§15.17.3) , которые вызывают исключение ArithmeticException, если правый операнд равен нулю. "
( http://java.sun.com/docs/books/jls/second_edition/ html / typesValues.doc.html )
Помимо того, что говорит Джим, проверка таких условий, как переполнение, добавила бы снижение производительности к любым вычислениям, выполняемым с целыми числами, что сделало бы программы, выполняющие много вычислений, намного медленнее.
Другая причина в том, что вы можете сделать эту проверку самостоятельно очень легко и быстро.
if (sum+i < sum) {
throw new AritchmeticException();
}
должно сработать отлично, учитывая, что вы знаете, что i всегда положительно и меньше, чем Integer.MAX_VALUE.
Потому что в нашей профессии производительность важнее правильности. ; (
Использование BigInteger по умолчанию и только рассуждения о том, допустимо ли использовать long или int, если производительность является реальной проблемой, поможет избежать таких проблем.