Fixed -point aritmetik - Fixed-point arithmetic

I computing , fast punkt henviser til en metode repræsentere fraktionelle (ikke-heltal) numre ved at lagre et fast antal cifre i deres brøkdelen. Dollarmængder , for eksempel, gemmes ofte med præcis to fraktionscifre, der repræsenterer cent (1/100 dollar). Mere generelt kan udtrykket referere til repræsentation af brøkværdier som heltalsmultipler af en fast, lille enhed, f.eks. En brøkmængde timer som et heltalsmultiple af ti minutters intervaller. Faste punkts repræsentation står ofte i kontrast til den mere komplicerede og beregningsmæssigt krævende floating-point repræsentation.

I fastpunktsrepræsentationen udtrykkes brøken ofte i det samme talbase som heltalsdelen, men ved hjælp af negative kræfter i basen b . De mest almindelige varianter er decimal (base 10) og binær (base 2). Sidstnævnte er almindeligvis også kendt som binær skalering . Hvis således n brøktal lagres, vil værdien altid være et heltal multiplum af b - n . Fixed-point-repræsentation kan også bruges til at udelade cifre med lav rækkefølge i heltalsværdier, f.eks. Når de repræsenterer store dollarværdier som multipler på $ 1000.

Når decimaltal med fast punkt vises til menneskelig læsning, er brøkcifrene normalt adskilt fra tallene i heltalet med et radixtegn (normalt '.' På engelsk, men ',' eller et andet symbol på mange andre sprog). Internt er der imidlertid ingen adskillelse, og sondringen mellem de to grupper af cifre defineres kun af de programmer, der håndterer sådanne tal.

Fixed-point-repræsentation var normen i mekaniske lommeregnere . Da de fleste moderne processorer har en fast floating point-enhed (FPU), bruges fastpunktsrepræsentationer nu kun i særlige situationer, f.eks. I billige integrerede mikroprocessorer og mikrokontroller ; i applikationer, der kræver høj hastighed og/eller lavt strømforbrug og/eller lille chipområde , f.eks. billede , video og digital signalbehandling ; eller når deres anvendelse er mere naturlig for problemet. Eksempler på sidstnævnte er regnskabsmæssig behandling af dollarbeløb, når brøkdele af cent skal afrundes til hele cent på strengt foreskrevne måder; og evaluering af funktioner ved hjælp af tabelopslag .

Repræsentation

Fixed-point repræsentation med skalering 1/100
Værdi
repræsenteret
Intern
repræsentation
0,00 0
0,5 50
0,99 99
2 200
−14,1 −1410
314.160 31416

En fastpunktsrepræsentation af et brøknummer er i det væsentlige et heltal , der implicit skal multipliceres med en fast skaleringsfaktor. For eksempel kan værdien 1,23 lagres i en variabel som heltalværdien 1230 med implicit skaleringsfaktor på 1/1000 (hvilket betyder, at de sidste 3 decimalcifre implicit antages at være en decimalbrøk), og værdien 1 230 000 kan blive repræsenteret som 1230 med en implicit skaleringsfaktor på 1000 (med "minus 3" underforståede decimalfraktionscifre, det vil sige med 3 implicitte nulcifre til højre). Denne repræsentation gør det muligt for standard heltal aritmetiske enheder at udføre rationelle talberegninger.

Negative værdier er normalt repræsenteret i binært fastpunktsformat som et signeret heltal i tos komplementrepræsentation med en implicit skaleringsfaktor som ovenfor. Tegnet på værdien vil altid blive angivet med den første lagrede bit (1 = negativ, 0 = ikke-negativ), selvom antallet af brøkbit er større end eller lig med det samlede antal bit. For eksempel ville det 8 -bit signerede binære heltal (11110101) 2 = −11, taget med -3, +5 og +12 underforståede brøkbit, repræsentere værdierne −11/2 −3 = −88, −11/ 2 5 = −0. 343 75 og −11/2 12 = −0. 002 685 546 875 , hhv.

Alternativt kan negative værdier repræsenteres med et helt tal i tegnstørrelsesformatet , i hvilket tilfælde tegnet aldrig er inkluderet i antallet af implicitte brøkbit. Denne variant er mere almindeligt anvendt i decimal-fast-aritmetik. Således ville det underskrevne 5 -cifrede decimaltal (−00025) 10 , taget med -3, +5 og +12 underforståede decimalfraktionscifre, repræsentere værdierne −25/10 −3 = −25000, −25/10 5 = −0.00025 og −25/10 12 = −0. 000 000 000 025 , hhv.

Et program vil normalt antage, at alle fastpunktsværdier, der vil blive lagret i en given variabel eller vil blive produceret af en given instruktion , vil have den samme skaleringsfaktor. Denne parameter kan normalt vælges af programmøren afhængigt af den nødvendige præcision og værdiområde, der skal lagres.

Skaleringsfaktoren for en variabel eller formel vises muligvis ikke eksplicit i programmet. God programmeringsskik kræver derefter, at den findes i dokumentationen , i det mindste som en kommentar i kildekoden .

Valg af skaleringsfaktorer

For større effektivitet vælges skaleringsfaktorer ofte til at være kræfter (positive eller negative) for basen b, der bruges til at repræsentere heltalene internt. Imidlertid er den bedste skaleringsfaktor ofte dikteret af applikationen. Således bruger man ofte skaleringsfaktorer, der er power på 10 (f.eks. 1/100 for dollarværdier), for menneskelig bekvemmelighed, selv når heltalene er repræsenteret internt i binært. Decimalskaleringsfaktorer passer også godt sammen med det metriske (SI) system , da valget af fastpunkts skaleringsfaktor ofte svarer til valget af en måleenhed (som centimeter eller mikrometer i stedet for meter ).

Imidlertid kan andre skaleringsfaktorer bruges lejlighedsvis, f.eks. Kan en brøkdel af timer repræsenteres som et helt tal sekunder; det vil sige som et fastpunktstal med skalafaktor på 1/3600.

Selv med den mest omhyggelige afrunding kan fastpunktsværdier repræsenteret med en skaleringsfaktor S have en fejl på op til ± 0,5 i det lagrede heltal, det vil sige ± 0,5 S i værdien. Derfor producerer mindre skaleringsfaktorer generelt mere præcise resultater.

På den anden side betyder en mindre skaleringsfaktor et mindre område af de værdier, der kan gemmes i en given programvariabel. Den maksimale fastpunktsværdi, der kan lagres i en variabel, er den største heltalværdi, der kan lagres i den, ganget med skaleringsfaktoren; og tilsvarende for minimumsværdien. For eksempel giver tabellen nedenfor den implicitte skaleringsfaktor S , minimums- og maksimumværdier, der kan repræsenteres V min og V max , og nøjagtigheden δ = S /2 for værdier, der kunne repræsenteres i 16-bit signeret binært fastpunktsformat, afhængigt af antallet f af underforståede fraktion bits.

Parametre for nogle 16-bit signerede binære fastpunktsformater
f S δ V min V maks
−3 1/2 −3 = 8 4 - 262 144 + 262 143
0 1/2 0 = 1 0,5 - 32 768 + 32767
5 1/2 5 = 1/32 <0,016 −1024. 000 00 +1023. 968 75
14 1/2 14 = 1/16 384 <0,000 031 −2. 000 000 000 000 00 00 +1. 999 938 964 843 75
15 1/2 15 = 1/32 768 <0 000 016 −1. 000 000 000 000 000 000 +0. 999 969 482 421 875
16 1/2 16 = 1/65 536 <0,000 008 −0. 500 000 000 000 000 0 +0. 499 984 741 210 937 5
20 1/2 20 = 1/1 048 576 <0 000 000 5 −0. 031 250 000 000 000 000 000 00 +0. 031 249 046 325 683 593 75

Fixed -point -formater med skaleringsfaktorer i formen 2 n -1 (nemlig 1, 3, 7, 15, 31 osv.) Er blevet sagt at være passende til billedbehandling og andre digitale signaloverførselsopgaver. De formodes at give mere konsekvente konverteringer mellem faste og flydende punktværdier end den sædvanlige 2 n- skalering. Programmeringssproget Julia implementerer begge versioner.

Præcise værdier

Enhver binær fraktion a /2 m , såsom 1/16 eller 17/32, kan nøjagtigt repræsenteres i et fast punkt, med en effekt-på-to skaleringsfaktor 1/2 n med enhver nm . De fleste decimalfraktioner som 0,1 eller 0,123 er imidlertid uendelige gentagende brøker i basis 2. og kan derfor ikke repræsenteres på den måde.

På samme måde kan enhver decimalfraktion a /10 m , såsom 1/100 eller 37/1000, nøjagtigt repræsenteres i et fast punkt med en effekt-på-ti skaleringsfaktor 1/10 n med en hvilken som helst nm . Dette decimalformat kan også repræsentere enhver binær brøk a /2 m , f.eks. 1/8 (0,125) eller 17/32 (0,53125).

Mere generelt kan et rationelt tal a / b , med a og b relativt primært og b positivt, kun nøjagtigt repræsenteres i binært fastpunkt, hvis b er en effekt på 2; og kun i decimalfast punkt, hvis b ikke har andre primfaktorer end 2 og/eller 5.

Sammenligning med flydepunkt

Fastpunktsberegninger kan være hurtigere og/eller bruge mindre hardware end flydende punkt. Hvis rækkevidden af ​​de værdier, der skal repræsenteres, er kendt på forhånd og er tilstrækkeligt begrænset, kan fastpunkt bedre udnytte de tilgængelige bits. For eksempel, hvis 32 bits er tilgængelige til at repræsentere et tal mellem 0 og 1, kan en fastpunktsrepræsentation have en fejl mindre end 1,2 × 10 −10 , hvorimod standardflydende repræsentation kan have fejl op til 596 × 10 −10 - fordi 9 af bitene er spildt med tegn og eksponent for den dynamiske skaleringsfaktor.

Programmer, der bruger beregninger med fast punkt, er normalt mere bærbare end dem, der bruger flydende punkt, da de ikke afhænger af tilgængeligheden af ​​en FPU. Denne fordel var særlig stærk, før IEEE Floating Point Standard blev bredt accepteret, når floating-point beregninger med de samme data ville give forskellige resultater afhængigt af producenten og ofte på computermodellen.

Mange indlejrede processorer mangler en FPU, fordi heltal aritmetiske enheder kræver væsentligt færre logiske porte og forbruger meget mindre chipområde end en FPU; og software -emulering af floating-point på lav-speed enheder ville være for langsom til de fleste applikationer. CPU -chips til de tidligere personlige computere og spilkonsoller , ligesom Intel 386 og 486SX , manglede også en FPU.

Den absolutte opløsning (forskellen mellem successive værdier) af enhver fast punkt format er konstant over hele spektret, nemlig skaleringsfaktoren S . I modsætning hertil er den relative opløsning af et floating-point-format omtrent konstant over hele deres område og varierer inden for en faktor af basen b ; der henviser til, at deres absolutte opløsning varierer med mange størrelsesordener, ligesom værdierne selv.

I mange tilfælde er afrundings- og afkortningsfejl i fastpunktsberegninger lettere at analysere end de tilsvarende ækvivalente flydende punktberegninger. På den anden side kræver brug af fast punkt større omhu fra programmereren. Undgåelse af overløb kræver meget strammere estimater for variablerne og alle mellemværdier i beregningen og ofte også ekstra kode for at justere deres skaleringsfaktorer.

Ansøgninger

En almindelig brug af decimal-fastpunkt er til lagring af monetære værdier, for hvilke de komplicerede afrundingsregler for flydende tal ofte er en forpligtelse. For eksempel skiftede open source- pengestyringsprogrammet GnuCash , skrevet i C, fra flydende til fast punkt fra version 1.6 af denne grund.

Binært fastpunkt (binær skalering) blev meget udbredt fra slutningen af ​​1960'erne til 1980'erne til real-time computing, der var matematisk intensiv, såsom flyvesimulering og i atomkraftværksstyringsalgoritmer . Det bruges stadig i mange DSP -applikationer og specialfremstillede mikroprocessorer. Beregninger, der involverer vinkler, ville bruge binær vinkelmåling (BAM).

Binært fastpunkt bruges i STM32G4- seriens CORDIC- co-processorer og i de diskrete cosinustransformation (DCT) -algoritmer, der bruges til at komprimere JPEG- billeder.

Operationer

Addition og subtraktion

For at tilføje eller fratrække to værdier med den samme implicitte skaleringsfaktor er det tilstrækkeligt at tilføje eller subtrahere de underliggende heltal; resultatet vil have deres fælles implicitte skaleringsfaktor, kan således lagres i de samme programvariabler som operanderne. Disse operationer gav den nøjagtige matematiske resultat, så længe der ikke overløb forekommer, det vil sige, så længe den resulterende heltal kan lagres i den modtagende program variabel . Hvis værdierne har forskellige skaleringsfaktorer, skal de konverteres til en fælles skaleringsfaktor før operationen.

Multiplikation

For at gange to fastpunktstal er det tilstrækkeligt at gange de to underliggende heltal og antage, at skaleringsfaktoren for resultatet er et produkt af deres skaleringsfaktorer. Resultatet vil være nøjagtigt uden afrunding, forudsat at det ikke overløber den modtagende variabel.

F.eks. Giver tallene 123 skaleret med 1/1000 (0,123) og 25 skaleret med 1/10 (2,5) heltalet 123 × 25 = 3075 skaleret med (1/1000) × (1/10) = 1/10000 , det vil sige 3075/10000 = 0,3075. Som et andet eksempel giver multiplikation af det første tal med 155 implicit skaleret med 1/32 (155/32 = 4.84375) heltalet 123 × 155 = 19065 med implicit skaleringsfaktor (1/1000) × (1/32) = 1/32000 , det vil sige 19065/32000 = 0,59578125.

Division

For at dele to fastpunkts tal tager man heltalskvotienten for deres underliggende heltal og antager, at skaleringsfaktoren er kvotienten for deres skaleringsfaktorer. Generelt kræver den første division afrunding, og resultatet er derfor ikke præcist.

For eksempel giver division af 3456 skaleret med 1/100 (34,56) og 1234 skaleret med 1/1000 (1,234) heltalet 3456 ÷ 1234 = 3 (afrundet) med skalafaktor (1/100)/(1/1000) = 10, det vil sige 30. Som et andet eksempel giver divisionen af ​​det første tal med 155 implicit skaleret med 1/32 (155/32 = 4.84375) heltalet 3456 ÷ 155 = 22 (afrundet) med implicit skaleringsfaktor (1/ 100)/(1/32) = 32/100 = 8/25, det vil sige 22 × 32/100 = 7,04.

Hvis resultatet ikke er præcist, kan den fejl, der indføres ved afrundingen, reduceres eller endda elimineres ved at konvertere udbyttet til en mindre skaleringsfaktor. For eksempel, hvis r = 1,23 er repræsenteret som 123 med skalering 1/100, og s = 6,25 er repræsenteret som 6250 med skalering 1/1000, giver enkel division af heltalene 123 ÷ 6250 = 0 (afrundet) med skaleringsfaktor ( 1/100)/(1/1000) = 10. Hvis r først konverteres til 1.230.000 med skaleringsfaktor 1/1000000, bliver resultatet 1.230.000 ÷ 6250 = 197 (afrundet) med skalafaktor 1/1000 (0,197). Den nøjagtige værdi 1,23/6,25 er 0,1968.

Skaleringskonvertering

Ved fast-punkt-computing er det ofte nødvendigt at konvertere en værdi til en anden skaleringsfaktor. Denne handling er nødvendig, for eksempel:

  • At gemme en værdi i en programvariabel, der har en anden implicit skaleringsfaktor;
  • At konvertere to værdier til den samme skaleringsfaktor, så de kan tilføjes eller trækkes fra;
  • For at gendanne den oprindelige skaleringsfaktor for en værdi efter at have multipliceret eller delt den med en anden;
  • For at forbedre nøjagtigheden af ​​resultatet af en division;
  • For at sikre, at skaleringsfaktoren for et produkt eller en kvotient er en simpel effekt som 10 n eller 2 n ;
  • For at sikre, at resultatet af en operation kan lagres i en programvariabel uden overløb;
  • For at reducere omkostningerne ved hardware, der behandler fastpunktsdata.

At konvertere et nummer fra et fast punkt type med skaleringsfaktor R til en anden type med skaleringsfaktoren S , skal den underliggende heltal multipliceres med forholdet R / S . For eksempel at konvertere værdien 1,23 = 123/100 fra skaleringsfaktor R = 1/100 til et med skaleringsfaktor S = 1/1000, skal heltalet 123 multipliceres med (1/100)/(1/1000 ) = 10, hvilket giver repræsentationen 1230/1000.

Hvis skaleringsfaktoren er en effekt af basen, der bruges internt til at repræsentere heltalet, kræver ændring af skaleringsfaktoren kun at slippe lavtordenscifre i heltalet eller tilføje nulcifre. Denne handling skal dog bevare nummerets tegn. I tos komplementrepræsentation betyder det at udvide tegnbitten som ved aritmetiske skiftoperationer .

Hvis S ikke deler R (især hvis den nye skaleringsfaktor S er større end den oprindelige R ), skal det nye heltal muligvis afrundes .

Navnlig hvis r og s er fast punkt variable med implicitte skaleringsfaktorer R og S , de operation rr × s kræver gange de respektive heltal og udtrykkeligt dividere resultatet med S . Resultatet skal muligvis afrundes, og der kan forekomme overløb.

For eksempel, hvis den fælles skaleringsfaktor er 1/100, medfører multiplikation af 1,23 med 0,25 multiplikation af 123 med 25 for at give 3075 med en mellemliggende skaleringsfaktor på 1/10000. For at vende tilbage til den oprindelige skaleringsfaktor 1/100 skal heltalet 3075 derefter multipliceres med 1/100, det vil sige divideret med 100, for at give enten 31 (0,31) eller 30 (0,30), afhængigt af afrundingspolitikken Brugt.

Tilsvarende operationen rr / s vil kræve opdeling af hele tal og udtrykkeligt multiplicere kvotienten af S . Afrunding og/eller overløb kan også forekomme her.

Konvertering til og fra floating-point

For at konvertere et tal fra flydende til fast punkt kan man dividere det med skaleringsfaktoren S og derefter afrunde resultatet til det nærmeste heltal. Der skal udvises omhu for at sikre, at resultatet passer ind i destinationsvariablen eller -registret. Afhængigt af skaleringsfaktoren og lagringsstørrelsen og intervallets inputnumre kan konverteringen muligvis ikke indebære nogen afrunding.

Hvis du vil konvertere et fast punkt nummer til floating-point, kan man konvertere heltal til floating-point og så gange det med skaleringsfaktoren S . Denne konvertering kan indebære afrunding, hvis heltalets absolutte værdi er større end 2 24 (for binært enkeltpræcision IEEE-flydende punkt) eller 2 53 (for dobbeltpræcision). Overflow eller underflow kan forekomme, hvis | S | er henholdsvis meget stor eller meget lille.

Hardware support

Skalering og renormalisering

Typiske processorer har ikke specifik support til fast-punkts aritmetik. De fleste computere med binær aritmetik har imidlertid hurtige bitskiftinstruktioner , der kan multiplicere eller dividere et helt tal med en hvilken som helst effekt på 2; i særdeleshed en aritmetisk skiftinstruktion . Disse instruktioner kan bruges til hurtigt at ændre skaleringsfaktorer, der er 2 -magt, samtidig med at tegnets tegn bevares.

Tidlige computere som IBM 1620 og Burroughs B3500 brugte en binær-kodet decimal (BCD) repræsentation for heltal, nemlig base 10, hvor hvert decimaltal uafhængigt blev kodet med 4 bit. Nogle processorer, f.eks. Mikrokontrollere, kan stadig bruge det. I sådanne maskiner kan konvertering af decimalskaleringsfaktorer udføres ved bitskift og/eller ved manipulation af hukommelsesadresser.

Nogle DSP -arkitekturer tilbyder indbygget understøttelse af specifikke fastpunktsformater, f.eks. Underskrevne n -bit -tal med n −1 brøkbit (hvis værdier kan variere mellem −1 og næsten +1). Understøttelsen kan omfatte en multiplikationsinstruktion, der omfatter renormalisering - skaleringskonvertering af produktet fra 2 n −2 til n −1 fraktionsbit. Hvis CPU'en ikke leverer denne funktion, skal programmøren gemme produktet i et stort nok register eller en midlertidig variabel og kode renormaliseringen eksplicit.

Flyde over

Overløb sker, når resultatet af en aritmetisk handling er for stort til at blive gemt i det udpegede destinationsområde. Derudover og subtraktion kan resultatet kræve en smule mere end operanderne. Ved multiplikation af to usignerede heltal med m og n bits kan resultatet have m + n bits.

I tilfælde af overløb går de store ordrer normalt tabt, da det ikke-skalerede heltal reduceres modulo 2 n, hvor n er størrelsen på lagerområdet. Især tegnbitten går tabt, hvilket radikalt kan ændre tegnet og størrelsen af ​​værdien.

Nogle processorer kan sætte en hardware overløb flag og / eller generere en undtagelse på forekomsten af et overløb. Nogle processorer kan i stedet levere mætningsrekning : Hvis resultatet af en tilføjelse eller subtraktion skulle flyde over, gemmer de i stedet den værdi med størst størrelse, der kan passe i modtageområdet og har det korrekte tegn.

Disse funktioner er imidlertid ikke særlig nyttige i praksis; det er generelt lettere og mere sikkert at vælge skaleringsfaktorer og ordstørrelser for at udelukke muligheden for overløb eller for at kontrollere operanderne for store værdier, før operationen udføres.

Computersprogsunderstøttelse

Eksplicit støtte til fast-punkt repræsentation og beregninger blev leveret af et par computersprog, især PL/I , COBOL , Ada , JOVIAL og Coral 66 . De leverede numeriske datatyper med fast punkt , binære og/eller decimaler, der kunne tildeles variabler og funktioner. Compilatoren ville derefter automatisk generere kode til at foretage de korrekte skaleringskonverteringer ved oversættelse af udsagn som rs × t + u , når man læser eller skriver værdierne for disse variabler, eller når man konverterer dem til andre datatyper såsom floating-point.

De fleste af disse sprog blev designet mellem 1940 og 1990. Mere moderne sprog tilbyder normalt ingen datatyper med fast punkt eller understøttelse af skaleringsfaktorkonvertering. Det er også tilfældet for flere ældre sprog, der stadig er meget populære, som FORTRAN , C og C ++ . Den brede tilgængelighed af hurtige floating-point-processorer med strengt standardiseret adfærd har i høj grad reduceret efterspørgslen efter binær fastpunktsunderstøttelse. Tilsvarende har understøttelsen af decimalflydende punkt i nogle programmeringssprog, som C# og Python , fjernet det meste af behovet for decimal fixpunktsunderstøttelse. I de få situationer, der kræver fastpunktsoperationer, kan de implementeres af programmereren med eksplicit skaleringskonvertering i ethvert programmeringssprog.

På den anden side, alle relationelle databaser og SQL notation støtte fast punkt decimal aritmetik og lagring af numre. PostgreSQL har en særlignumerisk type til nøjagtig lagring af tal med op til 1000 cifre.

Desuden udsendte International Standards Organization (ISO) i 2008 et forslag om at udvide C-programmeringssproget med datatyper med fast punkt til fordel for programmer, der kører på integrerede processorer. Også den GNU Compiler Collection (GCC) har back-end support til fast punkt.

Detaljerede eksempler

Decimal multiplikation af fast punkt

Antag, at der er følgende multiplikation med 2 faste punkt 3 decimaltal.

(10.500) (1.050) = 1*10.500 + 0.050*10.500 = 10.500 + 0.525000 = 11.025000

Bemærk hvordan vi viser de efterfølgende nuller, da der er 3 decimaler. For at karakterisere dette igen som en heltalsmultiplikation skal vi først multiplicere med 1000 (10^3) ​​og flytte alle decimaler ind til heltalspladser, derefter vil vi gange med (10^-3) for at sætte dem tilbage ligningen ser nu ud som

(10.500)(10^(3)) (1.050)(10^(3))  (10^(-3))(10^(-3))
= (10500)(1050) (10^-6)
= 11 025 000  (10^-6)
= 11.025000

Dette fungerer tilsvarende, hvis vi vælger en anden base, især base 2 til computing, da et bitskift er det samme som en multiplikation eller division med en rækkefølge på 2. Tre decimalcifre svarer til cirka 10 binære cifre, så vi bør runde 0,05 til 10 bits efter det binære punkt. Den nærmeste tilnærmelse er derefter 0,0000110011.

10= 8+2=2^3+2^1
1=2^0
0.5= 2^-1
0.05= 0.0000110011_2

Således bliver vores multiplikation

(1010.100)(2^3)(1.0000110011)(2^10) (2^-13)
=(1010100)(10000110011) (2^-13)
=(10110000010111100) (2^-13)
=1011.0000010111100

Dette runder til 11.023 med tre cifre efter decimalpunktet.

Binær fast-punkt multiplikation

Overvej opgaven med at beregne produktet fra 1.2 og 5.6 med binært fast punkt ved hjælp af 16 fraktionsbit. For at repræsentere de to tal multiplicerer man dem med 2 16 og opnår 78 643 .2 og 367 001 .6; og afrund disse værdier de nærmeste heltal og opnår 78 643 og 367 002 . Disse tal passer komfortabelt ind i et 32-bit ord med tos komplement signeret format.

Multiplicering af disse heltal giver 35-bit heltalet 28 862 138 286 med 32 fraktionsbit uden nogen afrunding. Bemærk, at lagring af denne værdi direkte i en 32-bit heltalsvariabel ville resultere i overløb og tab af de mest signifikante bits. I praksis ville det sandsynligvis blive gemt i en signeret 64-bit heltalsvariabel eller -register .

Hvis resultatet skal lagres i samme format som dataene, med 16 brøkbit, skal dette heltal divideres med 2 16 , hvilket giver cirka 440 401 .28 og derefter afrundes til det nærmeste heltal. Denne effekt kan opnås ved at tilføje 2 15 og derefter flytte resultatet med 16 bit. Resultatet er 440 401 , hvilket repræsenterer værdien 6. 719 985 961 914 062 5 . Under hensyntagen til formatets præcision udtrykkes denne værdi bedre som 6. 719 986 ± 0. 000 008 (ikke medregnet den fejl, der kommer fra operand -tilnærmelser). Det korrekte resultat ville være 1,2 × 5,6 = 6,72.

For et mere kompliceret eksempel, antag at de to tal 1.2 og 5.6 er repræsenteret i 32-bit fastpunktsformat med henholdsvis 30 og 20 brøkbit. Skalering med 2 30 og 2 20 giver 1 288 490 188 .8 og 5 872 025 .6, den runde til henholdsvis 1 288 490 189 og 5 872 026 . Begge tal passer stadig i en 32-bit signeret heltalsvariabel og repræsenterer brøkerne

1. 200 000 000 186 264 514 923 095 703 125 og
5. 600 000 381469 726 562 50

Deres produkt er (nøjagtigt) det 53-bit heltal 7566047890552914 , som har 30+20 = 50 underforståede brøkbit og derfor repræsenterer brøkdelen

6. 720 000 458 806 753 229 623 609513 510

Hvis vi vælger at repræsentere denne værdi i et signeret 16-bit fast format med 8 brøkdele, skal vi dividere heltalsproduktet med 2 50-8 = 2 42 og afrunde resultatet; som kan opnås ved at tilføje 2 41 og skifte med 42 bit. Resultatet er 1720, hvilket repræsenterer værdien 1720/2 8 = 6. 718 75 eller cirka 6,719 ± 0,002.


Notationer

Forskellige notationer er blevet brugt til præcist at specificere parametrene for et fastpunktsformat. I den følgende liste repræsenterer f antallet af brøkdele, m antallet af størrelser eller heltal bits, s antallet af tegn bits og b det samlede antal bits.

  • Den COBOL programmeringssprog oprindeligt støttet decimal fast præcision med arbitrær størrelse og decimal skalering, hvis format blev angivet "grafisk" med PICdirektivet. Eksempelvis PIC S9999V99angivet et 6-cifret decimalheltal i tegnstørrelse med to decimalbrøkcifre.
  • Konstruktionen REAL FIXED BINARY (p ,f) blev brugt i PL/I programmeringssproget til at specificere en fast punkt signeret binær datatype med p total bits (ikke inklusive tegn) med f bits i brøkdelen; det er et p +1 bit signeret heltal med en skaleringsfaktor på 1/2 f . Sidstnævnte kan være positiv eller negativ. Man kunne angive i COMPLEXstedet for REALog i DECIMALstedet for BINARYfor base 10.
  • I programmeringssproget Ada kunne en numerisk datatype specificeres ved f.eks. At type F is delta 0.01 range -100.0 .. 100.0betyde en fastpunktsrepræsentation, der består af et signeret binært heltal i tos komplementformat med 7 implicitte brøkbit (med en skaleringsfaktor 1/128) og mindst 15 bits i alt (hvilket sikrer et faktisk område fra -128,00 til næsten +128,00).
  • Den Q notation blev defineret ved Texas Instruments . Man skriver Qf for at angive en signeret binær fastpunktsværdi med f- brøkbit; for eksempel Q15angiver et signeret heltal i tos komplementnotation med en skaleringsfaktor 1/2 15 . Koden Qm .f angiver endvidere, at tallet har m bits i heltalens del af værdien, uden at tælle tegnet bit. Således Q1.30ville beskrive et binært fastpunktsformat med 1 heltal bit og 30 brøkdele, som kunne lagres som et 32-bit 2's komplement heltal med skaleringsfaktor 1/2 30 . En lignende notation er blevet brugt af ARM , bortset fra at de tæller tegnbitten i værdien af m ; så det samme format ovenfor ville blive specificeret som Q2.30.
  • Notationen Bm er blevet brugt til at betyde et fast binært format med m bits i heltaldelen; resten af ​​ordet er brøkdele. For eksempel er de maksimale og mindste værdier, der kan gemmes i et signeret B16nummer, henholdsvis 732767.9999847 og −32768.0.
  • Den VISSIM Virksomheden anvendte fxm .b til at betegne en binær fast punkt værdi med b samlede bits og m bits i heltalsdelen; dvs. en b -bit heltal med skaleringsfaktor 1/2 b - m . Således fx1.16ville betyde et 16-bit tal med 1 bit i heltal delen og 15 i brøkdelen.
  • Den PS2 GS ( "Graphics Synthesizer" ) Brugervejledning bruger notationen s :m :f , hvor s angiver tilstedeværelse (0 eller 1) af tegn bit. Eksempelvis 0:5:3repræsenterer et usigneret 8-bit heltal med en skaleringsfaktor på 1/2 3 .
  • Programmeringssproget LabVIEW bruger notationen <s ,b ,m> til at angive parametrene for et 'FXP' fastpunktstal. Den s komponent kan være enten '+' eller '±', der betyder enten en usigneret eller 2-komplement underskrevet nummer hhv. Den b komponent er den totale antal bit, og m er antallet af bit i det hele tal del.

Eksempler på softwareapplikationer

  • Det populære TrueType- skrifttypeformat bruger 32-bit signeret binært fastpunkt med 26 bits til venstre for decimalet for nogle numeriske værdier i instruktionerne. Dette format blev valgt for at give den minimale mængde præcision, der kræves til hinting og af ydeevne.
  • Alle 3D-grafikmotorer på Sonys originale PlayStation , Sega's Saturn , Nintendos Game Boy Advance (kun 2D ), Nintendo DS (2D og 3D), Nintendo Gamecube og GP2X Wiz videospilsystemer, der manglede en FPU, brugte fastpunktsregning. PlayStation inkluderede hardwaresupport til 16-bit fastpunkt med 12 brøkdele i sin transformationskoprocessor.
  • Den TeX typesetting software, almindeligt anvendt af forskere og matematikere, bruger 32-bit signeret binær fast punkt med 16 fraktion bits til alle positioner beregninger. Værdierne tolkes som brøkdele af en typografers pointe . Metriske filer i TeX-skrifttyper bruger 32-bit signerede fastpunktsnumre med 12 brøkdele.
  • Tremor , Toast og MAD er softwarebiblioteker, der dekoder henholdsvis Ogg Vorbis , GSM Full Rate og MP3 lydformater. Disse codecs bruger aritmetik med fast punkt, fordi mange hardware-afkodning hardwareenheder ikke har en FPU.
  • Den WavPack tabsfri audio kompressor anvendelser fast komma. Valget blev begrundet i blandt andet bekymringen over, at forskellige flydende afrundingsregler i forskellige hardware kunne ødelægge komprimeringens tabsfri karakter.
  • Den Nest Labs Utilities bibliotek , giver et begrænset sæt af makroer og funktioner til faste komma tal, især når der beskæftiger sig med disse tal i forbindelse med sensorens prøvetagning og sensor udgange.
  • Den OpenGL ES 1.x specifikation omfatter et fast punkt profil, da det er en API rettet til indlejrede systemer, som ikke altid har en FPU.
  • De dc og bc programmer er vilkårlige præcision regnemaskiner, men kun holde styr på en (bruger-specificeret) fast antal decimaler.
  • Fractint repræsenterer tal som Q2.29 fastpunktsnumre for at fremskynde tegningen på gamle pc'er med 386 eller 486SX processorer, som manglede en FPU.
  • Doom var den sidste førstepersons skydespilstitel af id Software til at bruge en 16,16 fastpunktsrepræsentation til alle dens ikke-heltalsberegninger, herunder kortsystem, geometri, gengivelse, spillerbevægelse osv. Af kompatibilitetshensyn bruges denne repræsentation stadig i moderne Doom -kildeporte .
  • faste punktnumre bruges undertiden til lagring og manipulation af billeder og videorammer. Processorer med SIMD -enheder rettet mod billedbehandling kan indeholde instruktioner, der er egnede til håndtering af pakkede fastpunktsdata.
  • Programmeringssproget Q# til Azure- kvantecomputere , der implementerer kvantelogiske porte , indeholder et standard numerisk bibliotek til udførelse af fast-punkt-aritmetik på registre over qubits .

Se også

Referencer

Yderligere læsning

eksterne links