Frage

Ich bin mit dem neuesten gcc mit Netbeans unter Windows. Warum long double funktioniert nicht? Ist der printf Spezifizierer %lf falsch?

Code:

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

Ausgabe:

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 ...
War es hilfreich?

Lösung

Neben dem falschen Modifikator, welcher Port von gcc auf Windows? mingw nutzt die Microsoft-C-Bibliothek und ich mich zu erinnern, dass diese Bibliothek für 80bits keine Unterstützung hat long double (Microsoft C-Compiler verwenden 64 Bit lang doppelt aus verschiedenen Gründen).

Andere Tipps

Von der printf manpage:

  

l (ell) A folgende integer   Umwandlung entspricht einem long int   oder unsigned long int Argument oder eine   n folgende Umwandlung entspricht   ein Zeiger auf ein long int Argument oder ein   folgende c                 Umwandlung entspricht einem wint_t Argument, oder einem der folgenden s   Umwandlung entspricht einem Zeiger auf   Wchar_t Argument.

und

  

L A folgende a, A, E, E, F, F,   G oder G entspricht einer Wandlungs   long double-Argument. (C99 erlaubt   % LF, aber SUSv2 nicht.)

Also, Sie wollen %Le, nicht %le

Edit: Einige weitere Untersuchungen scheint darauf hinzudeuten, dass Mingw die MSVC / win32 Laufzeit verwendet (für Sachen wie printf) - die lange doppelte Karten zu verdoppeln. So ein Compiler Mischen (wie gcc), die ein native lange Doppel mit einer Laufzeit bereitstellt, die nicht für ein Durcheinander sein .. nicht scheint.

Ja - für long double, müssen Sie %Lf verwenden (das heißt, in Großbuchstaben 'L')

.

Wenn Sie MinGW verwenden, ist das Problem, dass standardmäßig MinGW verwendet das E / A-bzw. Formatierungsfunktionen von der Microsoft C-Laufzeit, die nicht Gleitkommazahlen 80 Bit unterstützt (long double == double in Microsoft Land).

Allerdings MinGW kommt auch mit einer Reihe von alternativen Implementierungen, die tun richtig lange Doppel unterstützen. Um sie zu verwenden, das Präfix die Funktionsnamen mit __mingw_ (z.B. __mingw_printf). Je nach Art des Projekts, möchten Sie vielleicht auch #define printf __mingw_printf oder Verwendung -D__USE_MINGW_ANSI_STDIO (die es ermöglicht, die MinGW Versionen aller printf-Familie Funktionen) global.

Wurde dieses Problem testen lange verdoppelt hat, und ach, stieß ich auf eine fix! Sie haben Ihr Projekt mit -D__USE_MINGW_ANSI_STDIO kompilieren:

  

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

Code:

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

In C99 die Längenmodifizierer für long double scheint L und nicht l zu sein. man fprintf (oder gleichwertig für Windows) sollten Sie für die jeweilige Plattform erzählen.

Wie in anderen Antworten gesagt, die richtige Konvertierungsspezifizierer ist "%Lf".

Sie können auf das Format Warnung aktivieren möchten, indem Sie -Wformat (oder -Wall, die -Wformat enthält) in der gcc Aufruf

$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$

printf und scanf Funktion in C / C ++ verwenden Microsoft C-Bibliothek und die Bibliothek hat keine Unterstützung für 10-Byte-Doppel lang. Also, wenn Sie printf und scanf-Funktion in C / C ++ Code verwenden eine lange Doppel als Ausgabe zu drucken und eine Eingabe als ein langer Doppel zu nehmen, wird es immer geben Ihnen falsches Ergebnis.

Wenn Sie lange Doppel verwenden möchten, dann müssen Sie „__mingw_printf“ und „__mingw_scanf“ -Funktion anstelle von printf und scanf verwenden. Es hat Unterstützung für 10 Byte lange verdoppeln.

Sie können auch zwei Makro wie folgt definieren: "#define printf __mingw_printf" und "#define Scanf __mingw_scanf"

Verwenden Sie Standard-Format für die Lang double:% Lf

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top