В данной программе, почему я получил разные результаты для каждого из printf
s?
#include <stdio.h>
int main()
{
float c = 4.4e10;
printf("%f\n", c);
printf("%f\n", 4.4e10);
return 0;
}
И это показывает следующий вывод:
44000002048.000000
44000000000.000000
4.4e10
этоdouble
константа, которая конвертируетсяfloat
в инициализацию,c
но сохраняетсяdouble
при передачеprintf
. Однако вам также может быть интересно узнать, что добавлениеf
суффикса делает егоfloat
константой: при печати4.4e10f
будет отображаться то же значение, что и при инициализацииc
в4.4e10f
. Отличиеfloat
констант отdouble
констант может быть важным для качественной работы с арифметикой с плавающей точкой.double
tofloat
в язык C? Или вы хотите знать, какие значения получаются в результате преобразования, то есть, какие последствия имеет преобразование? Или что-то другое?C
мы использовалиprintf("%f",x)
для afloat
иprintf("%lf",x)
для adouble
. Когда все изменилось? И как можно явно напечатать (одиночный)float
-printf("%hf",x)
??%lf
в printf - это то же самое, что и%f
.float
В переменном аргументе преобразуются вdouble
компиляторе, так же , какshort
получает преобразовано вint
.Ответы:
A
float
- это тип, который содержит 32-разрядное число с плавающей запятой, в то время как константа4.4e10
представляет собой adouble
, который содержит 64-разрядное число с плавающей запятой (т.е. число с плавающей запятой двойной точности)При назначении
4.4e10
наc
значение4.4e10
не может быть представлено точно (ошибка округления в качестве параметра называется мантисса), а наиболее возможное значение (44000002048) сохраняется. Когда он передаетсяprintf
, он переводится обратноdouble
, включая ошибку округления.Во втором случае значение представляет собой
double
целое время без сужения и расширения, и это тот случай, когда adouble
может точно представлять значение.Если это нежелательное поведение, вы можете объявить его
c
какdouble
более точный (но учтите, что в конечном итоге вы все равно достигнете пределов точности).источник
Вы фактически печатаете значения двух разных типов здесь.
В первом случае вы присваиваете значение переменной типа
float
. Точность afloat
составляет примерно 6 или 7 десятичных цифр, поэтому, если значение не может быть представлено точно, вы увидите ближайшее значение, которое может быть представлено этим типом.Во втором случае вы передаете константу,
4.4e10
которая имеет типdouble
. Этот тип имеет около 16 десятичных цифр точности, и значение находится в этом диапазоне, поэтому печатается точное значение.источник