Ich verwende das neueste gcc mit Netbeans unter Windows. Warum nicht long double Arbeit? Ist der printf Bezeichner %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 ...
Offensichtlich gibt es ein Problem mit MinGW und Long Double
– Game Boy
3. November 2010 um 20:11 Uhr
mögliches Duplikat von kann ein langes Double in C nicht korrekt drucken
– phuklv
21. September 2015 um 7:48 Uhr
Ja für long doublemüssen Sie verwenden %Lf (dh Großbuchstaben ‘L’).
Die einfachste und kürzeste Antwort ist die richtige! ^ + positiv abstimmen
– Sampath
6. Juli 2021 um 4:21 Uhr
Nr
Aus der printf-Manpage:
l (ell) Eine folgende Integer-Konvertierung entspricht einem long int- oder unsigned long int-Argument, oder eine folgende n-Konvertierung entspricht einem Zeiger auf ein long int-Argument, oder eine folgende c-Konvertierung entspricht einem wint_t-Argument oder eine folgende s-Konvertierung entspricht einem Zeiger auf das Argument wchar_t.
und
LA nach einer a-, A-, e-, E-, f-, F-, g- oder G-Konvertierung entspricht einem langen doppelten Argument. (C99 erlaubt %LF, SUSv2 jedoch nicht.)
Also du möchtest %Le nicht %le
Bearbeiten: Einige weitere Untersuchungen scheinen darauf hinzudeuten, dass Mingw die MSVC/win32-Laufzeitumgebung (für Dinge wie printf) verwendet – die Long Double auf Double abbildet. Mischen Sie also einen Compiler (wie gcc), der ein natives Long-Double mit einer Laufzeit bereitstellt, die nicht .. ein Durcheinander zu sein scheint.
Welchen Compiler verwenden Sie mit Netbeans unter Windows?
– Nr
3. November 2010 um 16:56 Uhr
dnadlinger
Wenn Sie MinGW verwenden, besteht das Problem darin, dass MinGW standardmäßig die E/A- bzw. Formatierungsfunktionen der Microsoft C-Laufzeitumgebung, die keine 80-Bit-Gleitkommazahlen unterstützt (long double == double im Microsoft-Land).
MinGW enthält jedoch auch eine Reihe alternativer Implementierungen, die tun lange Doubles richtig unterstützen. Um sie zu verwenden, stellen Sie den Funktionsnamen ein Präfix voran __mingw_ (z.B __mingw_printf). Abhängig von der Art Ihres Projekts möchten Sie vielleicht auch global #define printf __mingw_printf oder verwenden -D__USE_MINGW_ANSI_STDIO (was die MinGW-Versionen aller printf-Familienfeiern).
Warnung: Die mingw-Version hat einen Leistungsfehler. stackoverflow.com/questions/13970675/…
– Benutzer202729
17. Oktober 2019 um 10:24 Uhr
Ein Programmierer
Neben dem falschen Modifikator, welche Portierung von gcc auf Windows? mingw verwendet die Microsoft C-Bibliothek, und ich meine mich zu erinnern, dass diese Bibliothek keine Unterstützung für 80 Bits langes Double hat (der Microsoft C-Compiler verwendet aus verschiedenen Gründen 64 Bits langes Double).
Hatte dieses Problem beim Testen langer Doubles, und leider bin ich auf eine Lösung gestoßen! Sie müssen 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 ist der Längenmodifikator für long double scheint zu sein L und nicht l. man fprintf (oder gleichwertig für Windows) sollte Ihnen für Ihre spezielle Plattform sagen.
pmg
Wie in anderen Antworten gesagt wurde, ist der richtige Konvertierungsspezifizierer "%Lf".
Möglicherweise möchten Sie die Formatwarnung mit aktivieren -Wformat (oder -Wallwelches beinhaltet -Wformat) im 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`
$
bytes.com/topic/c/answers/…
– Game Boy
3. November 2010 um 20:09 Uhr
Offensichtlich gibt es ein Problem mit MinGW und Long Double
– Game Boy
3. November 2010 um 20:11 Uhr
mögliches Duplikat von kann ein langes Double in C nicht korrekt drucken
– phuklv
21. September 2015 um 7:48 Uhr