2010-11-03 13 views
40

Ich benutze die neuesten gcc mit Netbeans auf Windows. Warum funktioniert long double nicht? Ist der printf Spezifizierer %lf falsch?printf und lange Doppel

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

Ausgang:

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

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3-a – gameboy

+0

offensichtlich ist es ein Problem mit MinGW und langem Doppel – gameboy

+0

mögliches Duplikat von [kann ein langes Doppel in C nicht korrekt drucken] (http://stackoverflow.com/questions/26296058/cant-print-correctly-a-long-double-in-c) –

Antwort

9

Neben dem falschen Modifikator, welcher Port von gcc auf Windows? Mingw verwendet die Microsoft C-Bibliothek, und ich erinnere mich, dass diese Bibliothek keine Unterstützung für 80 Bit lange Double bietet (Microsoft C-Compiler verwenden aus verschiedenen Gründen 64 Bit lang doppelt).

+0

ja, du hast Recht – gameboy

+0

http://bytes.com/topic/c/answers/135253-printing-long-double-type-via-printf-mingw-g-3-2-3- ein – gameboy

4

In C99 die Längenmodifizierer für long double scheint lL und nicht zu sein. man fprintf (oder gleichwertig für Windows) sollten Sie für Ihre spezielle Plattform informieren.

+1

Schade ist er unter Windows, und er hat wahrscheinlich keine Manpage. Googlen Sie nach "man printf" oder "printf manual page" oder so ähnlich. –

30

Ja - für long double müssen Sie %Lf (d. H. Großbuchstaben 'L') verwenden.

36

Vom printf -Manpage:

l (ell) A folgenden ganzzahlige Umwandlung entspricht ein long int oder unsigned long int Argument oder eine folgenden n Umwandlung entspricht einen Zeiger auf einen langen int argument, oder eine folgende c Umwandlung entspricht einem wint_t-Argument, oder eine folgende s Umwandlung entspricht einem Zeiger auf wchar_t Argument.

und

L A folgenden a, A, E, E, F, F, G oder G Umwandlung entspricht einem long double Argument. (. C99 % LF erlaubt, aber SUSv2 nicht)

Also, wollen Sie %Le, nicht %le

Edit: Einige weitere Untersuchungen, um anzuzeigen scheint, dass Mingw die MSVC/win32 Laufzeit verwendet (für Sachen wie printf) - die lange doppelt bis doppelt abbildet. Also Mischen eines Compilers (wie gcc), die eine native lange Doppel mit einer Laufzeit bietet, die scheint nicht .. ein Durcheinander sein.

+0

Ich fand http://linux.die.net/man/3/printf, aber% Lf oder% Le funktioniert auch nicht – gameboy

+0

Welchen Compiler verwenden Sie mit Netbeans unter Windows? – nos

+0

neueste gcc und MinGW – gameboy

2

Wie in anderen Antworten erwähnt wurde, ist der korrekte Konvertierungsspezifikator "%Lf".

Sie könnten auf dem 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` 
$ 
20

Wenn Sie MinGW verwenden, besteht das Problem darin, dass MinGW standardmäßig die E/A- bzw. die E/A-Adresse verwendet. Formatieren von Funktionen aus der Microsoft-C-Laufzeitumgebung, die 80-Bit-Gleitkommazahlen (long double == double in Microsoft Land) nicht unterstützt.

MinGW kommt jedoch auch mit einer Reihe von alternativen Implementierungen, die do richtig lange Doppel unterstützen. Um sie zu verwenden, setzen Sie den Funktionsnamen mit __mingw_ voran (z. B. __mingw_printf). Abhängig von der Art Ihres Projekts möchten Sie vielleicht auch global #define printf __mingw_printf oder verwenden Sie -D__USE_MINGW_ANSI_STDIO (die die MinGW-Versionen aller printf -Familienfunktionen ermöglicht).

6

War dieses Problem testen lange verdoppelt, und leider stieß ich auf eine Lösung! Sie haben Ihr Projekt mit -D__USE_MINGW_ANSI_STDIO zu 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 Huntle y @ centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 42,000000

Code:

Jason [email protected] /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; 
} 
-1

Correct Printf Gespräch in Java: -

double pi = Math.PI; 

    System.out.format("%f%n", pi);  // --> "3.141593" 
    System.out.format("%.3f%n", pi);  // --> "3.142" 
    System.out.format("%10.3f%n", pi); // --> "  3.142" 
    System.out.format("%-10.3f%n", pi); // --> "3.142" 
    System.out.format(Locale.FRANCE, 
        "%-10.4f%n%n", pi); // --> "3,1416" 

    Calendar c = Calendar.getInstance(); 
    System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" 

    System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" 

    System.out.format("%tD%n", c); // --> "05/29/06"