Denormaliserede tal

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 21. april 2019; checks kræver 38 redigeringer .

Denormaliserede tal ( eng.  denormalized numbers ) eller subnormale tal [1] ( eng.  subnormale tal ) - en type flydende kommatal , defineret i IEEE 754 -standarden .

Tal er kodet : mantissen starter ved 0, ikke 1 (ingen implicit ), og rækkefølgen er den mindst mulige. Denormaliserede tal er tættere på 0 end det mindste repræsentative normaliserede tal. Maskine 0  er også et denormaliseret tal.

Når du skriver i float (enkelt præcision) , dobbelt (dobbelt præcision) formater , vil 0 blive skrevet i ordrefeltet.

Den 10-byte lange double (udvidet præcision) har ikke denormaliserede tal som en speciel klasse, da den har en eksplicit heltalsbit. Imidlertid har tal med den mindste orden (i ordensfeltet 0) og biten af ​​heltalsdelen 0 lignende egenskaber.

Forudsætninger for fremkomsten af

For at spare hukommelse bruges den såkaldte implicitte enhed : tal i binær standardform skrives som 1,mmm 2 ·2 k , og hovedenheden er ikke bevaret. I dette format er det umuligt at skrive nul - derfor vil maskinens nul nødvendigvis være et specielt tal. For nemheds skyld bør den have en minimumsbestilling.

Det faktum, at disse specielle tal ikke kun er nuller, men 0,mmm 2 -126 (i en 4-byte float ) har en yderligere fordel: addition og subtraktion vil ikke føre til overløb (nulstilling af resultatet), hvis resultatet af operationen er ikke et nøjagtigt 0 Med andre ord, takket være indførelsen af ​​denormaliserede tal, er betingelserne og ækvivalente, uanset hvor tætte (i mantissen) og små (i rækkefølge ) tal vi trækker fra. Uden introduktionen af ​​denormaliserede tal kunne resultatet af en sådan operation være 0, selvom tallene ikke er ens. Det samme gælder ved tilføjelse af tal, der er tæt på i absolut værdi, men med et andet fortegn. Dette kan være uønsket, såsom at forårsage en divider-med-nul fejl, hvis resultatet bruges som divisor [2] .

I modsætning hertil, på MK-61 lommeregneren, vil subtrahering af 1,8 10 -99  - 1,2 10 -99 give nul, selvom tallene ikke er ens.

Implementeringsproblemer

Nogle[ hvad? ] processorer og matematiske coprocessorer arbejder med denormaliserede tal i hardware med samme hastighed som med normaliserede. I andre er en sådan hardwarebehandling ikke implementeret (for eksempel for at undgå at komplicere implementeringen af ​​FPU'en), og små værdier bringes enten til nul med det samme (se anti-overløb ), eller behandles i operativsystemet i software. Den anden mulighed fører til en stigning i behandlingstiden for denormaliserede tal.

Denormaliserede tal blev implementeret i Intel 8087 matematiske coprocessor på et tidspunkt, hvor IEEE 754 standarden var ved at blive skrevet. De var det mest kontroversielle træk ved den foreslåede applikation, som til sidst blev accepteret [3] , men denne implementering viste, at denormaliserede tal kunne håndteres i hardware i praksis. Nogle implementeringer af floating-point-moduler understøtter ikke denormaliserede tal i hardware, men behandler dem i stedet i software. Selvom denne behandling er gennemsigtig for brugeren, kan den forårsage, at beregninger, der genererer eller modtager denormaliserede tal som input, tager meget længere tid end de samme beregninger med normaliserede tal.

Et eksempel på et system, hvor talrepræsentationsformatet ikke inkluderede denormaliserede tal, er ZX Spectrum .

Ulemper

Grunden til, at denormaliserede tal blev indført er en del af et mere generelt beregningsproblem med at finde summen af ​​tal ved hjælp af begrænset præcision (se f.eks. Kahans algoritme ). Desuden opstår problemet, der løses ved indførelsen af ​​denormaliserede tal, i et relativt snævert antal tal - nær underløbsgrænsen . Men et lignende problem kan også være forbundet med overløb: hvis vi for eksempel ønsker at sammenligne to tal med forskellige tegn, hvis rækkefølge er maksimal, vil tilstanden blive testet med succes og give et negativt resultat, og tilstanden kan føre til til en overløbsfejl. I det generelle tilfælde løser denormaliserede tal således ikke problemet med resultatet afhængigt af permutationen af ​​termer, og der kræves stadig en vis nøjagtighed fra programmøren, når man arbejder med flydende aritmetik. I tilfælde af at programmøren skal arbejde med tal på grænsen til underflow , virker det mere passende at skifte til et format med et bredere udvalg af eksponenter eller bruge specielle foranstaltninger til at kontrollere størrelsen af ​​eksponenten , end at stole på denormaliserede tal. Derudover skal du huske, at denormaliserede tal har færre signifikante cifre i mantissen sammenlignet med de sædvanlige for dette format, og dette er fyldt med et betydeligt tab af nøjagtighed.

Noter

  1. Nemnyugin S. A. Forelæsningsnotater til kurset "Introduktion til datalogi og programmeringssystemer", Forelæsning 9. Computerarkitektur: Datalagringsformater. Maskinregning. S. 5 Arkiveret 25. oktober 2018 på Wayback Machine
  2. William Kahan. IEEE 754R mødeprotokoller, 2002 (utilgængeligt link) . Hentet 1. december 2013. Arkiveret fra originalen 15. oktober 2016. (Engelsk)    
  3. Et interview med den gamle mand fra Floating-Point . University of California, Berkeley. Hentet 11. september 2016. Arkiveret fra originalen 25. april 2016.  (Engelsk)

Links