В качестве примера рассмотрим следующий цикл:
for (int i = start; i <= start + 1; i++)
Вы думаете, что он выполнит только две итерации? Но вспомните предыдущие уроки. Следующая декларация сделает цикл бесконечным:
int start = Integer.MAX_VALUE - 1;
Теперь задание...
Сделайте цикл бесконечным:
while (i == i + 1)
Я долго думал, но так и не нашел решения. Мне кажется, что ни одной итерации не будет произведено. Я просто не подумал про числа с плавающей запятой [IEEE-754]. Помните, чему нас учили в школе? ∞ + 1 = ∞! Вот ответ:
double i = Double.POSITIVE_INFINITY;
Фактически можно использовать любое большое число, например 1.0e40. Так тоже будет работать из-за погрешности. Итак, выводы:
- В Java возможно представить ∞ как число типа float или double. Многие удивляются, так как обычно используют целочисленную арифметику.
- Добавление маленького числа к большому может не изменить его. Это так же неожиданно, потому что обычная арифметика это не рассматривает.
- Компьютерная арифметика для чисел с плавающей точкой - это некоторая аппроксимация настоящей арифметики.