Wednesday, 13 September 2017

Float Point Nummer Representation Binära Alternativ


Flytande PointFixed-Point Numbers Fasta punkttal är ett enkelt och enkelt sätt att uttrycka fraktionerad antal, med ett fast antal bitar. System utan hårddiskstöd stödjer 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 refererar till läget för binärpunkten. Binärpunkten ä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. Räckvidden för ett fastpunktsnummer är skillnaden mellan det minsta antalet möjliga och maximalt antal möjliga. Precisionen för 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 så kan vi förvänta 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å. När vi multiplicerar 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 när 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 ena 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 befinner sig. 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 placering 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. Fast 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 vanligtvis 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 exakta 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 i 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 varvtalet 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 multiplicering) 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 väldigt snabb, även på långsamma 8-bitars mikrokontroller: det tar ett enda heltalstillägg och ignorerar överflödet. Andra format för att lagra vinklar kräver samma tillägg, plus speciella fall för att hantera kantfallet med över 360 grader eller underflödande 0 grader. Jämfört med att lagra vinklar i binärt vinkelformat, 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, som kräver extra steg att sträcka - sänka värdet till önskat område, eller resulterar i några bitmönster som inte är alla giltiga vinklar (NaN) eller båda. Genom att använda ett binärt vinkelformat i svängenheter kan vi snabbt (med skift-och-mask, 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 dessa lågordnade bitar för att beräkna kubisk interpolering. 4 Kanske är det vanligaste binära vinkelformatet brads. Brads Redigera Många inbyggda 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 byten, vilket alltså 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 tecknat heltal, från -128 till 127 brads en vinkel i varvtalsenheter, lagrad som en fraktionell sväng i osignerat 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 EditDecimal till Floating Point Converter Om decimal till flytande-punkt Converter Detta är en decimal till binär flytpunkts-omvandlare. Den kommer att konvertera ett decimaltal till det närmaste enkel precision och dubbel precision IEEE 754 binär flytpunkten, med rund-halv till jämn avrundning (standard IEEE-avrundningsläge). Det implementeras med arbiträr precision aritmetik, så dess omvandlingar är korrekt avrundade. Det kommer att konvertera både normala och subnormala tal och omvandlar tal som överflödar (till oändlighet) eller underflöde (till noll). Det resulterande flytpunktsnumret kan visas i tio blanketter: i decimal, i binärt, i normaliserad decimalvetenskaplig notation, i normaliserad binär vetenskaplig notation, som en normaliserad decimal, en effekt av två, som ett decimaltalstal gånger en kraft av två , som ett decimaltalstal gånger en effekt på tio, som en hexadecimal flytande punktkonstant, i rå binär och i rå hexadecimal. Varje formulär representerar det exakta värdet av det flytande punktnumret. Varför använda denna konverterare Den här konverteraren visar dig varför siffrorna i dina datorprogram, som 0,1, inte beter sig som du förväntas. Inuti datorn kan de flesta siffror med en decimalpunkt bara approximeras ett annat nummer, bara en liten bit bort från den du vill ha, måste stå för den. Till exempel, i en-precision flytpunkt, blir 0,1 0,100000001490116119384765625. Om ditt program skriver ut 0,1, ligger det för dig om det skriver 0,100000001, det ligger fortfarande, men åtminstone it8217s säger att du verkligen don8217t har 0,1. Så här använder du denna konverterare Ange ett positivt eller negativt tal, antingen i standardformat (t. ex. 134.45) eller exponent (t ex 1.3445e2). Ange fraktionsvärden med en decimalpunkt (lsquo. rsquo), och använd inte kommatecken. I huvudsak kan du ange vad ett datorprogram accepterar som en flytande punkt bokstavlig, förutom utan något suffix (som lsquofrsquo). Markera rutorna för den IEEE-precision du vill välja Dubbel. Singel. eller båda. (Dubbel är standard.) Dubbel betyder en 53-bitars significand (mindre om subnorm) med en 11-bitars exponent Singel betyder en 24-bitars significand (mindre om det är subnormalt) med en 8-bitars exponent. Markera rutorna för vilket utskriftsformat du vill välja en eller alla tio. (Decimal är standard.) Klicka på lsquoConvertrsquo för att konvertera. Klicka på lsquoClearrsquo för att återställa formuläret och börja från början. Om du vill konvertera ett annat nummer skriver du bara över det ursprungliga numret och klickar på lsquoConvertrsquo 8212 det finns ingen anledning att klicka på lsquoClearrsquo först. Det finns tio produktionsformer att välja mellan: Decimal. Visa det flytande punktnumret i decimal. (Utvid utmatningsfack, om det behövs, för att se alla siffror.) Binärt. Visa det flytande punktnumret i binärt. (Utöka utmatningsrutan om det behövs för att se alla siffror.) Normaliserad decimalvetenskaplig notation. Visa det flytande punktnumret i decimal, men kompakt, med normaliserad vetenskaplig notering. (Utvid utmatningsrutan, vid behov, för att se alla siffror.) Normaliserad binär vetenskaplig notering. Visa det flytande punktnumret i binärt, men kompakt, med normaliserad binär vetenskaplig notering. Notera . Subnormala tal visas normaliserade, med deras faktiska exponent. Normaliserade decimaltimmar med en effekt på två. Visa det flytande punktnumret i en hybrid normaliserad vetenskaplig notation, som ett normaliserat decimaltal gånger en effekt av två. Decimalt heltal gånger en kraft av två. Visa det flytande punktnumret som ett decimaltalstal gånger en kraft på två. (Den binära representationen av decimaltalsatsen är bitmönstret för den flytande punktrepresentationen, mindre efterföljande nollor.) Denna form är mest intressant för negativa exponenter, eftersom den representerar det flytande punktnumret som en dyadisk fraktion. Decimalt heltal gånger en kraft på tio. Visa det flytande punktnumret som ett decimaltalstal gånger en effekt på tio. Denna form är mest intressant för negativa exponenter, eftersom den representerar det flytande punktnumret som en fraktion. (Utvid utmatningsbox, om det behövs, för att se alla siffror.) Hexadecimal flytande punkt konstant. Visa det flytande punktnumret som en hexadecimal flytpunkts-konstant. Notera . Det finns många sätt att formatera hexadecimala flytpunktkonstanter, som du skulle se om du till exempel jämförde utgången från Java, Visual C, Gcc C och Python-program. Skillnaderna mellan olika språk är ytliga, trots att 8212 släpkoder kan eller inte kan visas, positiva exponenter kan eller inte få ett plustecken, etc. Denna omvandlare formaterar konstanterna utan slutsatser och utan plustecken. Notera . Liksom många programmeringsspråk visar denna omvandlare unormaliserade subnormala tal, med deras exponenter inställda på minsta normala exponent. Notera . Den sista hexadecimala siffran i en hexadecimal flytande punktkonstant kan ha efterföljande binära 0s inom detta betyder inte nödvändigtvis att de finns i det valda IEEE-formatet. Rå binär. Visa det flytande punktnumret i dess råa IEEE-format (teckenbit följt av exponentfältet följt av significand-fältet). Rå hexadecimal. Visa flytpunkten i sitt råa IEEE-format, vilket motsvarar det råa binära formatet, men uttryckt kompakt i hexadecimalt. (Se här för mer information om dessa utmatningsformer.) Det finns två utgående flaggor: Otillräckliga. Om den är markerad visar det sig att omvandlingen var inexakt, det var att den skulle avrundas till en approximation av ingångsnumret. (Omvandlingen är otillräcklig när decimalutmatningen inte matchar decimalinmatningen, men det här är ett snabbare sätt att berätta.) Obs. Dessa omvandlarflaggar överflödar till oändligheten och underflödet till noll som oförändrad. Subnormal. Om den är markerad visar detta att numret var för litet och omvandlat med mindre än fullständig precision (den faktiska precisionen visas i parentes). Implementering Jag skrev den här konverteraren från grunden 8212. Det bygger inte på inbyggda konverteringsfunktioner som strtod () eller strtof () eller printf (). Den är baserad på den stora heltalbaserade algoritmen som jag beskriver i min artikel ldquoCorrect Decimal To Floating-Point med hjälp av Big Integers rdquo. I8217ve implementerade det med BCMath. Av praktiska skäl ställer Ive en godtycklig (något) gräns för längden på decimalinmatningen you8217ll får ett felmeddelande om du slår det. Detta kommer att filtrera ingångar som annars skulle gå över till oändlighet eller underflöde till noll, men det kommer också att hindra dig från att komma in i några ldquohardrdquo halvvägs avrundningsfall. (För rekordet accepterar dock denna omvandlare alla de svåra exemplen I8217 har diskuterats på min sida.) För alla ingångar som accepteras är utmatningen dock korrekt (trots att några buggar släpper ut min omfattande testning). Binära fraktioner Medan de fungerar desamma Principen är binära fraktioner annorlunda än decimalfrekvenser i vilka siffror de kan exakt representera med ett givet antal siffror, och därmed också i vilka nummer som resulterar i avrundningsfel: Specifikt kan binär endast representera dessa tal som en ändlig fraktion där nämnaren är en kraft av 2. Tyvärr inkluderar inte de flesta av de siffror som kan representeras som ändlig fraktion i basen 10, som 0,1. Avrundad till 4 siffror Avrundat värde som fraktion Så här får du redan ett avrundningsfel när du bara skriver ner ett nummer som 0,1 och kör det genom din tolk eller kompilator. Det är inte så stort som 380 och kan vara osynligt eftersom datorer skärs av efter 23 eller 52 binära siffror i stället för 4. Men felet är där och kommer att orsaka problem så småningom om du bara ignorerar det. Varför använda binära På den lägsta nivån är datorer baserade på miljarder elektriska element som endast har två tillstånd (vanligtvis låg och hög spänning). Genom att tolka dessa som 0 och 1 är det väldigt lätt att bygga kretsar för lagring av binära tal och beräkningar med dem. Även om det är möjligt att simulera uppförandet av decimaltal med binära kretsar, är det mindre effektivt. Om datorer använde decimaltal internt, har theyd mindre minne och långsammare på samma tekniknivå. Eftersom skillnaden i beteende mellan binära och decimaltal inte är viktigt för de flesta tillämpningar är det logiska valet att bygga datorer baserat på binära nummer och leva med det faktum att vissa extra försiktighetsåtgärder behövs för applikationer som kräver decimalliknande beteende. Floating Point Guide Hem Grundläggande Svar Referenser xkcd Number Formats

No comments:

Post a Comment