Если значение имеет тип 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
Вы знаете, что поплавок не имеет 16 цифр точности? –
Я пробовал «% .16f», и он отлично работал для числа 1.0/3.0. – Tibi
@Tibi: выражение '1.0/3.0' имеет тип' double'. –