Denormaliserade tal ( eng. denormalized numbers ) eller subnormala tal [1] ( eng. subnormal numbers ) - en typ av flyttalstal , definierade i IEEE 754- standarden .
Tal är kodade : mantissan börjar på 0, inte 1 (ingen implicit ), och ordningen är den minsta möjliga. Denormaliserade tal är närmare 0 än det minsta representerade normaliserade talet. Maskin 0 är också ett denormaliserat tal.
När du skriver i float (enkel precision) , dubbla (dubbel precision) format , kommer 0 att skrivas i orderfältet.
Den 10-byte långa dubbeln (extended precision) har inte denormaliserade tal som en specialklass, eftersom den har en explicit heltalsbit. Däremot har tal med den minsta ordningen (i ordningsfältet 0) och biten i heltalsdelen 0 liknande egenskaper.
För att spara minne används den så kallade implicita enheten : siffror i binär standardform skrivs som 1,mmm 2 ·2 k , och huvudenheten bevaras inte. I det här formatet är det omöjligt att skriva noll - därför kommer maskinens noll nödvändigtvis att vara något speciellt nummer. För enkelhetens skull bör den ha en minimibeställning.
Det faktum att dessa specialtal inte bara är nollor, utan 0, mmm 2 −126 (i en 4-byte float ) har en ytterligare fördel: addition och subtraktion kommer inte att leda till spill (nollning av resultatet) om resultatet av operationen är inte en exakt 0 Med andra ord, tack vare införandet av denormaliserade tal är villkoren och ekvivalenta, oavsett hur nära (i mantissan) och små (i ordning ) tal vi subtraherar. Utan införandet av denormaliserade tal kan resultatet av en sådan operation bli 0, även om talen inte är lika. Detsamma gäller för tillägg av tal som är nära i absoluta värden, men med ett annat tecken. Detta kan vara oönskat, som att orsaka ett dividera-med-noll- fel om resultatet används som divisor [2] .
Däremot på MK-61- kalkylatorn, subtrahera 1,8 10 -99 - 1,2 10 -99 ger noll, även om siffrorna inte är lika.
Några[ vad? ] -processorer och matematiska samprocessorer arbetar med denormaliserade tal i hårdvara i samma hastighet som med normaliserade. I andra implementeras inte sådan hårdvarubearbetning (till exempel för att undvika att komplicera implementeringen av FPU) och små värden förs antingen till noll omedelbart (se anti-overflow ) eller bearbetas i operativsystemet i mjukvara. Det andra alternativet leder till en ökning av bearbetningstiden för denormaliserade tal.
Denormaliserade siffror implementerades i Intel 8087 matematiska coprocessor vid en tidpunkt då IEEE 754-standarden höll på att skrivas. De var den mest kontroversiella egenskapen i den föreslagna applikationen, som så småningom accepterades [3] , men denna implementering visade att denormaliserade siffror kunde hanteras i hårdvara i praktiken. Vissa implementeringar av flyttalsmoduler stöder inte denormaliserade tal i hårdvara, utan bearbetar dem i mjukvara. Även om denna bearbetning är transparent för användaren kan den göra att beräkningar som genererar eller tar emot denormaliserade siffror som indata tar mycket längre tid än samma beräkningar med normaliserade siffror.
Ett exempel på ett system där nummerpresentationsformatet inte inkluderade denormaliserade tal är ZX Spectrum .
Anledningen till att denormaliserade tal introducerades är en del av ett mer generellt beräkningsproblem med att hitta summan av tal med begränsad precision (se till exempel Kahans algoritm ). Dessutom uppstår problemet som löses genom införandet av denormaliserade tal i ett relativt smalt antal tal - nära underflödesgränsen . Men ett liknande problem kan också associeras med spill: om vi till exempel vill jämföra två siffror med olika tecken, vars ordning är maximal, kommer tillståndet att testas framgångsrikt och ge ett negativt resultat, och tillståndet kan leda till till ett spillfel. Sålunda, i det allmänna fallet, löser denormaliserade tal inte problemet med resultatet beroende på permutationen av termer, och en viss noggrannhet krävs fortfarande av programmeraren när man arbetar med flytande aritmetik. Om programmeraren måste arbeta med siffror på gränsen till underflöde verkar det mer lämpligt att byta till ett format med ett bredare spektrum av exponenter , eller använda speciella åtgärder för att kontrollera exponentens storlek , än att förlita sig på denormaliserade siffror. Dessutom måste du komma ihåg att denormaliserade tal har färre signifikanta siffror i mantissan jämfört med de vanliga för detta format, och detta är fyllt med en betydande förlust av noggrannhet.