Dlouhé dvojité - Long double
Plovoucí bod formáty |
---|
IEEE 754 |
|
jiný |
v C a související programovací jazyky, dlouhý dvojitý
označuje a plovoucí bod datový typ to je často přesnější než dvojnásobná přesnost jazykový standard však vyžaduje, aby byl alespoň tak přesný jako dvojnásobek
. Stejně jako u ostatních typů C s plovoucí desetinnou čárkou se nemusí nutně mapovat na Formát IEEE.
dlouhý dvojitý
v C.
Dějiny
The dlouhý dvojitý
typ byl přítomen v původním standardu 1989 C,[1] ale podpora byla vylepšena revizí standardu C z roku 1999, nebo C99, který rozšířil standard knihovna zahrnout funkce pracující na dlouhý dvojitý
jako sinl ()
a strtold ()
.
Dlouhé dvojité konstanty jsou konstanty s plovoucí desetinnou čárkou s příponou „L“ nebo „l“ (malá písmena L), například 0,333333333333333333L. Bez přípony závisí hodnocení na FLT_EVAL_METHOD.
Implementace
Na x86 architektura, většina C překladače implementovat dlouhý dvojitý
jako 80bitová rozšířená přesnost typ podporovaný hardwarem x86 (obvykle se uchovává jako 12 nebo 16 bajtů pro údržbu zarovnání datové struktury ), jak je uvedeno v C99 / C11 standardy (IEC 60559 aritmetika s plovoucí desetinnou čárkou (příloha F)). Výjimkou je Microsoft Visual C ++ pro x86, což dělá dlouhý dvojitý
synonymum pro dvojnásobek
.[2] The Překladač Intel C ++ v systému Microsoft Windows podporuje rozšířenou přesnost, ale vyžaduje / Qlong-double
přepnout na dlouhý dvojitý
aby odpovídal rozšířenému přesnému formátu hardwaru.[3]
Kompilátoři mohou také použít dlouhý dvojitý
pro Čtyřnásobný přesný binární formát plovoucí desetinné čárky IEEE 754 (binary128). To je případ HP-UX,[4] Solaris /SPARC,[5] MIPS s 64bitovým nebo n32 ABI,[6], 64bitová ARM (AArch64)[7] (v operačních systémech využívajících standardní konvence volání AAPCS, jako je Linux) a z / OS s FLOAT (IEEE)[8][9][10]. Většina implementací je v softwaru, ale některé procesory ano hardwarová podpora.
Na některých PowerPC a SPARCv9 stroje,[Citace je zapotřebí ] dlouhý dvojitý
je implementován jako zdvojnásobit aritmetika, kde a dlouhý dvojitý
hodnota je považována za přesný součet dvou hodnot s dvojitou přesností, což dává alespoň 106bitovou přesnost; s takovým formátem dlouhý dvojitý
typ neodpovídá Standard IEEE s plovoucí desetinnou čárkou. V opačném případě, dlouhý dvojitý
je prostě synonymum pro dvojnásobek
(dvojitá přesnost), např. na 32-bit PAŽE[11], 64bitová ARM (AArch64) (ve Windows[12] a macOS[13]) a na 32bitových MIPS[14] (starý ABI, aka o32).
S Překladač GNU C., dlouhý dvojitý
je 80bitová rozšířená přesnost na procesorech x86 bez ohledu na fyzické úložiště použité pro daný typ (což může být 96 nebo 128 bitů),[15] Na některých jiných architekturách dlouhý dvojitý
může být zdvojnásobit (např. na PowerPC[16][17][18]) nebo 128bitový čtyřnásobná přesnost (např. na SPARC[19]). Od verze gcc 4.3 je na x86 podporována také čtyřnásobná přesnost, ale jako nestandardní typ __float128
spíše než dlouhý dvojitý
.[20]
Ačkoli architektura x86 a konkrétně x87 instrukce s plovoucí desetinnou čárkou na x86, podporuje 80bitové operace s rozšířenou přesností, je možné nakonfigurovat procesor tak, aby automaticky zaokrouhloval operace na dvojnásobnou (nebo dokonce jednoduchou) přesnost. Naopak v režimu rozšířené přesnosti lze rozšířenou přesnost použít pro mezilehlé výpočty generované překladačem, i když jsou konečné výsledky uloženy s nižší přesností (tj. FLT_EVAL_METHOD == 2 ). Se zapnutým gcc Linux, Výchozí je 80bitová rozšířená přesnost; na několika BSD operační systémy (FreeBSD a OpenBSD ), výchozí režim je dvojitá přesnost a dlouhý dvojitý
operace jsou efektivně redukovány na dvojnásobnou přesnost.[21] (NetBSD 7.0 a novější však výchozí nastavení je 80bitová rozšířená přesnost [22]). Je však možné toto přepsat v rámci individuálního programu pomocí instrukce FLDCW „plovoucí desetinnou čárkou“.[21] Na x86_64 mají BSD výchozí 80bitovou rozšířenou přesnost. Microsoft Windows s Visual C ++ ve výchozím nastavení také nastaví procesor v režimu dvojité přesnosti, ale to může být znovu přepsáno v rámci jednotlivého programu (např. _controlfp_s
funkce ve Visual C ++[23]). Intel C ++ Compiler pro x86 na druhou stranu ve výchozím nastavení umožňuje režim rozšířené přesnosti.[24] Na IA-32 OS X, dlouhý dvojitý
je 80bitová rozšířená přesnost.[25]
Další specifikace
v CORBA (ze specifikace 3.0, která používá „Standard ANSI / IEEE 754-1985 „jako jeho reference),“ dlouhý dvojitý datový typ představuje číslo IEEE s dvojitou prodlouženou plovoucí desetinnou čárkou, které má exponent o délce nejméně 15 bitů a zlomek se znaménkem nejméně 64 bitů “, s GIOP / IIOP CDR , jejíž typy s plovoucí desetinnou čárkou „přesně odpovídají standardním formátům IEEE pro čísla s plovoucí desetinnou čárkou“, seřaďují to jako to, co se zdá být IEEE 754-2008 binary128 aka čtyřnásobná přesnost bez použití tohoto názvu.
Viz také
Reference
- ^ ANSI / ISO 9899-1990 americký národní standard pro programovací jazyky - C, oddíl 6.1.2.5.
- ^ Domovská stránka MSDN, o kompilátoru Visual C ++
- ^ Intel Developer Site
- ^ Hewlett Packard (1992). Msgstr "Přenos programů C". Průvodce přenositelností HP-UX - Počítače HP 9000 (PDF) (2. vyd.). str. 5-3 a 5-37.
- ^ slunce Průvodce numerickými výpočty, Kapitola 2: IEEE aritmetika
- ^ „Příručka MIPSpro ™ N32 ABI“ (PDF). 1999. Citováno 2020-05-26.
- ^ „Standard volání procedur pro 64bitovou architekturu Arm® (AArch64)“. 2020-10-01. Archivováno (PDF) z původního dne 2020-10-02.
- ^ „Typy s plovoucí desetinnou čárkou“. 2020-10-09. Citováno 2020-10-09.
- ^ Schwarz, Eric (22. června 2015). „Akcelerátory IBM z13 SIMD pro celé číslo, řetězec a plovoucí desetinnou čárku“ (PDF). Citováno 13. července 2015.
- ^ Schwarz, E. M .; Krygowski, C. A. (září 1999). „Jednotka s plovoucí desetinnou čárkou S / 390 G5“. IBM Journal of Research and Development. 43 (5/6): 707–721. doi:10.1147 / rd.435.0707. Citováno 10. října 2020.
- ^ „ARM® Compiler toolchain Compiler Reference, verze 5.03“ (PDF). 2013. Oddíl 6.3 Základní datové typy. Citováno 2019-11-08.
- ^ „llvm / llvm-project“. GitHub. Citováno 2020-09-03.
- ^ „llvm / llvm-project“. GitHub. Citováno 2020-09-03.
- ^ „Aplikační binární rozhraní systému V: Dodatek k procesoru MIPS (r)“ (PDF) (3. vyd.). 1996. Citováno 2020-05-26.
- ^ Pomocí kolekce kompilátorů GNU, možnosti x86.
- ^ Pomocí GNU Compiler Collection, RS / 6000 a PowerPC Options
- ^ Inside Macintosh - Numerika PowerPC Archivováno 09.10.2012 na Wayback Machine
- ^ 128bitové rutiny dvojité podpory pro Darwina
- ^ Možnosti SPARC
- ^ Poznámky k verzi GCC 4.3
- ^ A b Brian J. Gough a Richard M. Stallman, Úvod do GCC, oddíl 8.6 Problémy s plovoucí desetinnou čárkou (Network Theory Ltd., 2004).
- ^ „Významné změny oproti NetBSD 6.0 až 7.0“.
- ^ _controlfp_s, Microsoft Developer Network (2/25/2011).
- ^ Dokumentace kompilátoru Intel C ++, Pomocí možnosti -fp-model (/ fp).
- ^ https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html