поведение printf в C - PullRequest
       5

поведение printf в C

0 голосов
/ 02 ноября 2018

Я пытаюсь понять, в чем разница между:

printf("%f",4.567f);
printf("%f",4.567);

Как использование суффикса f меняет / влияет на выход?

1 Ответ

0 голосов
/ 02 ноября 2018

Как использование '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, не могут быть представлены именно так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...