2010-11-03 5 views
40

Я использую последний gcc с Netbeans в Windows. Почему не работает long double? Является ли спецификатор printf%lf неправильным?printf и long double

Код:

#include <stdio.h> 

int main(void) 
{ 
    float aboat = 32000.0; 
    double abet = 5.32e-5; 
    long double dip = 5.32e-5; 

    printf("%f can be written %e\n", aboat, aboat); 
    printf("%f can be written %e\n", abet, abet); 
    printf("%lf can be written %le\n", dip, dip); 

    return 0; 
} 

Выход:

32000.000000 can be written 3.200000e+004 
0.000053 can be written 5.320000e-005 
-1950228512509697500000000000000000000000000000000000000000000000000000000000000 
000000000000000000000000000000000000000000000000000000000000000000000000.000000 
can be written 2.725000e+002 
Press [Enter] to close the terminal ... 
+0

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3-a – gameboy

+0

явно есть проблема с MinGW и длинным двойным – gameboy

+0

возможный дубликат [не может правильно напечатать длинный двойник в C] (http://stackoverflow.com/questions/26296058/cant-print-correctly-a-long-double-in-c) –

ответ

9

В дополнении к неправильному модификатору, какой порт GCC для Windows? mingw использует библиотеку Microsoft C, и я, кажется, помню, что в этой библиотеке нет поддержки удвоения длительности 80 бит (для разных разработчиков Microsoft использует компилятор Microsoft для 64-разрядных бит).

+0

да, вы правы – gameboy

+0

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3- – gameboy

4

В C99 длина модификатора для long double, кажется L и не l. man fprintf (или эквивалент для окон) должен сообщить вам о вашей конкретной платформе.

+1

Жаль, что он на Windows, и он, вероятно, не имеет man-страницы. В любом случае, google для «man printf» или «printf manual page» или что-то в этом роде. –

30

Да - для long double необходимо использовать %Lf (т. Е. Верхний регистр «L»).

36

Из PRINTF страницы руководства:

л (ELL) Целые преобразование соответствует длинной Int или без знака длиной Int аргумент, или следующие п преобразование соответствует указатель на длинный int или , следующий за преобразованием c , соответствует аргументу wint_t, или следующее преобразование s соответствует указателю на аргумент wchar_t.

и

л Следующим а, А, Е, Е, F, F, г, или Г преобразование соответствует длинного двойного аргумента. (. C99 позволяет % LF, но SUSv2 не делает)

Итак, вы хотите %Le, не %le

Edit: Некоторые дальнейшие исследования, кажется, указывают, что Mingw использует/win32 выполнения MSVC (для вещей например printf), который отображает длинные двойные двойные. Поэтому смешивание компилятора (например, gcc), который обеспечивает собственный длинный двойной исполняемый файл, который не кажется ... бесполезным.

+0

Я нашел http://linux.die.net/man/3/printf, но% Lf или% Le тоже не работает – gameboy

+0

Какой компилятор вы используете с Netbeans в Windows? – nos

+0

последние gcc и MinGW – gameboy

2

Как было сказано в других ответах, правильный спецификатор преобразования - "%Lf".

Вы можете включить предупреждение формата с помощью -Wformat (или -Wall, который включает в себя -Wformat) в GCC вызова

 
$ gcc source.c 
$ gcc -Wall source.c 
source.c: In function `main`: 
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double` 
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double` 
$ 
20

Если вы используете MinGW, проблема в том, что по умолчанию MinGW использует I/O resp. функции форматирования из среды выполнения Microsoft C, которая не поддерживает 80-битные числа с плавающей запятой (long double == double на территории Microsoft).

Однако MinGW также поставляется с набором альтернативных вариантов реализации, которые do надлежащим образом поддерживают длинные парные разряды. Чтобы использовать их, префикс имен функций с __mingw_ (например, __mingw_printf). В зависимости от характера вашего проекта вы также можете захотеть глобально #define printf __mingw_printf или использовать -D__USE_MINGW_ANSI_STDIO (что позволяет использовать версии MinGW всех функций printf -семьи).

6

Имел этот вопрос, проверяя длинные удвоения, и, увы, я натолкнулся на исправление! Вы должны скомпилировать проект с -D__USE_MINGW_ANSI_STDIO:

Джейсоном Хантли @ Centurian /home/developer/dependencies/Python-2.7.3/test $ НКИ main

Джейсоном Хантли @ Centurian/дома /developer/dependencies/Python-2.7.3/test $ a.exe с = 0,000000

Джейсоном Хантли @ Centurian /home/developer/dependencies/Python-2.7.3/test $ НКИ main -D__USE_MINGW_ANSI_STDIO

Jason Huntle у @ Centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe с = 42,000000

Код:

Jason [email protected] /home/developer/dependencies/Python-2.7.3/test 
$ cat main.c 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    long double c=42; 

    c/3; 

    printf("c=%Lf\n",c); 

    return 0; 
} 
-1

Правильный Printf разговор в Java: -

double pi = Math.PI; 

    System.out.format("%f%n", pi);  // --> "3.141593" 
    System.out.format("%.3f%n", pi);  // --> "3.142" 
    System.out.format("%10.3f%n", pi); // --> "  3.142" 
    System.out.format("%-10.3f%n", pi); // --> "3.142" 
    System.out.format(Locale.FRANCE, 
        "%-10.4f%n%n", pi); // --> "3,1416" 

    Calendar c = Calendar.getInstance(); 
    System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" 

    System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" 

    System.out.format("%tD%n", c); // --> "05/29/06" 
Смежные вопросы