Почему в этой программе на Си не удваивается хранение / печать более точных значений, чем «плавание»? - PullRequest
0 голосов
/ 21 января 2019

Если я запускаю этот код:

float a=1.123456789;
printf("The float value is %f\n",a);
double b=1.123456789876543
printf("The double value is %lf",b);

Он печатает:

Значение с плавающей запятой 1.123457

Двойное значение 1.123457

Первая строка понятна, поскольку точность с плавающей точкой составляет ~ 6 десятичных цифр. Но не должна ли вторая строка отображать больше цифр? Я использую Turbo C ++ 4.0 для Windows, если это поможет.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Значение, которое вы видите в обоих случаях, одинаково, поскольку в случае, если точность не указана, оно принимается равным 6.

Кроме того, согласно расширению аргумента по умолчанию, любой тип с плавающей запятой будет повышен до double, что также является требованием для спецификации преобразования %f.

Цитирование C11, глава §7.21.6.1, для спецификатора формата f, ( выделение мое )

Двойной аргумент должен быть преобразован в десятичную запись в стиле "[-] ddd.ddd", где количество цифр после символа радиуса равно спецификации точности. Если точность отсутствует, она должна быть принята за 6 .

Если вам нужно больше цифр после десятичной точки (больше точности), вам нужно явно указать значение для точности больше 6.

0 голосов
/ 21 января 2019

Спецификатор формата %f по умолчанию печатает 6 цифр точности.Если вы хотите напечатать больше цифр, вам нужно добавить точность в спецификатор формата:

float a=1.123456789;
printf("The float value is %.15f\n",a);
double b=1.123456789876543;
printf("The double value is %.15lf",b);

Вывод:

The float value is 1.123456835746765
The double value is 1.123456789876543
...