Если значение имеет тип float
, вы, вероятно, не получите более 7 значащих цифр после десятичной точки. Если это тип double
, вы можете получить около 15. В зависимости от системы, long double
может быть не более точным, чем double
; на моем я получаю около 17 значащих цифр после десятичной точки.
В большинстве кодов с плавающей запятой используется тип double
; float
гораздо менее точен и часто не значительно быстрее.
Я немного удивлен, что вы получили 2.555556
, а не что-то вроде 2.555555582046508789
с форматом "%20.18lf"
.
Кстати, l
(строчная L) не обязателен. Для double
используется формат "%f"
, а для float
аргументы printf
повышаются до double
, поэтому "%f"
является правильным для float
и double
. Формат long double
- "%Lf"
.
Вот тестовая программа, которую я написал:
#include <stdio.h>
int main(void) {
const float f = 23.0/9.0;
const double d = 23.0/9.0;
const long double ld = 23.0L/9.0L;
printf("%20.18f\n%20.18f\n%20.18Lf\n", f, d, ld);
return 0;
}
и вывод, который я получил в моей системе:
2.555555582046508789
2.555555555555555358
2.555555555555555556