lång dubbel

I C och relaterade programmeringsspråk hänvisar long double till en flyttalsdatatyp som ofta är mer exakt än dubbel precision även om språkstandarden bara kräver att den är minst lika exakt som dubbel . Som med C:s andra flyttalstyper, kanske den inte nödvändigtvis mappar till ett IEEE-format .

lång dubbel i C

Historia

Den långa dubbeltypen fanns i den ursprungliga C - standarden från 1989, men stödet förbättrades genom 1999 års revidering av C-standarden, eller C99 , som utökade standardbiblioteket till att omfatta funktioner som fungerar på lång dubbel som sinl() och strtold() .

Long double constants are floating-point constants suffixed with "L" or "l" (lower-case L), eg, 0.3333333333333333333333333333333333L or 3.1415926535897932384626433832795028L for quadruple precision . Utan ett suffix beror utvärderingen på FLT_EVAL_METHOD .

Genomföranden

x86 -arkitekturen implementerar de flesta C- kompilatorer lång dubbelt så mycket som den 80-bitars utökade precisionstypen som stöds av x86-hårdvara (vanligtvis lagrad som 12 eller 16 byte för att upprätthålla datastrukturjustering ), som specificeras i C99 / C11 -standarderna (IEC 60559 flytande -punktaritmetik (bilaga F)). Ett undantag är Microsoft Visual C++ för x86, vilket gör long double till en synonym för dubbel . Intel C++-kompilatorn på Microsoft Windows stöder utökad precision, men kräver /Qlong-dubbelväxeln för lång dubbel för att motsvara hårdvarans utökade precisionsformat.

Kompilatorer kan också använda long double för IEEE 754 fyrdubbla precision binära flyttalsformat ( binary128). Detta är fallet på HP-UX , Solaris / SPARC , MIPS med 64-bitars eller n32 ABI , 64-bitars ARM (AArch64) (på operativsystem som använder standard AAPCS-anropskonventioner, såsom Linux) och z/OS med FLOAT(IEEE). De flesta implementeringar är i mjukvara, men vissa processorer har hårdvarustöd .

På vissa PowerPC- system implementeras long double som en dubbel-dubbel aritmetik, där ett långt dubbelvärde betraktas som den exakta summan av två dubbelprecisionsvärden, vilket ger minst en 106-bitars precision; med ett sådant format överensstämmer inte den långa dubbeltypen med IEEE flyttalsstandarden . Annars är lång dubbel helt enkelt en synonym för dubbel (dubbel precision), t.ex. på 32-bitars ARM , 64-bitars ARM (AArch64) (på Windows och macOS) och på 32-bitars MIPS (gamla ABI, aka o32).

Med GNU C-kompilatorn är long double 80-bitars utökad precision på x86-processorer oavsett vilken fysisk lagring som används för typen (som kan vara antingen 96 eller 128 bitar), På vissa andra arkitekturer kan long double vara dubbeldubbel ( t.ex. på PowerPC ) eller 128-bitars fyrdubbla precision (t.ex. på SPARC ). Från och med gcc 4.3 stöds också fyrfaldig precision på x86, men som den icke-standardiserade typen __float128 snarare än long double .

Även om x86-arkitekturen, och specifikt x87 flyttalsinstruktionerna på x86, stöder 80-bitars utökade precisionsoperationer, är det möjligt att konfigurera processorn för att automatiskt runda operationer till dubbel (eller till och med enkel) precision. Omvänt, i läge med utökad precision, kan utökad precision användas för mellanliggande kompilatorgenererade beräkningar även när slutresultaten lagras med lägre precision (dvs. FLT_EVAL_METHOD == 2 ). Med gcc på Linux är 80-bitars utökad precision standard; på flera BSD- operativsystem ( FreeBSD och OpenBSD ) är dubbelprecisionsläge standard, och långa dubbeloperationer reduceras effektivt till dubbel precision. ( NetBSD 7.0 och senare har dock som standard 80-bitars utökad precision). Det är emellertid möjligt att åsidosätta detta inom ett individuellt program via FLDCW-instruktionen "flyttalsbelastningsstyrord". På x86_64 har BSD:erna som standard 80-bitars utökad precision. Microsoft Windows med Visual C++ ställer också in processorn i dubbelprecisionsläge som standard, men detta kan återigen åsidosättas inom ett enskilt program (t.ex. av funktionen _controlfp_s i Visual C++). Intel C++-kompilatorn för x86, å andra sidan, aktiverar utökat precisionsläge som standard. På IA-32 OS X long double 80-bitars utökad precision.

Övriga specifikationer

I CORBA (från specifikationen av 3.0, som använder " ANSI/IEEE Standard 754-1985 " som referens), "representerar den långa dubbeldatatypen ett IEEE dubbelförlängt flyttal, som har en exponent på minst 15 bitar i längd och en signerad bråkdel på minst 64 bitar", med GIOP/IIOP CDR, vars flyttalstyper "exakt följer IEEE-standardformaten för flyttalnummer", som anger detta som vad som verkar vara IEEE 754-2008 binary128 aka fyrdubbel precision utan att använda det namnet.

Se även

  1. ^ ANSI/ISO 9899-1990 Amerikansk nationell standard för programmeringsspråk - C, avsnitt 6.1.2.5.
  2. ^ "Lång dubbel" . learn.microsoft.com . Hämtad 2022-10-06 .
  3. ^ Intels utvecklarwebbplats
  4. ^ Hewlett Packard (1992). "Portera C-program". HP-UX Portabilitetsguide - HP 9000-datorer (PDF) (andra upplagan). s. 5-3 och 5-37.
  5. ^ "IEEE Aritmetik" . docs.oracle.com . Hämtad 2022-10-06 .
  6. ^ "MIPSpro™ N32 ABI-handbok" (PDF) . 1999 . Hämtad 2020-05-26 .
  7. ^ "Proceduranropsstandard för Arm® 64-bitars arkitektur (AArch64)" . GitHub . 2020-10-01. Arkiverad (PDF) från originalet 2020-10-02.
  8. ^ "Flytpunktstyper" . IBM . 2020-10-09 . Hämtad 2020-10-09 .
  9. ^ Schwarz, Eric (22 juni 2015). "IBM z13 SIMD-acceleratorer för heltal, sträng och flytande punkt" ( PDF) . Hämtad 13 juli 2015 .
  10. ^   Schwarz, EM; Krygowski, CA (september 1999). "S/390 G5 flyttalsenhet". IBM Journal of Research and Development . 43 (5/6): 707–721. CiteSeerX 10.1.1.117.6711 . doi : 10.1147/rd.435.0707 .
  11. ^ "Sagan om Power ISA 128-bitars lång dubbel" . 2018-12-22 . Hämtad 2021-12-26 .
  12. ^ "ARM® Compiler Toolchain Compiler Reference, Version 5.03" (PDF) . 2013. Avsnitt 6.3 Grundläggande datatyper . Hämtad 2019-11-08 .
  13. ^ "llvm/llvm-projekt" . GitHub . Hämtad 2020-09-03 .
  14. ^ "llvm/llvm-projekt" . GitHub . Hämtad 2020-09-03 .
  15. ^ "System V Application Binary Interface: MIPS(r) Processor Supplement" (PDF) (3rd ed.). 1996 . Hämtad 2020-05-26 .
  16. ^ "x86-alternativ (med GNU Compiler Collection (GCC))" . gcc.gnu.org . Hämtad 2022-10-06 .
  17. ^ "RS/6000 och PowerPC-alternativ (med GNU Compiler Collection (GCC))" . gcc.gnu.org . Hämtad 2022-10-06 .
  18. ^ Inside Macintosh - PowerPC Numerics Arkiverad 2012-10-09 på Wayback Machine
  19. ^ 128-bitars långa dubbla supportrutiner för Darwin
  20. ^ "SPARC-alternativ (med GNU Compiler Collection (GCC))" . gcc.gnu.org . Hämtad 2022-10-06 .
  21. ^ "GCC 4.3 Release Series - Ändringar, nya funktioner och korrigeringar - GNU Project" . gcc.gnu.org . Hämtad 2022-10-06 .
  22. ^ a b Brian J. Gough och Richard M. Stallman, en introduktion till GCC , avsnitt 8.6 Floating-point issues (Network Theory Ltd., 2004).
  23. ^ "Betydande förändringar från NetBSD 6.0 till 7.0" .
  24. ^ "Visual Studio 2005 Pensionerad dokumentation" . Microsoft Download Center . Hämtad 2022-10-06 .
  25. ^ Intel C++ kompilatordokumentation, med alternativet -fp-modell (/fp) .
  26. ^ "IA-32 funktionskallande konventioner" .