2016-12-20 4 views
1

mein Programm ist recht einfach:Printf von langen Doppel unbekannten Umwandlungstyp Zeichen L

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main() 
{ 
    long double a = 4.5; 
    printf("%Lg", a); 
    return 0; 
} 

Wenn kompiliert, gibt es eine Warnung:

warning: unknown conversion type character 'L' in format [-Wformat=]| 

Die Ausgabe in der Konsole ist

-1.28823e-231 

Die Dokumentation ist ziemlich klar über das Drucken von langen Doppel, es gibt einfach an, dass der richtige Parameter für dieses Format ist L. Was mache ich falsch? Ich verwende Codeblocks, mingw32-g ++ - Compiler unter Windows 10.

P.S .: cout produziert die gleiche Ausgabe.

+0

Keine Probleme mit gcc 6.2.1. Vielleicht unterstützt dieser Compiler keine 'long double' Konvertierung für' printf'. Sie können dieses Problem wahrscheinlich vermeiden, indem Sie tatsächlich C++ - Code anstelle von C-Code schreiben und den Operator '<<' verwenden. –

+0

Ihr Code kompiliert gut. Ich habe es kompiliert und die Ausgabe war korrekt. Versuchen Sie es mit anderen Compiler – Yousaf

Antwort

2

Sie haben ein Problem mit dem Compiler:

mingw verwendet die Microsoft C-Laufzeitbibliotheken und deren Umsetzung von printf nicht die 'long double' Typ nicht unterstützt. Als Workaround können Sie stattdessen "Double" verwenden und stattdessen printf übergeben.

Daher müssen Sie double double:

Auf der x86-Architektur, die meisten C-Compiler implementieren long double als 80-Bit erweitert Präzisionsart von x86-Hardware unterstützt (manchmal als 12 oder 16 Bytes gespeichert Aufrechterhaltung der Datenstrukturausrichtung), wie in den C99/C11-Standards spezifiziert (IEC 60559 Gleitkommaarithmetik (Anhang F)). Eine Ausnahme ist Microsoft Visual C++ für x86, die lange doppelte Synonym für Double macht. [2] Der Intel C++ - Compiler unter Microsoft Windows unterstützt erweiterte Genauigkeit, erfordert jedoch, dass der/Qlong-Double-Schalter für Long Double dem erweiterten Präzisionsformat der Hardware entspricht. [3]

Statt printf() verwenden std::cout gekoppelt mit std::scientific, zum Beispiel:

#include <iostream> 
std::cout << "scientific: " << std::endl << std::scientific << a; 

Es ist nicht sowohl stdio.h und iostream im selben Projekt am besten zu nutzen, wie sie manchmal miteinander interferieren können.

PS. Zu diesem Thema sind auch verfügbar: std::hex, std::dec (dezimal), std::boolalpha (true, false) und mehr.

+0

Ihr Code erzeugt wissenschaftlichen: -1.28823e-231 – user16320

+0

@ user16320 wissenschaftlichen: 4.500000e + 00 – sbail95

+0

die Ausgabe des Programms ist es, getestet auf cpp.sh cpp11 Flag verwendet. Welche C++ Flags verwendest du? – sbail95

Verwandte Themen