Я подозреваю, что преобразование 2.9999999999999997779553950749686919152736663818359374999999
чтобы это двоичное представление было бы поучительным. Это, вероятно, только 1 немного отличается
от истины 3.
Хорошее предположение, но без сигары.
Поскольку число FP двойной точности имеет 53 бита, последний номер FP перед 3 на самом деле
(точное): 2.999999999999999555910790149937383830547332763671875
Но почему это
2.9999999999999997779553950749686919152736663818359375
(и это точно, а не 49999 ...!)
что на выше , чем последний отображаемый блок? Завершают. Процедура преобразования (строка в число) просто правильно запрограммирована для округления ввода до следующего числа с плавающей запятой.
2.999999999999999555910790149937383830547332763671875
....... (значения между, увеличение) -> округлить
2.9999999999999997779553950749686919152736663818359375
....... (значения между, увеличение) -> округлить до 3
3
Вход преобразования должен использовать полную точность. Если число ровно половина между
эти два числа fp (то есть 2.9999999999999997779553950749686919152736663818359375)
округление зависит от установленных флагов. Округление по умолчанию округлено до четного, что означает, что число будет округлено до следующего четного числа.
Теперь
3 = 11. (двоичный)
2.999 ... = 10.11111111111 ...... (двоичный код)
Все биты установлены, число всегда нечетное. Это означает, что точное половинное число будет округлено, так что вы получите странный период ..... 49999, потому что он должен быть меньше точной половины, чтобы ее можно было отличить от 3.