Почему шаг между числами растёт

Обычные числа с плавающей точкой хранятся не как бесконечно точная запись всех цифр. Компьютер держит ограниченное число значащих двоичных разрядов и отдельно — порядок величины. Это похоже на научную запись: вместо длинного числа сохраняются его «основные цифры» и показатель степени.

Пока числа невелики, доступных разрядов хватает, чтобы различать соседние целые значения. Но с ростом порядка те же разряды распределяются по более широкому диапазону. Поэтому расстояние между числами, которые компьютер умеет хранить точно, увеличивается: рядом с огромным числом уже могут быть не все целые, а только каждое второе, затем каждое четвёртое и так далее.

Что происходит с прибавлением единицы

В распространённом формате двойной точности все целые числа точно представимы до 2⁵³ — это 9 007 199 254 740 992. На этой границе соседнее значение уже не обязательно помещается в доступные разряды. Поэтому операция `2⁵³ + 1` может дать снова `2⁵³`: результат округляется к ближайшему числу, которое формат способен сохранить. А `2⁵³ + 2` уже представимо.

Это не означает, что компьютер перестал выполнять сложение. Он выполнил его, но не смог записать точный результат в выбранном формате. Такое ограничение называют потерей точности с плавающей точкой. У целочисленных типов правила другие: например, при переполнении они могут перейти через предел диапазона, а не округлить результат.

Где это важно

Проблема заметна в программах, которые долго увеличивают большой счётчик, накапливают время или работают с крупными значениями при малых изменениях. Если очередной шаг меньше расстояния между соседними представимыми числами, значение на экране может не измениться вовсе. Поэтому для таких задач выбирают подходящий формат и следят не только за размером числа, но и за тем, насколько мелкие изменения нужно различать.