Вопрос

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

Код:

#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 ...
Это было полезно?

Решение

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

Другие советы

Из Manpage PrintF:

l (ell) Следующее целовое преобразование соответствует длинному INT или unsigned int int int, или следующее N преобразование соответствует указателю на аргумент длинного int, либо следующее CROVICE C соответствует аргументу Wint_T или следующее конвертацию Соответствует указателю на аргумент WCRA_T.

и

Преобразование LA после A, A, E, E, F, F, G или G соответствует длинному двойному аргументу. (C99 допускает% lf, но susv2 не делает.)

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

Редактировать: Некоторые дальнейшие исследования, по-видимому, указывают на то, что Mingw использует время выполнения MSVC / WIN32 (для таких вещей, как Printf) - какая карта длинного двойника. Таким образом, смешивая компилятор (как GCC), который обеспечивает родную длинную двойную с временем выполнения, которое не кажется .. Будь беспорядком.

Да - для long double, вам нужно использовать %Lf (т.е. верхний регистр 'l').

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

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

Удали эту проблему, тестируя длинные удваивания, а увы я наткнулся на решение! Вы должны составить свой проект с -d__jese_mingw_ansi_stdio:

Джейсон Хантли @ Centurian /home/developer/dependonds/python-2.7.3/test $ gcc main.c

Джейсон Хантли @ Centurian /home/developer/dependonds/python-2.7.3/test $ a.exe c = 0,000000

Jason Huntley @ Centurian /home/developer/dependonds/python-2.7.3/test $ gcc main.c -d__ийте_mingw_ansi_stdio

Джейсон Хантли @ Centurian /home/developer/dependonds/python-2.7.3/test $ a.exe c = 42.000000

Код:

Jason Huntley@centurian /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;
}

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

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

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

$ GCC Source.c $ GCC -Wall Source.costrise.coall.C: в функции `Main` Source.c: 5: Предупреждение: Формат «% le» ожидает типа `Double`, но аргумент 3 имеет тип` Long Double`

Функция PrintF и Scanf в C / C ++ используются библиотека Microsoft C, и эта библиотека не поддерживает 10 байт длинной двойной. Таким образом, когда вы используете функцию PrintF и SCANF в своем C / C ++, чтобы распечатать длинную двойную в качестве вывода и предпринять некоторую вход в течение длительного двойного, он всегда даст вам неправильный результат.

Если вы хотите использовать Long Double, вам необходимо использовать функцию «__mingw_Printf» и функцию «__mingw_scanf» вместо printf и Scanf. Он имеет поддержку для 10 байтов длинных двойных.

Или вы можете определить два макроса, как это: «#define printf __mingw_printf» и "#define scanf __mingw_scanf"

Используйте стандартный формат для длительного двойного:% LF

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top