C float или double в спецификаторе формата printf и функции pow
#include <stdio.h>
#include <math.h>
int main(void){
printf("%lf\n", pow(1.0, 2.0));
printf("%f\n", pow(1.0, 2.0));
return 0;
}
Первый printf()
дает вывод 0.000000
но второе printf()
дает вывод 1.000000
, Зачем?
Использование кодовых блоков в Windows 7 64 бит.
Использование команды gcc для компиляции дает мне.exe, который выводит 1.000000 для обоих операторов.
Если я скомпилирую нажатие клавиши F9 на кодовых блоках, я получу 0,000000 для первого оператора и 1,000000 для второго.
Наконец, если я удалю #include <stdio.h>
из исходного кода в Codeblocks, все дают мне 1,000000 (без предупреждений или ошибок).
1 ответ
Ваш код должен напечатать одинаковое значение для обеих строк в компиляторе C99 или C11. Все float
аргументы printf
всегда преобразуются в double
, а также %lf
а также %f
оба делают одно и то же (распечатать double
).
В стандарте C89 %lf
Спецификатор неопределенного поведения и double
s должен быть напечатан только с %f
, Так что, возможно, вы используете старый компилятор, который не поддерживает стандарт C99.
Соответствующие разделы стандартов, касающиеся %lf
:
С99, 7.19.6.1/7:
l (ell) [...] не влияет на следующий спецификатор преобразования a, A, e, E, f, F, g или G.
С89, 4.9.6.1:
[...] необязательный l (ell), указывающий, что следующий спецификатор преобразования d, i, o, u, x или X применяется к аргументу long int или unsigned long int; необязательный l, указывающий, что следующий n спецификатор преобразования применяется к указателю на длинный аргумент int; [...] Если h, l или L появляются с любым другим спецификатором преобразования, поведение не определено.