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.