Flytande PointFixed-Point Numbers Fasta poängtal är ett enkelt och enkelt sätt att uttrycka fraktionerad antal, med ett fast antal bitar. System utan flytande punkts hårdvaru stöd använder ofta fastnummer för att representera bråknummer. (System utan hårdvarvstöd stödjer ett brett sortiment av hårdvara - från high-end fast punkt-DSP, FPGA, och dyra anpassade ASIC-enheter som bearbetar streaming media snabbare än någon flytande punkt enhet som någonsin byggts för extremt låga mikrokontroller ). Termen Fix-Point avser läget för binärpunkten. Den binära punkten är analog med decimalpunkten för ett bas-tio-tal, men eftersom detta är binärt snarare än decimal används en annan term. I binär kan bitarna vara 0 eller 1 och det finns ingen separat symbol för att ange var binärpunkten ligger. Vi föreställer oss dock, eller antar, att binärpunkten ligger vid en fast plats mellan utvalda bitar i numret. I ett 32-bitars tal kan vi exempelvis anta att binärpunkten existerar direkt mellan bitarna 15 (15 eftersom den första bitnumret är numrerad 0, inte 1) och 16, vilket ger 16 bitar för hela nummerdelen och 16 bitar för den fraktionerade delen. Observera att den mest signifikanta biten i hela talfältet generellt betecknas som teckenbiten som lämnar 15 bitar för hela talstyrkan. Bredd och precisionsredigering Bredden på ett fast punktnummer är det totala antalet bitar som är tilldelade för lagring för fastpunktsnumret. Om vi lagrar hela delen och fraktionen i olika lagringsplatser, är bredden den totala mängden lagring för numret. Området med ett fast punktnummer är skillnaden mellan det minsta möjliga antalet och det maximala antalet möjliga. Precisionen hos ett fastpunktsnummer är det totala antalet bitar för den fraktionerade delen av numret. Eftersom vi kan definiera var vi vill ha den fixerade binära punkten, kan precisionen vara ett tal upp till och inklusive bredden på numret. Observera dock att ju mer precision vi har, desto mindre totalt utbud har vi. Det finns ett antal standarder, men i den här boken kommer vi att använda n för bredden på ett fast punktnummer, p för precisionen, och R för det totala intervallet. Inte alla siffror kan representeras exakt med ett fast punktnummer, så att närmaste approximation används. Formeln för att beräkna integerrepresentationen (X) i ett Qm. n-format för ett floatnummer (x) är: Om du vill konvertera det tillbaka används följande formel: Några exempel i Q3.4-format: Slumpmässigt valda floats: Några exempel i det (extremt vanliga) 1 Q7.8-formatet: Eftersom binärpunktens position är helt konceptuell, är logiken för att lägga till och subtrahera fastnummer, identisk med den logik som krävs för att lägga till och subtrahera heltal. När vi lägger till en halv plus en halv i Q3.4-format, förväntar vi oss att se: Vilket är lika med en som vi skulle förvänta oss. Detta gäller lika med subtraktion. Med andra ord, när vi lägger till eller subtraherar fastnummer, kommer binärpunkten i summan (eller skillnaden) att ligga på exakt samma plats som i de två siffrorna som vi arbetar på. Vid multiplicering av två 8-bitars fastpunkttal behöver vi 16 bitar för att hålla produkten. Eftersom det finns ett annorlunda antal bitar i resultatet jämfört med ingångarna, bör den binära punkten förväntas röra sig. Det fungerar dock exakt samma sätt i binärt som det gör i decimal. När vi multiplicerar två siffror i decimal, är decimalpunktens placering N-siffror till vänster om produkternas högsta siffran, där N är summan av antalet siffror som ligger till höger om decimalpunkten i multiplikatorn och multiplikatorn . Således, i decimal då vi multiplicerar 0,2 gånger 0,02, får vi: Multiplikatorn har en siffra till höger om decimalpunkten, och multiplicanten har två siffror till höger om decimalpunkten. Produkten har sålunda tre siffror till höger om decimaltalet (det vill säga decimaltalet ligger tre siffror till vänster). Det fungerar detsamma i binärt. Från tilläggsexemplet ovan vet vi att den första halvan i Q3.4-format är lika med 0x8 i hexadecimal. Eftersom 0x8 gånger 0x8 i hex är 0x0040 (även i hex), kan fixpunktsresultatet också förväntas vara 0x0040 - så länge vi vet var binärpunkten ligger. Låt skriva ut produkten i binär: Eftersom både multiplikatorn och multiplicanten har fyra bitar till höger om binärpunkten, är binärpunktens plats i produkten åtta bitar till vänster. Således är vårt svar 00000000.01000000, vilket, som vi förväntar oss, motsvarar ett fjärdedel. Om vi vill att utmatningsformatet ska vara detsamma som formatet för inmatningen måste vi begränsa intervallet för ingångarna för att förhindra överflöde. Att konvertera från Q7.8 tillbaka till Q3.4 är en enkel fråga om att flytta produkten direkt med 4 bitar. Fasta punktnummer används ofta internt i digitala filter inklusive FIR och IIR-filter. Det finns ett antal praktiska överväganden för att implementera FIR - och IIR-algoritmer med hjälp av fastnummer. 2 3 Många inbyggda system som producerar sinusvågor, som DTMF-generatorer, lagrar ett sinusbord i programminnet. (Den används för att approximera matematiska sinus () och cosinus () funktioner). Eftersom sådana system ofta har mycket begränsade mängder programminne, används ofta fasta siffror två olika sätt när sådana tabeller används: värdena lagrade i tabellerna och bradsna brukade indexeras i dessa tabeller. Värden som lagras i sinusbordet Redigera vanligtvis en kvadrant av sinus - och cosinusfunktionerna lagras i den tabellen. Vanligtvis är det en kvadrant där dessa funktioner producerar utgångsvärden i intervallet 0 till 1. Värdena i sådana tabeller lagras vanligen som fasta nummer - ofta 16-bitars siffror i osignerat Q0.16-format eller 8-bitars nummer i unsigned Q0.8 värden. Det verkar finnas två populära sätt att hantera det faktum att Q0.16 inte kan hantera 1,0, det hanterar bara siffror från 0 till (1.0-2-16): (a) Skala med exakt en kraft på två (i det här fallet 216 ), som de flesta andra fastpunktssystem, och ersätta (klipp) värden för stora för att lagras som det största värdet som kan lagras: så 0 representeras som 0, 0,5 representerad som 0x8000, (1,0-2-16) representerad som 0xFFFF och 1.0 avkortad och representeras också som 0xFFFF. 4 (b) Skala med det största möjliga värdet (i detta fall 0xFFFF), så både max och minsta värden kan representeras exakt: så 0 representeras som 0, (1.0-2-16) representerad som 0xFFFE och 1,0 är representerad som exakt 0xFFFF. 5 Några personer ritar ganska noggranna cirklar och beräknar ganska noggrann sinus och cosinus med en Bezier spline. Tabellen blir 8 värden som representerar en enda Bezier-kurva som approximerar 18 av en cirkel till en noggrannhet av ca 4 delar per miljon eller 14 i en cirkel till en noggrannhet av ca 1 del i tusen. 6 7 Många föredrar att representera rotation (som vinklar) när det gäller varv. Heltalsdelen av svängningarna berättar hur många revolutioner som har hänt. Den fraktionerade delen av svängningarna, när de multipliceras med 360 (eller 1 2 8) med standardtecknad fastpunktsräkning, ger en giltig vinkel i intervallet -180 grader (radianer) till 180 grader (radianer). I vissa fall är det lämpligt att använda osignerad multiplikation (i stället för signerad multiplikation) i binär vinkel, vilket ger rätt vinkel i intervallet 0 till 360 grader (2 radianer). Den största fördelen att lagra vinklar som en fast punkt fraktion är en hastighet. Kombinera någon nuvarande positionsvinkel med någon positiv eller negativ inkrementell vinkel för att få den nya positionen är mycket snabb, även på långsamma 8-bitars mikrokontroller: det tar ett enda heltalstillägg och ignorerar överflöde. Andra format för att lagra vinklar kräver samma tillägg, plus speciella fall för att hantera kantfallet på 360 grader eller underflödande 0 grader. Jämfört med att lagra vinklar i binärvinkelformat, lagrar vinklar i något annat format - till exempel 360 grader för att ge en fullständig revolution eller 2 radianer för att ge en fullständig revolution - oundvikligen resulterar i lite mönster som ger vinklar utanför det intervallet, kräver extra steg att spridas - sänka värdet till önskat område, eller resulterar i några bitmönster som inte är giltiga vinklar alls (NaN) eller båda. Genom att använda ett binärt vinkelformat i svängenheter kan vi snabbt (med skift-och-maskera, undvika multiplicering) separera bitarna i: bitar som representerar heltalsvarv (ignoreras när vi tittar upp vinkelns sinus, bryter vissa system aldrig om att lagra dessa bitar i första hand) 2 bitar som representerar kvadrantbitarna som direkt används för att indexera in i uppslagstabellen med låg ordning mindre än ett steg i indextabellen (fasackumulatorbitar, ignorerad när man tittar upp vinkelns sinus utan interpolering) Lågordningsfasbitarna ger förbättrad frekvensupplösning, även utan interpolering. Vissa system använder lågorderbitarna för att linjärt interpolera mellan värdena i tabellen. 12 Detta gör att du kan få mer noggrannhet med ett mindre bord (spara programutrymmet) genom att offra några cykler på denna extra interpolationsberäkning. Några system får ännu mer noggrannhet med ett ännu mindre bord genom att offra några cykler för att använda de låga bitarna för att beräkna kubisk interpolering. 4 Kanske är det vanligaste binära vinkelformatet brads. Brads Redigera Många inbäddade system lagrar vinkeln, den fraktionerade delen av varv, i ett binärt vinkelformat för byte. 13 Det finns flera sätt att tolka värdet i den byte, vilket alla betyder (mer eller mindre) samma vinkel: en vinkel i enheter av brads (binära radianer) lagrade som ett 8 bitars osignerat heltal, från 0 till 255 brads en vinkel i enheter av brads lagrade som ett 8-bitars signerat heltal, från -128 till 127 brads en vinkel i varvtalsenheter, lagrad som en fraktionell vridning i unsigned Q0.8-format, från 0 till strax under 1 full vrid en vinkel i enheter av varv, lagrad som en fraktionell tur i signerat Q0.7 () format, från -12 till knappt 12 full tur En full tur 14 är 256 brads 15 är 360 grader. Om en enda byte inte ger tillräckligt med precision, kan bradsystemet enkelt utökas med mer fraktionerade bitar - 65.536 siffror per tur kan representeras i 16 bitar. 16 För vidare läsning Edit3.7.Binary Fixed Point Ett binärt fixerat system är ett annat exempel på ett arabiskt numeriskt system. Den enda skillnaden från decimal är radixen. Binär använder en radix av 2 istället för 10. Vi anger radix (bas) med ett prenumeration på numret. Från och med nu antar vi inte en bas av 10. 1001.101 2 1 2 3 0 2 2 0 2 1 1 2 0 1 2 -1 0 2 -2 1 2 -3 Ett enkelt sätt att läsa binärt är att arbeta åt vänster och direkt från binärpunkten, dubbla eller halvera värdet på siffrorna vid varje steg: De siffror som används i något arabiskt system varierar alltid från 0 till radix-1. Att använda större siffror skulle göra det möjligt att representera ett värde på mer än ett sätt. Om exempelvis binär fixpunkt tillåter användningen av siffran 2, kan numret två representeras som antingen 2 eller 10. 3.7.1. Begränsningar av binär konvertering 110 till binär. Kan inte göras: som att försöka representera 13 i decimal. Det kräver ett oändligt antal siffror. Detta är ett problem för monetära beräkningar. Lösningar (BCD, cent) Hemdatorvetenskap Förstå fasta och flytande punktnummerrepresentationer Förstå fasta och flytande punktnummerrepresentationer I mitt tidigare inlägg lärde vi oss de grundläggande begreppen om hur binärt kan användas för att representera reella tal (dvs. tal med en bråkdel komponent). När det gäller att lagra dessa siffror är det dock två stora tillvägagångssätt i modern databehandling. Dessa är notering med fast punkt och flytande punkt. I dagens inlägg fortsätter vi att bygga vår bakgrundsinformatik på datavetenskap och titta på detaljerna i dessa lagringsformat. Denna kunskap kommer att vara användbar i kommande inlägg när vi dyker in i datatyper de grundläggande byggstenarna i en iOS-applikation. Som vi lärde mig i mitt senaste inlägg har fraktionella binära nummer två delar, bitarna som representerar heltalet (delen före radixpunkten) och de bitar som representerar fraktionsdelen (delen efter radixpunkten). Tänk på det här Vad händer om vi bara hade ett begränsat antal binära bitar för att lagra vårt fraktionerade binära tal Detta är vanligt i många moderna datorsystem, Hur skulle vi veta hur många bitar som ska användas för heltal och hur många bitar som ska användas för den fraktionerade delen Det här är problemet att representationer för både fast punkt och flytande punktnoteringar försöker lösa. För att komma igång så tar vi en titt på fast punktnotering. Det är den enklare av de två representationerna. Fast punktrepresentation Fast punktnotering är en representation av vårt fraktionsnummer eftersom det lagras i minnet. I Fixed Point Notation lagras numret som ett signerat heltal i två komplementformat. Dessutom applicerar vi en notional split, där radix-punkten (separatorn mellan heltal och fraktionella delar) är ett fast antal bitar till vänster om den notationella utgångspunkten till höger om den minst signifikanta biten. Ive illustrerade detta i diagrammet nedan. När vi tolkar bitarna i det signerade heltalet som är lagrade i minnet flyttar vi radixpunkten genom att multiplicera det lagrade heltalet med en fast skalningsfaktor. Skalningsfaktorn i binär är alltid 2 upphöjd till en fast exponent. Eftersom skalningsfaktorn är en kraft på 2 flyttas radixpunkten till ett antal platser till vänster eller höger om utgångspunkten. Under denna omvandling finns tre riktningar som radixpunkten kan flyttas: Radix-punkten flyttas åt höger: Detta representeras av en skalfaktor vars exponent är 1 eller mer. I detta fall bifogas ytterligare nollor till höger om den minst signifikanta biten och betyder att det faktiska numret som representeras är större än det binära heltalet som lagrates. Radix-punkten förblir där den är: Detta representeras av en skaleringsfaktor vars exponent är 0 och betyder att det lagrade heltalet är exakt detsamma som det heltal som representeras. Radix-punkten flyttas till vänster: Detta representeras av en skaleringsfaktor vars exponent är negativ. Detta innebär att numret som representeras är mindre än det heltal som lagrats och innebär att numret som representeras har en fraktionskomponent. Låt oss titta på några exempel. Exempel på fastnummer Vi antar att vi har ett 8-bitars signerat binärt nummer 00011011 2 som lagras i minnet med 8 bitar av lagring (alltså ledande nollor). I vårt första scenario kan vi också anta att detta nummer lagrades som en signerad fastpunktsrepresentation med en skalfaktor på 2 2. Eftersom vår skalfaktor är större än 1, när vi översatte bitarna som lagras i minnet i det nummer som vi faktiskt representerar flyttar vi radixpunkten två platser till höger. Detta ger oss numret: 1101100 2 (Observera de ytterligare nollor som bifogas till höger om den minst signifikanta biten). I vårt andra scenario, låt oss anta att vi börjar med samma binära nummer i minnet men den här gången antar vi att den lagras som en signerad fastpunktsrepresentation med en skalfaktor på 2 -3. Eftersom exponenten är negativ flyttar vi radixpunkten tre platser till vänster. Detta ger oss numret 00011.011 2 Fördelar och nackdelar med fast punktrepresentation Den största fördelen med att använda en fastpunktsrepresentation är prestanda. Eftersom värdet lagrat i minnet är ett heltal kan CPU utnyttja många av de optimeringar som moderna datorer måste utföra heltalsräkning utan att behöva förlita sig på ytterligare hårdvaru - eller mjukvarulogik. Detta kan i sin tur leda till ökad prestanda, och när du skriver dina appar kan det därför leda till en förbättrad upplevelse för dina användare. Det finns dock en nackdel Fasta representationer har ett relativt begränsat antal värden som de kan representera. Så hur arbetar vi ut med maximala och minsta tal som kan lagras i en fastpunktsrepresentation och bestämmer om det passar våra behov Allt vi gör är att ta det största och minsta heltalvärdet som kan lagras i det angivna antalet bitar och multiplicera det med skalfaktorn som är associerad med vår fastpunktsrepresentation. För ett givet tecknat binärt tal med hjälp av b bitar med lagring med en skalfaktor f kan maximi - och minimivärdena som lagras vara: Om numret du vill representera passar in i detta intervall är det bra. Om det inte gör det måste du leta efter ett alternativ. Det här är där Floating Point Notation kommer in. Floating Point Notation Floating Point Notation är ett alternativ till Fix Point-notationen och är den representation som de flesta moderna datorer använder när man lagrar bråknummer i minnet . Floating Point Notation är ett sätt att representera mycket stora eller mycket små nummer exakt med hjälp av vetenskaplig notation i binär. Däremot ger Floating Point Representation varierande grader av precision beroende på omfattningen av de siffror du använder. Exempelvis är den precisionsnivå vi behöver när vi talar om avståndet mellan atomer (10-10 m) väldigt annorlunda än den precision vi behöver när vi talade om avståndet mellan jorden och solen (10 11 m). Detta är en stor fördel och tillåter ett mycket större antal siffror att representeras än vad som är möjligt i Fixed Point Notation. Floating Point Representation är baserad på Scientific Notation. Du kan ha använt vetenskaplig notering i skolan. När vi använder Vetenskaplig Notation i decimal (den form du är mest bekant med), skriver vi siffror i följande form: - Mantissa x 10 exponent I den här blanketten finns det ett valfritt tecken som anger om det totala antalet är positivt eller negativt följt av en mantissa (även känd som en significand) som är ett reellt (fraktionellt) tal som i sin tur multipliceras med en talbas (eller radix) som uppkommer av en exponent. Som vi vet, i decimal är den här basbasen 10. Floating Point Representation är i huvudsak vetenskaplig notering som tillämpas på binära nummer. I binär är den enda verkliga skillnaden att talbasen är 2 istället för 10. Vi skulle därför skriva flytande punkttal i följande formulär: - mantissa x 2 exponent Nu kanske du inte har insett det men när vi skriver siffror i vetenskapliga notation (om de är binära eller decimal) kan vi skriva dem på ett antal olika sätt. I decimal kunde vi skriva 1.5 x 10 2. 15 x 10 1 och 150 x 10 0 och ändå har alla dessa nummer exakt samma värde. Detta ger flexibilitet, men med denna flexibilitet kommer också förvirring. För att försöka ta itu med denna förvirring används en gemensam uppsättning regler som kallas normaliserad vetenskaplig notation för att definiera hur siffror i vetenskaplig notation normalt skrivs. Normaliserad vetenskaplig notering Normaliserad vetenskaplig notering är en nomenklatur som standardiserar hur vi skriver siffror i vetenskaplig notation. I normaliserad form har vi en enda nyckelregel: Vi väljer en exponent så att mantits absoluta värde förblir större än eller lika med 1 men mindre än talbasen. Låt oss titta på ett par exempel Om vi hade decimaltalet 50010 och ville skriva det i vetenskaplig notation kunde vi skriva det som antingen 500 x 10 0 eller 50 x 10 1. I normaliserad form skulle vi dock tillämpa regeln ovan och flytta radixpunkten så att endast en enda siffra, större än eller lika med 1 och mindre än (i detta fall) 10 var till vänster om radixpunkten. I det här fallet skulle det innebära att vi flyttade vår radix punkt två platser åt vänster så att vi hade 5,0 x 10. Vi skulle då behöva träna vår exponent. För att komma tillbaka till vårt ursprungliga nummer skulle vi behöva flytta vår radix punkt två platser till höger. Kom ihåg vad vi lärt oss tidigare Om vi måste flytta vår radix-punkt till höger om att komma tillbaka till vårt ursprungliga nummer betyder det att exponenten är positiv. Detta ger oss: 5,0 x 10 2. Låt oss titta på ett lite mer komplicerat exempel, den här gången i binär. Vad händer om vi hade binärt nummer 10.1 2. Vad skulle det vara i vetenskaplig notation Vi tillämpar igen reglerna: Vi måste ha en mantissa som är större än eller lika med 1 och mindre än vår nummerbas (vilken denna tid är 2). Det skulle innebära att vår mantissa skulle behöva vara 1,01 x 2. För att komma tillbaka till vårt ursprungliga nummer skulle vi behöva flytta vår radix punkt 1 till höger. Vad betyder rätt Det betyder att exponenten är positiv. Senaste exemplet. Den här gången är det lite svårare Föreställ dig att jag hade numret 0.111 2 och ville skriva det i normaliserad vetenskaplig notation Återigen tillämpar vi reglerna. Vi behöver en mantissa som är större än eller lika med 1 och mindre än 2. Det betyder att vi vill skriva vår mantissa som 1,11 x 2. För att komma tillbaka till vårt ursprungliga nummer skulle vi behöva flytta vår radix punkt 1 till vänster . Vad lärde vi oss om att flytta till vänster Det betyder att vår exponent är negativ. Det ger oss: 1,11 x 2 -1. IEEE 754-representationer Som du har utarbetat förmodligen, används Floating Point-nummer överallt i modern databehandling. Oavsett om det är den procentandel av marknaden som har uppgraderat till den senaste versionen av IOS, din iPhone-position och dess orientering i rymden eller hur mycket pengar som rinner in i ditt bankkonto efter att du har släppt din senaste blockbuster-app. På grund av dess Bred användning, har formatet som används för att lagra flytande punkttal i minnet standardiserats av Institutet för elektriska och elektroniska ingenjörer i något som heter IEEE 754. Denna standard definierar ett antal olika binära representationer som kan användas vid lagring av flytande punktnummer i minnet: Half Precision 8211 Används totalt 16 bitar totalt. Enkel Precision 8211 Används totalt 32 bitar av lagring. Double Precision 8211 Används totalt 64 bitar av lagring. Fyrvägs Precision 8211 Används totalt 128 bitar av lagring. I varje av dessa fall är deras grundläggande struktur följande: (-1) signera x mantissa x 2 exponent När det gäller lagring av flytande nummer i minnet lagras endast tre kritiska delar av den grundläggande strukturen: Diagrammet nedan visar dessa delar lagras i minnet: Som jag antyder ovanstående har alla fyra binära representationerna definierade i IEEE 754-standarden den mest signifikanta bit som en teckenbit och använder den för att lagra tecknet på det övergripande numret. I likhet med vad vi har sett i tidigare inlägg, om teckenbiten är klar (ett värde på 0) är det totala antalet positivt. Om biten är inställd (ett värde av 1) är siffran negativ. Exponent representerar kraften till vilken mantiten kommer att höjas. Det finns alltid ett fast antal exponentbitar vid lagring av en flytpunktsrepresentation i minnet och det exakta antalet bitar som används definieras av den särskilda IEEE 754-representationen (enkel precision, dubbel precision etc). Tja, ta en titt på det här inom kort. I alla fall måste exponenterna i var och en av dessa representationer kunna representera både positiva exponenter (för att representera mycket stora tal) och negativa exponenter (för att representera mycket små tal). För att undvika komplikationerna att behöva lagra exponenterna i två komplementformat används något som kallas en exponent förspänning. Exponent Bias Exponent Bias är där värdet som lagras för exponenten förskjuts från det faktiska exponentvärdet med en bias. Förspänningen är helt enkelt ett tal som läggs till exponenten för att säkerställa att det värde som lagras alltid är positivt. Tabellen nedan visar antalet bitar som används för exponenten i vart och ett av formaten, det tillåtna intervallet av värden de olika exponenterna kan ha innan de applicerar bias tillsammans med de tillåtna värdena efter tillämpning av bias: Förutom dessa format använder IEEE 754 standard definierar också ett antal numeriska symboler som det också är värt att veta om. Tja utforska dessa kortfattat i nästa avsnitt. Särskilda värden representerar noll Som vi har sett, när vi representerar antal i flytande punkt och lagrar dem i minnet skriver vi våra nummer i normaliserad form innan vi släpper den implicita inställda biten före radixpunkten. När numren i minnet tolkas, återges den implicita biten. Detta implicita antagande att biten omedelbart till vänster om radixpunkten är inställd på 1 orsakar dock problem. Vad händer om vi ville representera noll För att komma runt det problemet definierar IEEE 754-standarden noll som ett specialfall och representerar det med hjälp av en exponent av 0 och en mantissa på 0. På grund av att teckenbiten fortfarande är tillgänglig leder detta till värden av -0 och 0 standarden definierar att de måste jämföras lika. Denormaliserad form IEEE 754 möjliggör också representation av siffror i en denormaliserad form. Om bitarna i exponenten är alla nollor men mantiten är icke-nollvärde sägs numret lagras i en denormaliserad form. I det här fallet, när numret i minnet tolkas, ignoreras antagandet att det finns en bit satt till vänster om radixpunkten. Detta leder till siffror i formen: där s är tecknet och f är fraktionen i mantissen. IEEE-standard definierar också en mekanism för att representera oändlighet. Infinity representeras av en exponent med alla bitar och en mantissa med alla bitar rensade. Återigen förblir teckenbiten i effekt som leder till begreppet oändlighet och - infinitet. Inte ett nummer (NaN) Det sista som är av intresse för IEEE-standarden är begreppet Not A Number (NaN). Detta används för att representera ett tal som inte är ett riktigt tal. Detta representeras i minnet av en exponent med alla bitar och en non-zero mantissa. Vanligtvis ser du det här rapporteras av din kompilator, vanligtvis när du har försökt att dela upp något med noll. Sammanfattning av speciella värden Sammanfattningsvis visar tabellen nedan de olika värdena för exponent och mantissa och de speciella värden som representeras enligt IEEE 754-standarden: Introduktion till fast punktnummerrepresentation I verkligheten handlar vi om verkliga siffror - siffror med fraktionerad del. Mest moderna datorn har inbyggt (hårdvaru) stöd för flytande punktnummer. Användningen av flytpunkten är dock inte nödvändigtvis det enda sättet att representera bråknummer. I den här artikeln beskrivs fastpunktsrepresentationen av reella tal. Användningen av fast punktdatatyp används ofta i digital signalbehandling (DSP) och spelapplikationer, där prestanda ibland är viktigare än precision. Som vi kommer att se senare är fast punkträkningsmetod mycket snabbare än flytande punkträkning. Minns att ett binärt tal representerar värdet: 1 2 5 1 2 4 0 2 3 1 2 2 0 2 1 1 2 0 Om vi delar numret 53 med 2 vet vi att resultatet ska vara 26,5. Hur representerar vi det om vi bara hade heltalrepresentationer Nyckeln till att representera bråknummer, som 26,5 ovan, är begreppet binär punkt. En binär punkt är som decimalpunkten i ett decimalsystem. Det fungerar som en delare mellan heltalet och den delade delen av ett tal. I ett decimalsystem anger en decimalpunkt läget i ett tal som koefficienten ska multiplicera med 10 0 1. Till exempel i siffran 26.5 har koefficienten 6 en vikt av 10 0 1. Men vad händer med 5 till Avrundningsrätten Vi vet från vår erfarenhet att den bär en vikt av 10 -1. Vi vet att siffran quot26.5quot representerar värdet quottwenty six and a halfquot eftersom 2 10 1 6 10 0 5 10 -1 26,5 Det allra samma begreppet decimalpunkt kan tillämpas på vår binära representation, vilket gör en kvotpunktpunktpunkt. Liksom i decimalsystemet representerar en binär punkt koefficienten för termen 2 0 1. Alla siffror (eller bitar) till vänster om binärpunkten bär en vikt av 2 0. 2 1. 2 2. och så vidare. Siffror (eller bitar) till höger om binär punkt bär en vikt av 2 -1. 2 -2. 2 -3. och så vidare. Till exempel representerar numret: värdet: Nu, återkall i klassen, vi diskuterar att flytta ett heltal till höger genom att 1 bitposition motsvarar att dividera talet med 2. I fallet med heltal, eftersom vi inte har en bråkdel , vi kan helt enkelt inte representera siffra till höger om en binär punkt, vilket gör denna skiftprocess till ett heltal. Det är emellertid helt enkelt en begränsning av heltalrepresentationer av binärt tal. I allmänhet dividerar matematiskt, givet ett bestämt binärt punktläge, att bitmönstret av ett tal till höger med 1 bit alltid dividerar numret med 2. På samma sätt multiplicerar ett antal till vänster med 1 bit multipliceringen med 2. Förskjutningsprocessen ovan är nyckeln till förståelse av fast punktnummerrepresentation. För att representera ett riktigt tal i datorer (eller någon annan maskinvara i allmänhet) kan vi definiera en fastpunktsantalstyp helt enkelt genom att implicit fixa binärpunkten för att vara i någon position av ett tal. Vi kommer då helt enkelt att hålla sig till denna implicita konvention när vi representerar siffror. För att definiera en fast punkttyp konceptuellt är allt vi behöver två parametrar: bredden på talrepresentationen och binär punktposition inom numret. Vi använder notationen fixedltw, bgt för resten av denna artikel, där w betecknar antalet bitar används som helhet (bredden av ett tal), och b betecknar läget för binär punkträkning från den minst signifikanta biten (räknat från 0). Till exempel betecknar fixedlt8,3gt ett 8-bitars fastpunktsnummer, varav 3 höger flesta bitar är fraktionerade. Därför kan bitmönstret: När vi tittar på den här tabellen så kan vi lätt inse att vi kan representera numret -2.5 med bitmönstret quot1011quot, om vi antar att binärpunkten är i position 1. Nu bör du se att fasta punkttal är verkligen en nära släkting till heltalrepresentation. De två skiljer sig bara i läget för binär punkt. Faktum är att du faktiskt kan överväga heltalsrepresentation som en kvotspecial casequot av fasta poängtal, där binärpunkten ligger i position 0. Alla de aritmetiska operationer som en dator kan hantera på heltal kan därför också tillämpas på fast punktnummer. Därför är fördelen med fast punkträkning att de är lika rakt framåt och effektiva som heltal aritmetiska i datorer. Vi kan återanvända all hårdvara som byggts för för heltal aritmetik för att utföra realtalsräkning med fastpunktsrepresentation. Med andra ord kommer den fasta aritmetiken gratis på datorer. Nackdelen med fast punktnummer är naturligtvis förlusten av intervall och precision när det jämförs med flytpunktsrepresentationer. Till exempel, i en fixedlt8,1gt-representation, är vår fraktionsdel bara exakt för en kvantitet på 0,5. Vi kan inte representera nummer som 0.75. Vi kan representera 0,75 med fixedlt8,2gt. men då förlorar vi intervallet på heltalet. C har inte native quottypequot för fast punktnummer. However, due to the nature of fixed point representation, we simply dont need one. Recall all arithmetics on fixed point numbers are the same as integer, we can simply reuse the integer type int in C to perform fixed point arithmetic. The position of binary point only matters in cases when we print it on screen or perform arithmetic with different quottypequot (such as when adding int to fixedlt32,6gt ). Fixed point is a simple yet very powerful way to represent fractional numbers in computer. By reusing all integer arithmetic circuits of a computer, fixed point arithmetic is orders of magnitude faster than floating point arithmetic. This is the reason why it is being used in many game and DSP applications. On the other hand, it lacks the range and precision that floating point number representation offers. You, as a programmer or circuit designer, must do the tradeoff.
No comments:
Post a Comment