printf und long double

Lesezeit: 3 Minuten

Benutzeravatar des Gameboys
Game Boy

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

  • 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

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

Benutzeravatar von nos
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

Benutzeravatar von dnadlinger
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

Benutzeravatar von AProgrammer
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.

Benutzeravatar von pmg
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`
$

1415620cookie-checkprintf und long double

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy