Используемый вами формат с плавающей запятой имеет значение 53 бита. Это означает, что он может представлять числа как 53-разрядное целое число, умноженное или разделенное на степень два.
Когда 0.9999999999999999
преобразуется в этот формат, ближайшим представимым значением является (2 53 -1) / 2 53 , что в точности равно 0,999999999999999988897769753748434595763683319091796875. Обратите внимание, что числитель использует ровно 53 бита.
Когда вы добавляете 1, математический результат будет (2 54 -1) / 2 53 . Числитель будет иметь 54 бита. Это не может быть представлено в формате с плавающей точкой, поэтому оно должно быть округлено, чтобы соответствовать. Два ближайших представимых значения:
- (2 54 -2) / 2 53 = (2 53 -1) / 2 52 и
- (2 54 −0) / 2 53 = 2.
Они оба одинаково далеки от точного математического результата. Правило разрыва связей заключается в использовании значения с нулем в младшем бите его значения. (Несмотря на то, что здесь я представил значение и целое число как целое, это дробная часть в формате с плавающей запятой, поэтому числителю 1 соответствует двоичное число 1.000000… 000 2 . )
Таким образом, когда 1 добавляется к 0.9999999999999999
, вычисленный результат должен быть округлен до 2.