Как использование 'f' меняет / влияет на вывод?
f
в конце константы с плавающей запятой определяет тип и может влиять на значение.
4.567
- это константа с плавающей точкой типа и точности double
. A double
может представлять в точности 2 64 различных значений. 4.567
не один на них * 1 . Ближайшая альтернатива обычно равна
4.56700000000000017053025658242404460906982421875 // best
4.56699999999999928235183688229881227016448974609375 // next best double
4.567f
- константа с плавающей точкой типа и точности float
. A float
может представлять собой типично примерно 2 32 различных значений. 4.567
не один на них. Ближайшая альтернатива обычно равна
4.566999912261962890625 // best
4.56700038909912109375 // next best float
При передаче в printf()
как часть ...
дополнений float
преобразуется в double
с тем же значением.
Таким образом, возникает вопрос: какова ожидаемая разница в печати?
printf("%f",4.56700000000000017053025658242404460906982421875);
printf("%f",4.566999912261962890625);
Поскольку число цифр по умолчанию после десятичной точки для печати для "%f"
равно 6, выходные данные для обоих раундов:
4.567000
Чтобы увидеть разницу, напечатайте с большей точностью или попробуйте 4.567e10, 4.567e10f
.
45670000000.000000 // double
45669998592.000000 // float
Ваш вывод может немного отличаться от качества реализации.
* 1 C поддерживает множество кодировок с плавающей запятой. Обычным является binary64 . Таким образом, типичные значения с плавающей точкой кодируются как знак * двоичная дробь * 2 показатель степени . Даже простые десятичные значения, такие как 0,1, не могут быть представлены именно так.