long double c printf

46 gameboy [2010-11-03 19:20:00]

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

c gcc long-double printf

8 ответов

11 Решение AProgrammer [2010-11-03 19:35:00]

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

40 nos [2010-11-03 19:25:00]

Из справочной страницы printf:

l (ell) Следующее целое число преобразование соответствует длине int или unsigned long int, или следующая n конверсия соответствует указатель на длинный аргумент int или следуя c преобразование соответствует аргументу wint_t или следующему s преобразование соответствует указателю на аргумент wchar_t.

L Следующие 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 resp. функции форматирования из среды выполнения Microsoft C, которая не поддерживает 80-битные числа с плавающей запятой ( long double == double в стране Microsoft).

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

Была эта проблема с тестированием длинных удвоений, и, увы, я наткнулся на исправление! Вы должны скомпилировать свой проект с помощью -D__USE_MINGW_ANSI_STDIO:

Джейсон Хунтли @centurian/home/developer/dependencies/Python-2.7.3/test $gcc main.c

Джейсон Хунтли @centurian/home/developer/dependencies/Python-2.7.3/test $a.exe c = 0.000000

Джейсон Хунтли @centurian/home/developer/dependencies/Python-2.7.3/test $gcc main.c -D__USE_MINGW_ANSI_STDIO

Джейсон Хунтли @centurian/home/developer/dependencies/Python-2.7.3/test $a.exe c = 42.000000

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

2 pmg [2010-11-03 19:34:00]

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

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

-3 Ajay [2016-05-05 18:04:00]

Правильный диалог Printf в Java: —

Имеются посылки по A (div. 2) с использованием компилятором GNU C++, отличаются только в одной строке спецификатором вывода:

  • Sklyack
  • 8 лет назад
  • 15

Но обычно при выводе особо большую точность не требуют, потому можно считать всё в long double и выводить как double.

long double answ = 3.141592;
printf(«%Lf», answ);

Мы с этим приколом 2 года назад в Харькове столкнулись. Даже реджадж хотели требовать.

Не вышло ответить куда хотел.

Вот именно, в MS С++ sizeof(double)==8 , а в g++ sizeof(long double)>8, поэтому считаю g++ предпочтительней в задачах, где применяется арифметика с плавающей точкой.

Из известного мне. Участниками CF найдено 2 бага в gcc и 0 багов в MS VCPP. IDE для MS VCPP значительно лучше (можно VS приучить к gcc? не думаю). Таким образом, отправка на gcc стоит мне лишних пары минут для того, чтобы скомпилировать под ней решение (на стороне сервера, заодно с макс-тестом), и область применения ограничена близкими к ТЛ случаями (оптимизатор на gcc лучше).

P.S. сравнивать sizeof в разных С++ компиляторах — не по стандарту. sizeof(long double) == 2 может быть для 160-битного типа long double.

К сожалению, иногда два «лишних» байта long double иногда критичны в плане точности. Например я так и не сдал диаграмму Вороного на тимусе (задача 1369), как раз из-за того, что точности в даблах не хватает.
Касаемо глюков — в VCPP мы как-то наталкивались на веселый спецэффект, когда оптимизатор вообще вырезал функцию, обновляющую что-то в дереве отрезков. Так и не поняли, почему она ему не нравится.

I am using the latest gcc with Netbeans on Windows. Why doesn’t long double work? Is the printf specifier %lf wrong?

8 Answers 8

In addition to the wrong modifier, which port of gcc to Windows? mingw uses the Microsoft C library and I seem to remember that that this library has no support for 80bits long double (microsoft C compiler use 64 bits long double for various reasons).

From the printf manpage:

l (ell) A following integer conversion corresponds to a long int or unsigned long int argument, or a following n conversion corresponds to a pointer to a long int argument, or a following c conversion corresponds to a wint_t argument, or a following s conversion corresponds to a pointer to wchar_t argument.

L A following a, A, e, E, f, F, g, or G conversion corresponds to a long double argument. (C99 allows %LF, but SUSv2 does not.)

So, you want %Le , not %le

Edit: Some further investigation seems to indicate that Mingw uses the MSVC/win32 runtime(for stuff like printf) — which maps long double to double. So mixing a compiler (like gcc) that provides a native long double with a runtime that does not seems to .. be a mess.

Оцените статью
SoftLast
Добавить комментарий