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. Почему?

Использование Codeblocks в 64-разрядной версии Windows 7.

Использование команды gcc для компиляции дает мне .exe, который выводит 1.000000 для обоих операторов.

Если я компилирую, нажимая F9 на Codeblocks, я получаю 0,000000 для первого оператора и 1,000000 для второго.

Наконец, если я удалю #include <stdio.h> из исходного кода в Codeblocks, все выдадут мне 1.000000 (без предупреждений или ошибок).


person AlexQualcosa    schedule 21.12.2017    source источник
comment
Не в ideone: ideone.com/SRmfgd   -  person Johnny Mopp    schedule 21.12.2017
comment
Для printf это не имеет значения, "%f" и "%lf" равны, так как оба ожидают double аргумент. Является ли код, который вы показываете, настоящим кодом, который вы тестировали? Создайте минимальный, полный и проверяемый пример, а затем скопируйте и вставьте его в вопрос.   -  person Some programmer dude    schedule 21.12.2017
comment
Не могу воспроизвести.   -  person Stephan Lechner    schedule 21.12.2017
comment
Как именно вы компилируете?   -  person dbush    schedule 21.12.2017
comment
Обновил мой код, скомпилировав из Codeblocks, нажав F9   -  person AlexQualcosa    schedule 21.12.2017
comment
Я запустил его на Codeblocks в 64-разрядной версии Windows 10 и получил вывод 1.000000 для обоих printf() imgur.com/a/iYo5p< /а>   -  person Aditi Rawat    schedule 21.12.2017
comment
code::blocks не является компилятором   -  person phuclv    schedule 21.12.2017
comment
Использование команды gcc для компиляции дает мне .exe, который выводит 1.000000 для обоих операторов. если я компилирую, нажимая F9 на Codeblocks, я получаю 0,000000 для первого оператора и 1,000000 для второго. Наконец, если я удалю #include ‹stdio.h› из исходного кода в Codeblocks, все дадут мне 1.000000.   -  person AlexQualcosa    schedule 21.12.2017
comment
Какой компилятор использует CodeBlocks?   -  person interjay    schedule 21.12.2017
comment
Я вижу Cygwin gcc   -  person AlexQualcosa    schedule 21.12.2017


Ответы (1)


Ваш код должен выводить одно и то же значение для обеих строк компилятора C99 или C11. Все аргументы float для printf всегда преобразуются в double, а %lf и %f делают одно и то же (выведите double).

В стандарте C89 спецификатор %lf является неопределенным поведением, и doubles следует печатать только с %f. Так что, возможно, вы используете старый компилятор, который не поддерживает стандарт C99.

Соответствующие разделы стандартов, касающиеся %lf:

C99, 7.19.6.1/7:

l (ell) [...] не влияет на следующий за ним спецификатор преобразования a, A, e, E, f, F, g или G.

C89, 4.9.6.1:

[...] необязательный l (ell), указывающий, что следующий спецификатор преобразования d , i , o , u , x или X применяется к аргументу long int или unsigned long int; необязательный l, указывающий, что следующий спецификатор преобразования n применяется к указателю на аргумент типа long int; [...] Если h , l или L появляется с любым другим спецификатором преобразования, поведение не определено.

person interjay    schedule 21.12.2017