langes Doppel - long double

In C und verwandten Programmiersprachen , long doublebezieht sich auf eine Fließkommadatentyp , der oft genauer als es mit doppelter Genauigkeit , obwohl nur der Sprachstandard es mindestens so genau zu sein braucht , wie . Wie bei den anderen Gleitkommatypen von C muss er nicht unbedingt einem IEEE-Format zugeordnet werden . double

long double in C

Geschichte

Der long doubleTyp wurde in dem ursprünglichen 1989 - C - Standard, aber die Unterstützung durch die 1999 Version des C - Standard verbessert wurde oder C99 , die die Standard erweiterten Bibliotheksfunktionen umfassen zum Betrieb long doublewie sinl()und strtold().

Lange Doppelkonstanten sind Gleitkommakonstanten mit dem Suffix "L" oder "l" (Kleinbuchstabe L), zB 0.3333333333333333333L. Ohne Suffix hängt die Auswertung von FLT_EVAL_METHOD ab .

Implementierungen

Auf der x86- Architektur implementieren die meisten C- Compiler long doubleden 80-Bit- Typ mit erweiterter Genauigkeit, der von x86-Hardware unterstützt wird (im Allgemeinen als 12 oder 16 Byte gespeichert, um die Ausrichtung der Datenstruktur aufrechtzuerhalten ), wie in den C99 / C11- Standards (IEC 60559 Gleitkomma) angegeben Arithmetik (Anhang F)). Eine Ausnahme ist Microsoft Visual C++ für x86, das long doubleein Synonym für double. Der Intel C++-Compiler unter Microsoft Windows unterstützt Extended Precision, erfordert jedoch, dass der /Qlong‑doubleSchalter für long doubledas Extended Precision-Format der Hardware entspricht.

Compiler können auch long doublefür das binäre Gleitkommaformat IEEE 754 mit vierfacher Genauigkeit (binary128) verwendet werden. Dies ist bei HP-UX , Solaris / SPARC , MIPS mit 64-Bit- oder n32- ABI , 64-Bit-ARM (AArch64) (auf Betriebssystemen, die die standardmäßigen AAPCS-Aufrufkonventionen wie Linux verwenden) und z/OS der Fall mit SCHWIMMER (IEEE). Die meisten Implementierungen sind in Software, aber einige Prozessoren haben Hardware-Unterstützung .

Auf einigen PowerPC- und SPARCv9- Rechnern wird long doublees als Double-Double- Arithmetik implementiert , bei der ein long doubleWert als die exakte Summe zweier Double-Precision-Werte betrachtet wird, was eine Genauigkeit von mindestens 106 Bit ergibt; bei einem solchen Format entspricht der long doubleTyp nicht dem IEEE-Gleitkommastandard . Ansonsten long doubleist einfach ein Synonym für double(doppelte Präzision), zB auf 32-Bit- ARM , 64-Bit-ARM (AArch64) (auf Windows und macOS) und auf 32-Bit-MIPS (altes ABI, aka o32).

Mit dem GNU C Compiler , long doubleist 80-Bit erweiterter Präzision auf x86 - Prozessoren unabhängig vom physikalischen Speicher für den Typen verwendet (das entweder 96 oder 128 Bit sein kann), auf einigen anderen Architekturen long doublekann Doppeltsukahara (zB auf PowerPC ) oder 128-Bit- Vierfach-Präzision (zB auf SPARC ). Ab gcc 4.3 wird auch auf x86 eine vierfache Genauigkeit unterstützt, jedoch als nicht standardmäßiger Typ __float128und nicht als long double.

Obwohl die x86-Architektur und insbesondere die x87- Gleitkommabefehle auf x86 80-Bit-Operationen mit erweiterter Genauigkeit unterstützen, ist es möglich, den Prozessor so zu konfigurieren, dass Operationen automatisch auf doppelte (oder sogar einfache) Genauigkeit gerundet werden. Umgekehrt kann im Modus mit erweiterter Genauigkeit die erweiterte Genauigkeit für vom Compiler erzeugte Zwischenberechnungen verwendet werden, selbst wenn die Endergebnisse mit einer geringeren Genauigkeit gespeichert werden (dh FLT_EVAL_METHOD == 2 ). Bei gcc unter Linux ist die erweiterte 80-Bit-Präzision der Standard; auf mehreren BSD- Betriebssystemen ( FreeBSD und OpenBSD ) ist der Modus mit doppelter Genauigkeit die Standardeinstellung, und long doubleOperationen werden effektiv auf doppelte Genauigkeit reduziert. ( NetBSD 7.0 und höher verwendet jedoch standardmäßig eine erweiterte Genauigkeit von 80 Bit ). Es ist jedoch möglich, dies innerhalb eines einzelnen Programms über die FLDCW-Anweisung "Floating-Point Load Control-Word" zu überschreiben. Auf x86_64 haben die BSDs standardmäßig eine erweiterte Genauigkeit von 80 Bit. Auch Microsoft Windows mit Visual C++ setzt den Prozessor standardmäßig in den Double-Precision-Modus, der jedoch innerhalb eines einzelnen Programms (zB durch die _controlfp_sFunktion in Visual C++) wieder übersteuert werden kann. Der Intel C++ Compiler für x86 hingegen aktiviert standardmäßig den erweiterten Präzisionsmodus. Unter IA-32 OS X long doubleist die erweiterte Genauigkeit von 80 Bit.

Andere Spezifikationen

In CORBA (aus der Spezifikation von 3.0, die den „ ANSI/IEEE Standard 754-1985 “ als Referenz verwendet) „ repräsentiert der Datentyp long double eine doppelt erweiterte IEEE-Gleitkommazahl, die einen Exponenten von mindestens 15 Bit hat in Länge und einem vorzeichenbehafteten Bruchteil von mindestens 64 Bit", mit GIOP/IIOP CDR, dessen Gleitkommatypen "genau den IEEE-Standardformaten für Gleitkommazahlen folgen", und dies als scheinbar IEEE 754-2008 binary128 aka . gemarshallt vierfache Genauigkeit, ohne diesen Namen zu verwenden.

Siehe auch

Verweise

  1. ^ ANSI/ISO 9899-1990 American National Standard for Programming Languages ​​- C, Abschnitt 6.1.2.5.
  2. ^ MSDN-Homepage, über Visual C++-Compiler
  3. ^ Intel-Entwicklerseite
  4. ^ Hewlett-Packard (1992). "Portieren von C-Programmen". HP-UX Portabilitätshandbuch - HP 9000 Computer (PDF) (2. Aufl.). S. 5-3 und 5-37.
  5. ^ Sun Numerical Computation Guide , Kapitel 2: IEEE Arithmetik
  6. ^ "MIPSpro™ N32 ABI-Handbuch" (PDF) . 1999 . Abgerufen 26.05.2020 .
  7. ^ „Standard für Prozeduraufrufe für die ARM®-64-Bit-Architektur (AArch64)“ . 2020-10-01. Archiviert (PDF) vom Original am 02.10.2020.
  8. ^ "Gleitkommatypen" . 2020-10-09 . Abgerufen 2020-10-09 .
  9. ^ Schwarz, Eric (22. Juni 2015). "Die IBM z13 SIMD-Beschleuniger für Integer, String und Floating-Point" (PDF) . Abgerufen am 13. Juli 2015 .
  10. ^ Schwarz, EM; Krygowski, CA (September 1999). "Die Gleitkommaeinheit S/390 G5" . IBM-Journal für Forschung und Entwicklung . 43 (5/6): 707–721. CiteSeerX  10.1.1.117.6711 . doi : 10.1147/rd.435.0707 . Abgerufen am 10. Oktober 2020 .
  11. ^ "ARM® Compiler Toolchain Compiler-Referenz, Version 5.03" (PDF) . 2013. Abschnitt 6.3 Basisdatentypen . Abgerufen am 08.11.2019 .
  12. ^ "llvm/llvm-Projekt" . GitHub . Abgerufen 2020-09-03 .
  13. ^ "llvm/llvm-Projekt" . GitHub . Abgerufen 2020-09-03 .
  14. ^ "System V Application Binary Interface: MIPS(r) Processor Supplement" (PDF) (3. Aufl.). 1996 . Abgerufen 26.05.2020 .
  15. ^ Verwenden der GNU-Compiler-Sammlung, x86-Optionen .
  16. ^ Verwenden der GNU Compiler Collection, RS/6000 und PowerPC-Optionen
  17. ^ Inside Macintosh - PowerPC Numerics Archiviert 2012-10-09 auf der Wayback Machine
  18. ^ 128 Bit lange Doppelunterstützungsroutinen für Darwin
  19. ^ SPARC-Optionen
  20. ^ GCC 4.3 Versionshinweise
  21. ^ a b Brian J. Gough und Richard M. Stallman, An Introduction to GCC , Abschnitt 8.6 Gleitkommaprobleme (Network Theory Ltd., 2004).
  22. ^ "Wesentliche Änderungen von NetBSD 6.0 zu 7.0" .
  23. ^ _controlfp_s , Microsoft-Entwicklernetzwerk (25.02.2011).
  24. ^ Intel C++ Compiler-Dokumentation, Verwenden der Option -fp-model (/fp) .
  25. ^ "IA-32-Konventionen für den Funktionsaufruf" .