Pytanie printf i długie podwójne


Używam najnowszego gcc z Netbeans w systemie Windows. Dlaczego nie long double praca? Jest printf specyficzny %lf źle?

Kod:

#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;
}

Wydajność:

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 ...

44
2017-11-03 16:20


pochodzenie


bytes.com/topic/c/answers/... - gameboy
oczywiście jest problem z MinGW i długim podwójnym - gameboy
możliwy duplikat nie można poprawnie wydrukować długiej podwójnej litery w C - phuclv


Odpowiedzi:


Oprócz niewłaściwego modyfikatora, który port gcc do Windows? mingw używa biblioteki Microsoft C i wydaje mi się, że ta biblioteka nie ma wsparcia dla 80-bitowego long double (kompilator Microsoftu C używa 64-bitowego podwójnego z różnych powodów).


11
2017-11-03 16:35



tak masz rację - gameboy
bytes.com/topic/c/answers/... - gameboy


Ze strony printf:

l (ell) Następująca liczba całkowita   konwersja odpowiada długiej int   lub unsigned long int argument, lub   po konwersji n odpowiada   wskaźnik do długiego argumentu int, lub   po c                 konwersja odpowiada argumentowi wint_t lub następnemu s   konwersja odpowiada wskaźnikowi do   argument wchar_t.

i

L A po a, A, e, E, f, F,   g, lub konwersja G odpowiada a   długi podwójny argument. (C99 pozwala   % LF, ale SUSv2 nie.)

Więc chcesz %Le , nie %le

Edycja: Niektóre dalsze badania zdają się wskazywać, że Mingw używa środowiska wykonawczego MSVC / win32 (dla rzeczy takich jak printf) - które odwzorowuje długie podwójne na podwójne. Więc mieszanie kompilatora (takiego jak gcc), który zapewnia natywny długi double z runtime, który nie wydaje się być bałaganem.


39
2017-11-03 16:25



znalazłem linux.die.net/man/3/printf, ale% Lf lub% Le również nie działają - gameboy
Z jakiego kompilatora korzystasz w Netbeans w systemie Windows? - nos
najnowsze gcc i MinGW - gameboy


Tak dla long double, musisz użyć %Lf (tj., wielka litera "L").


33
2017-11-03 16:23





Jeśli używasz MinGW, problem polega na tym, że MinGW domyślnie używa I / O resp. funkcje formatowania z środowiska wykonawczego Microsoft C, które nie obsługuje 80-bitowych liczb zmiennoprzecinkowych (long double == double w kraju Microsoft).

Jednak MinGW zawiera także zestaw alternatywnych implementacji, które zrobić odpowiednio obsługuje długie duble. Aby z nich skorzystać, należy poprzedzić nazwy funkcji za pomocą __mingw_ (na przykład. __mingw_printf). W zależności od charakteru projektu możesz również chcieć globalnie #define printf __mingw_printf albo użyj -D__USE_MINGW_ANSI_STDIO (który włącza wersje MinGW wszystkich printf-firma rodzinna).


20
2018-02-20 19:16





Miałem ten problem podczas testowania długich debli i niestety znalazłem poprawkę! Musisz skompilować swój projekt za pomocą -D__USE_MINGW_ANSI_STDIO:

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ gcc main.c

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ a.exe c = 0,000000

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ gcc main.c -D__USE_MINGW_ANSI_STDIO

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test   $ a.exe c = 42.000000

Kod:

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;
}

6
2018-03-15 20:19





W C99 modyfikator długości dla long double wydaje się L i nie l. man fprintf (lub odpowiednik dla systemu Windows) powinien poinformować cię o konkretnej platformie.


4
2017-11-03 16:23



Szkoda, że ​​jest w systemie Windows i prawdopodobnie nie ma strony podręcznika. W każdym razie, google dla "man printf" lub "printf strony podręcznika" lub coś podobnego. - Denilson Sá Maia


Jak powiedziano w innych odpowiedziach, właściwym specyfikatorem konwersji jest "%Lf".

Możesz włączyć ostrzeżenie o formacie, używając -Wformat (lub -Wall, co zawiera -Wformat) w wywołaniu gcc

$ gcc source.c
$ gcc -Wall source.c
source.c: W funkcji `main`:
source.c: 5: warning: format "% lf" oczekuje typu `double`, ale argument 2 ma typ` long double`
source.c: 5: warning: format "% le" oczekuje typu `double`, ale argument 3 ma typ` long double`
$

2
2017-11-03 16:34