Dobbeltpræcisions flydende punktformat- Double-precision floating-point format

Dobbeltpræcision floating-point format (undertiden kaldet FP64 eller float64 ) er et computernummerformat , der normalt optager 64 bit i computerens hukommelse; det repræsenterer et bredt dynamisk område af numeriske værdier ved hjælp af et flydende radixpunkt .

Flydende punkt bruges til at repræsentere fraktionsværdier, eller når der er brug for et bredere område end fastsat af fast punkt (med samme bitbredde), selvom det koster præcision. Dobbelt præcision kan vælges, når rækkevidden eller præcisionen af enkelt præcision ville være utilstrækkelig.

I IEEE 754-2008- standarden betegnes 64-bit base-2-format officielt som binær64 ; det blev kaldt dobbelt i IEEE 754-1985 . IEEE 754 angiver yderligere formater for flydende punkter, herunder 32-bit base-2 enkeltpræcision og for nylig base-10-repræsentationer.

Et af de første programmeringssprog, der leverede datatyper med enkelt og dobbelt præcision, flydende punkter, var Fortran . Før den udbredte vedtagelse af IEEE 754-1985 var repræsentationen og egenskaberne af datatyper med flydende punkter afhængig af computerproducenten og computermodellen og af beslutninger truffet af programmeringssprogede implementatorer. F.eks. Var GW-BASICs datatype med dobbelt præcision 64-bit MBF floating-point format.

IEEE 754 dobbeltpræcisions binært flydende punktformat: binary64

Dobbeltpræcision binært flydende punkt er et almindeligt anvendt format på pc'er på grund af dets bredere rækkevidde over et enkelt præcisions flydende punkt på trods af dets ydeevne og båndbreddeomkostninger. Det er almindeligt kendt ganske enkelt som dobbelt . IEEE 754 -standarden angiver, at en binær64 har:

Tegnbitten bestemmer tegnet på tallet (herunder når dette tal er nul, hvilket er signeret ).

Eksponentfeltet er et 11-bit usigneret heltal fra 0 til 2047 i forspændt form : en eksponentværdi på 1023 repræsenterer det faktiske nul. Eksponenter spænder fra −1022 til +1023, fordi eksponenter på −1023 (alle 0'er) og +1024 (alle 1'er) er forbeholdt særlige tal.

53-bit signifikant præcision giver fra 15 til 17 signifikante decimalcifre præcision (2 -53  ≈ 1,11 × 10 −16 ). Hvis en decimalstreng med højst 15 signifikante cifre konverteres til IEEE 754 dobbeltpræcisionsrepræsentation og derefter konverteres tilbage til en decimalstreng med samme antal cifre, skal det endelige resultat matche den originale streng. Hvis et IEEE 754 dobbeltpræcisionsnummer konverteres til en decimalstreng med mindst 17 betydende cifre og derefter konverteres tilbage til dobbeltpræcisionsrepræsentation, skal det endelige resultat matche det originale nummer.

Formatet skrives med signifikanten, der har et implicit heltal bit af værdi 1 (undtagen særlige data, se eksponentkodningen nedenfor). Med de 52 bits i brøkdelen (F), der vises i hukommelsesformatet, er den samlede præcision derfor 53 bit (ca. 16 decimalcifre, 53 log 10 (2) ≈ 15.955). Bitene er opstillet som følger:

IEEE 754 Double Floating Point Format.svg

Den reelle værdi, der antages af et givet 64-bit dobbelt-præcisionsdato med en given forudindtaget eksponent og en 52-bit fraktion, er

eller

Mellem 2 52 = 4.503.599.627.370.496 og 2 53 = 9.007.199.254.740.992 er de repræsentative tal nøjagtigt heltalene. For det næste område, fra 2 53 til 2 54 , multipliceres alt med 2, så de repræsentative tal er de lige ens osv. Omvendt for det tidligere område fra 2 51 til 2 52 er afstanden 0,5 osv.

Afstanden som en brøkdel af tallene i området fra 2 n til 2 n +1 er 2 n −52 . Den maksimale relative afrundingsfejl ved afrunding af et tal til det nærmeste repræsentative ( maskinens epsilon ) er derfor 2 −53 .

Eksponentens 11 bitbredde tillader repræsentation af tal mellem 10 −308 og 10 308 , med fuld præcision på 15–17 decimalcifre. Ved at gå på kompromis med præcisionen tillader den subnormale repræsentation endnu mindre værdier op til ca. 5 × 10 −324 .

Eksponentkodning

Den dobbelte præcision binære floating-point eksponent er kodet ved hjælp af en offset-binær repræsentation, hvor nul-offset er 1023; også kendt som eksponentbias i IEEE 754 -standarden. Eksempler på sådanne fremstillinger ville være:

e = = = 1: 00000000001200116 (mindste eksponent for normale tal )
e = = = 1023: 0111111111123ff16 (nul forskydning)
e = = = 1029: 10000000101240516
e = = = 2046: 1111111111027fe16 (højeste eksponent)

Eksponenterne og har en særlig betydning: 000167ff16

  • 000000000002= bruges til at repræsentere et underskrevet nul (hvis F = 0) og subnormaler (hvis F ≠ 0); og00016
  • 111111111112= bruges til at repræsentere (hvis F = 0) og NaNs (hvis F ≠ 0),7ff16

hvor F er den brøkdel af betydningen . Alle bitmønstre er gyldig kodning.

Bortset fra ovenstående undtagelser beskrives hele det dobbelte præcisionstal af:

I tilfælde af subnormaler ( e = 0) er dobbeltpræcisionstallet beskrevet af:

Uendelighed

Selvom de allestedsnærværende x86-processorer i dag bruger lidt endian-lagring til alle typer data (heltal, flydende punkt), er der en række hardware-arkitekturer, hvor floating-point- tal er repræsenteret i big-endian-form, mens heltal er repræsenteret i lille- endian form. Der er ARM- processorer, der har halv lille-endian, halv stor-endian-floating-point-repræsentation for tal med præcision: begge 32-bit ord gemmes i lille-endian som heltalsregistre, men det mest betydningsfulde først. Fordi der har været mange floating-point-formater uden nogen " netværks " standardrepræsentation for dem, bruger XDR- standarden big-endian IEEE 754 som repræsentation. Det kan derfor forekomme mærkeligt, at den udbredte IEEE 754 floating-point-standard ikke angiver enighed. Teoretisk betyder dette, at selv standard IEEE-flydende-punktdata skrevet af en maskine muligvis ikke kan læses af en anden. På moderne standardcomputere (dvs. implementering af IEEE 754) kan man imidlertid i praksis sikkert antage, at endeværdigheden er den samme for floating-point-tal som for heltal, hvilket gør konverteringen ligetil uanset datatype. (Små integrerede systemer, der bruger specielle flydende punktformater, kan dog være en anden sag.)

VAX floating point gemmer små-endiske 16-bit ord i big-endian rækkefølge.

Dobbeltpræcisionseksempler

0 01111111111 0000000000000000000000000000000000000000000000000000 2 ≙ 3FF0 0000 0000 0000 16 ≙ +2 0 × 1 = 1
0 01111111111 000000000000000000000000000000000000000000000001 2 ≙ 3FF0 0000 0000 0001 16 ≙ +2 0 × (1 + 2 −52 ) ≈ 1.0000000000000002, det mindste antal> 1
0 01111111111 0000000000000000000000000000000000000000000000000010 2 ≙ 3FF0 0000 0000 0002 16 ≙ +2 0 × (1 + 2 -51 ) ≈ 1,0000000000000004
0 10000000000 0000000000000000000000000000000000000000000000000000000000000000 2 ≙ 4000 0000 0000 0000 16 ≙ +2 1 × 1 = 2
1 10000000000 0000000000000000000000000000000000000000000000000000000000000000 2 ≙ C000 0000 0000 0000 16 ≙ −2 1 × 1 = −2
0 10000000000 1000000000000000000000000000000000000000000000000000000000000000 2 ≙ 4008 0000 0000 0000 16 ≙ +2 1 × 1,1 2 = 11 2 = 3
0 10000000001 000000000000000000000000000000000000000000000000000000000000 2 ≙ 4010 0000 0000 0000 16 ≙ +2 2 × 1 = 100 2 = 4
0 10000000001 010000000000000000000000000000000000000000000000000000000000 2 ≙ 4014 0000 0000 0000 16 ≙ +2 2 × 1,01 2 = 101 2 = 5
0 10000000001 100000000000000000000000000000000000000000000000000000000000000 2 ≙ 4018 0000 0000 0000 16 ≙ +2 2 × 1,1 2 = 110 2 = 6
0 10000000011 011100000000000000000000000000000000000000000000000000000000 2 ≙ 4037 0000 0000 0000 16 ≙ +2 4 × 1.0111 2 = 10111 2 = 23
0 01111111000 10000000000000000000000000000000000000000000000000000000 2 ≙ 3F88 0000 0000 0000 16 ≙ +2 −7 × 1,1 2 = 0,00000011 2 = 0,01171875 (3/256)
0 00000000000 000000000000000000000000000000000000000000000000000000000001 2 ≙ 0000 0000 0000 0001 16 ≙ +2 −1022 × 2 −52 = 2 −1074 ≈ 4.9406564584124654 × 10 −324 (Min. Subnormal positiv dobbelt)
0 00000000000 1111111111111111111111111111111111111111111111111111 2 ≙ 000F FFFF FFFF FFFF 16 ≙ +2 -1022 × (1 - 2 -52 ) ≈ 2,2250738585072009 × 10 -308 (Max subnormal dobbelt.)
0 00000000001 0000000000000000000000000000000000000000000000000000000000000000 2 ≙ 0010 0000 0000 0000 16 ≙ +2 −1022 × 1 ≈ 2.2250738585072014 × 10 −308 (min. Normal positiv dobbelt)
0 11111111110 1111111111111111111111111111111111111111111111111111 2 ≙ 7FEF FFFF FFFF FFFF 16 ≙ +2 1023 × (1 + (1 - 2 -52 )) ≈ 1,7976931348623157 × 10 308 (Maks. Double)
0 00000000000 0000000000000000000000000000000000000000000000000000000000000000 2 ≙ 0000 0000 0000 0000 16 ≙ +0
1 00000000000 0000000000000000000000000000000000000000000000000000000000000000 2 ≙ 8000 0000 0000 0000 16 ≙ −0
0 11111111111 0000000000000000000000000000000000000000000000000000 2 ≙ 7FF0 0000 0000 0000 16 ≙ + ∞ (positiv uendelig)
1 11111111111 0000000000000000000000000000000000000000000000000000 2 ≙ FFF0 0000 0000 0000 16 ≙ -∞ (negativ uendelig)
0 11111111111 0000000000000000000000000000000000000000000000000001 2 ≙ 7FF0 0000 0000 0001 16 ≙ NaN (sNaN på de fleste processorer, f.eks. X86 og ARM)
0 11111111111 10000000000000000000000000000000000000000000000 1 2 ≙ 7FF8 0000 0000 0001 16 ≙ NaN (qNaN på de fleste processorer, f.eks. X86 og ARM)
0 11111111111 1111111111111111111111111111111111111111111111111111 2 ≙ 7FFF FFFF FFFF FFFF 16 ≙ NaN (en alternativ kodning af NaN)
0 01111111101 0101010101010101010101010101010101010101010101010101 2 = 3FD5 5555 5555 5555 16 ≙ +2 -2 × (1 + 2 -2 + 2 -4 + ... + 2 -52 ) ≈ 1 / 3
0 10000000000 10010010010010011111101101010100010001000010110100011000 2 = 4009 21FB 5444 2D18 16 ≈ pi

Kodninger af qNaN og sNaN er ikke fuldstændigt specificeret i IEEE 754 og afhænger af processoren. De fleste processorer, såsom x86 -familien og ARM -familieprocessorerne, bruger den mest betydningsfulde bit af betydningsfeltet til at angive et stille NaN; dette er det, der anbefales af IEEE 754. PA-RISC- processorer bruger bitten til at angive et signal-NaN.

Som standard 1 / 3 runder ned, i stedet for op som enkelt præcision , på grund af det ulige antal bits i significand.

Mere detaljeret:

Given the hexadecimal representation 3FD5 5555 5555 555516,
  Sign = 0
  Exponent = 3FD16 = 1021
  Exponent Bias = 1023 (constant value; see above)
  Fraction = 5 5555 5555 555516
  Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here
        = 2−2 × (15 5555 5555 555516 × 2−52)
        = 2−54 × 15 5555 5555 555516
        = 0.333333333333333314829616256247390992939472198486328125
        ≈ 1/3

Udførelseshastighed med dobbelt præcision aritmetik

Brug af floatpunktvariabler med dobbelt præcision og matematiske funktioner (f.eks. Sin, cos, atan2, log, exp og sqrt) er langsommere end at arbejde med deres enkeltpræcisionsmotparter. Et område inden for computing, hvor dette er et særligt problem, er parallelkode, der kører på GPU'er. For eksempel, når du bruger NVIDIA 's CUDA platform, beregninger med dobbelt præcision tage, afhængig af en hardware, cirka 2 til 32 gange så lang tid at fuldføre forhold til dem gøres ved hjælp af enkelt præcision .

Præcisionsbegrænsninger på heltalsværdier

  • Heltal fra −2 53 til 2 53 (−9,007,199,254,740,992 til 9,007,199,254,740,992) kan nøjagtigt repræsenteres
  • Heltal mellem 2 53 og 2 54 = 18.014.398.509.481.984 runde til et multiplum af 2 (lige tal)
  • Heltal mellem 2 54 og 2 55 = 36.028.797.018.963.968 runde til et multiplum af 4

Implementeringer

Doubler implementeres på mange programmeringssprog på forskellige måder, f.eks. Følgende. På processorer med kun dynamisk præcision, f.eks. X86 uden SSE2 (eller når SSE2 ikke bruges til kompatibilitetsformål) og med udvidet præcision, der bruges som standard, kan software have svært ved at opfylde nogle krav.

C og C ++

C og C ++ tilbyder en lang række aritmetiske typer . Dobbelt præcision kræves ikke af standarderne (undtagen ved valgfrit bilag F til C99 , der dækker IEEE 754 -aritmetik), men på de fleste systemer doublesvarer typen til dobbelt præcision. Men på 32-bit x86 med udvidet præcision som standard kan nogle kompilatorer muligvis ikke overholde C-standarden, eller regningen kan lide af dobbelt afrunding .

Fortran

Fortran leverer flere heltal og reelle typer, og 64-bit typen real64, der er tilgængelig via Fortrans indre modul iso_fortran_env, svarer til dobbelt præcision.

Almindelig Lisp

Common Lisp leverer typerne KORT-FLOAT, SINGLE-FLOAT, DOUBLE-FLOAT og LONG-FLOAT. De fleste implementeringer giver SINGLE-FLOATs og DOUBLE-FLOATs med de andre typer passende synonymer. Common Lisp giver undtagelser for at fange floating-point underflows og overflows, og den inexakte floating-point undtagelse, i henhold til IEEE 754. Ingen uendeligheder og NaN'er er beskrevet i ANSI-standarden, men flere implementeringer giver disse dog som udvidelser.

Java

Java før version 1.2 skulle hver implementering være IEEE 754 -kompatibel. Version 1.2 tillod implementeringer at bringe ekstra præcision i mellemliggende beregninger til platforme som x87 . Således blev der indført en modifikator strictfp for at håndhæve strenge IEEE 754 -beregninger . Strengt flydende punkt er blevet gendannet i Java 17.

JavaScript

Som angivet i ECMAScript- standarden skal al aritmetik i JavaScript udføres ved hjælp af flydende punktaritmetik med dobbelt præcision.

Se også

  • IEEE 754 , IEEE standard for floating-point aritmetik

Noter og referencer