Printf и длинные двойные
-
28-09-2019 - |
Вопрос
Я использую последние 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