Код OP не точно присвоение значения воспринимаемому. double
может представлять только конечный набор чисел. Он будет использовать ближайший представляемый double. Обычно double
может точно представлять , по крайней мере первые 15 значения десятичных цифр, или 110020030040050xxxx.xxxx
1100200300400500600.0000000001
лежит между двумя double
:
1100200300400500480
и
1100200300400500608
.
// Add d1 to the closest representable double. This turns out to be _exactly
// 1100200300400500608
double d1 = 1100200300400500600.0000000001;
double d2 = 1100200300400500600.0000000001;
// adding those 2 result in the _exact
// 2200400600801001216
double d3 = d1 + d2;
// To print to 10 decimal places
printf("%.10f", d3);
// 2200400600801001216.0000000000
С типичной плавающей точкой, чтобы напечатать значение точно используйте
printf("%a\n", d3);
Для печати double
в десятичной системе счисления с sufficient accuracy различать все double
, используйте
printf("%.e\n", DBL_DECIMAL_DIG - 1, d3);
Я пробовал '% f' и получил' 220040060080 1001216.0000000000'. –
Я бы рекомендовал использовать произвольную библиотеку точности. –
'double' в типичной среде (64-разрядный IEEE754) не способен хранить такое значение с высокой точностью. – MikeCAT