Saturday 21 October 2017

Flyttals Notation Binära Alternativ


Binära fraktioner Medan de fungerar i princip är binära fraktioner annorlunda än decimalfraktioner 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 nummer 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 Formats3.10.1. Grunderna Flytpunkten går runt begränsningarna av fast punkt genom att använda ett format som liknar vetenskaplig notering. Ett vetenskapligt notationsnummer består av en mantissa (3,52 i exemplet ovan) en radix (alltid 10) och en exponent (3 i exemplet ovan). Därför är det allmänna formatet för ett vetenskapligt noteringsvärde: mantissa x radix exponent Den normaliserade formen har alltid en mantissa som är större än eller lika med 1,0 och mindre än 10,0. Vi kan deformalisera värdet och uttrycka det på många andra sätt, såsom 35.2 x 10 2. eller 0.00325 x 10 0. För varje position skifter vi siffrorna i mantiten i förhållande till decimalpunkten, vi ökar eller sänker värdet på mantissa med en faktor 10. För att kompensera för detta ökar eller minskar exponenten enkelt med 1. Denormalisering är nödvändig när man lägger till vetenskapliga noteringsvärden: Justering av mantissa och exponent är också ibland nödvändig för att normalisera resultaten. Till exempel är 9,9 x 10 2 9,9 x 10 2 19,8 x 10 2. som måste normaliseras till 1,98 x 10 3. Ett binärt flytande system lagrar en signerad binär mantissa och en signerad binär exponent och brukar använda en radix av 2. Med hjälp av en radix av 2 (eller någon kraft av 2) kan vi normalisera och denormalisera genom att flytta de binära siffrorna i mantiten och justera heltalsexponenten på radix av 2. (Skiftande binära siffror i mantissa n-bitarna till vänster eller höger multiplicerar eller delar upp mantiten med 2 n.) 00010 2 x 2 3 01000 2 x 2 1. Standardformat för flytande punkt definieras av IEEE-samhället. IEEE-formaten är något mer komplexa som behövs för att förstå flytpunkten i allmänhet, så vi börjar med ett enklare exempel här. 3.10.2.A Simple Floating Point Format Anta att ett 32-bitars flytpunktsformat har en 24-bitars twos-komplementmantissa, en 8-bitars två-komplementexponent och en radix av 2. Den allmänna strukturen är: mantissa x 2-exponent där mantissa är ett 24-bitars komplement integer, och exponent är ett 8-bitars komplement heltal. Det binära formatet är enligt följande: Tabell3.3.Flödespostformat Vad är värdet av följande nummer Mantissa är 000000000000000000010010 eller (2 16) 18. Exponenten är 11111100 - (00000011 1) -00000100 -4. Värdet är därför 18 x 2 -4 Vad är det största positiva värdet vi kan representera i detta system Det största positiva värdet kommer att bestå av den största positiva mantiten och den största positiva exponenten. Den största mantiten är 01111111111111111111111111, vilken i två komplement är 2 23 -1 (8388607). Den största exponenten är 01111111, som i två komplement är 2 7 -1 (127). Därför är det största positiva värdet 8388607 x 2 127 1,42 x 10 45. Vad är det näst största positiva värdet Vad är skillnaden mellan det största och näst största Vad är det minsta positiva värdet Att hitta det minsta positiva värdet i form mantissa x radix exponent. vi väljer den minsta positiva mantiten och den minsta negativa exponenten (den negativa exponenten med störst magnitud). Eftersom mantissa är ett heltal är det minsta möjliga positiva värdet 1. Eftersom exponenten är ett 8-bitars twos komplementvärde är den minsta negativa exponenten 10000000 2. av -27 -128. Därför är det minsta positiva värdet 1 x 2 -128. eller 2,93873587706 x 10 -39. Vad är det andra minsta positiva värdet Vad är skillnaden mellan den minsta och näst minsta representanten -2.75 i detta flytpunktssystem. Omvandla numret till fixpunkts binärt med hjälp av de metoder som beskrivs i tidigare avsnitt: Multiplicera med radix exponent lika med 1: Skift den binära punkten för att göra mantiten ett heltal: - (1011 2) Genom att flytta binärpunkten två ställen till höger multiplicerar vi mantiten med 2 2. Vi måste därför dela (radix exponent) med samma faktor: Konvertera mantissa och exponent i de angivna formaten (två komplement i det här fallet): Mantissa: - (000000000000000000001111) 111111111111111111110101 Exponent: -2 10 11111110 Binär representation 1111111111111111111010111111111110 Hur många olika värden kan detta system representera 3.10.3. Överflöde och underflödesöverflöde uppstår när Resultatet av en flytpunktsoperation är större än det största positiva värdet, eller mindre än det minsta negativa värdet. Med andra ord är storleken för stor för att representera. Underflöde uppstår när resultatet av en flytpunktsoperation är mindre än det minsta positiva värdet eller större än det största negativa värdet. Med andra ord är storleken för liten för att representera. Exemplet 32-bitarsformat ovan kan inte representera värden större än omkring 10 45 eller mindre än ca 10 -39. En teknik för att undvika överflöde och underflöde är att alternativa operationer som ökar och minskar mellanresultat. I stället för att göra alla multiplikationer först, vilket kan orsaka överflöde eller alla divisioner först, vilket kan orsaka underflöde, kunde vi byta multiplikationer och uppdelningar för att mäta resultaten längs vägen. Tekniker som dessa måste ofta användas i komplexa vetenskapliga beräkningar. 3.10.4.Kost av flytande punkt Allt kostar. Det ökade intervallet och förmågan att representera icke-heltal är inget undantag. Det finns bara 2 32 mönster av 32 0s och 1s. Därför finns det bara 2 32 unika nummer som vi kan representera i 32 bitar, oavsett format. Så hur är det vi kan representera nummer upp till 10 45. Självklart måste vi offra något däremellan. Vilket flytande punkt gör för oss sprids ut det begränsade antalet binära mönster vi har tillgång till för att täcka ett större antal nummer. Ju större exponenten är desto större är klyftan mellan på varandra följande siffror som vi kan representera exakt. Nära 0 kan vi representera många nummer i ett litet sortiment. Långt från noll kommer det att finnas ett stort antal heltal som inte kan representeras. Precisionen för ett 32-bitars flytpunktvärde är mindre än precisionen för ett 32-bitars heltal. Genom att använda 8 bitar för exponenten offrar vi de 8 bitarna av precision. Därför har vårt exempelformat samma precision som ett 24-bitars signerat heltalssystem. Prestationsräkningar på flytpunkten är flera gånger långsammare än på heltal. Detta är en inneboende egenskap av formatet. Tänk på processen att lägga till två vetenskapliga noteringsvärden. Utjämna exponenterna Lägg till mantissorna Normalisera resultatet Varje av dessa åtgärder tar ungefär samma tid i en dator som ett enda heltalstillägg. Eftersom flytpunkten lagras som vetenskaplig notation, kan vi förvänta oss flytande punkttillägg för att ta ungefär tre gånger så länge som heltalstillägg. I själva verket tar en typisk dator ungefär 2,5 gånger så lång tid att utföra en flytande punkträknad instruktion som den gör för att göra samma heltalsinstruktion. Observera att detta endast gäller operationer som kan utföras med hjälp av antingen en heltalsinstruktion eller en enskild flytpunktsinstruktion. Antag att ett program körs på en 32-bitars dator, och det finns inget sätt att representera data inom intervallet av ett 32-bitars heltal. I det här fallet krävs flera heltalsinstruktioner för att bearbeta heltalsvärden på mer än 32 bitar, och hastighetsfördelen av heltal gäller inte. Det är också möjligt i vissa system att flytpunkt och heltalsoperationer kan uppstå samtidigt, och därigenom utnyttjande av flytpunkten kan hårdvaran resultera i bättre prestanda än att utföra ytterligare heltalstransaktioner medan flytpunktenheten sitter i viloläge. Detta är fallet med grafisk återgivning som sker med hjälp av flytpunkten på grafikbehandlingsenheten (GPU) snarare än CPU. Det vore inte meningsfullt att flytta reningsberäkningarna till CPU-enheten för att kunna använda heltal eftersom det bara skulle öka arbetsbelastningen för CPU-enheten och låta GPU: s kraft gå på spill. Om maskinvaran har inbyggd flytpunktsstöd, kan gemensamma operationer som tilläggsflöde, subtraktion etc. hanteras med en enda instruktion. Om hårdvaran inte har en flytpunktsenhet (vanligt i inbäddade processorer) måste flytpunktsoperationer hanteras av programrutiner. Därför behöver två dygnvärden kräva dussintals instruktioner att slutföra istället för bara en. Dessa kommer att vara hundratals gånger långsammare än heltal, och kommer att förbruka en stor del av tillgängligt programminne. De flesta algoritmer kan implementeras med hjälp av heltal med lite tanke. Användning av flytpunkten är ofta resultatet av ren lathet. Använd inte flytpunkten bara för att den är intuitiv. Mer strömförbrukning. CPU: er uppnår maximal strömförbrukning vid intensiva flytpunktsberäkningar. Det här brukar inte märkas på en stationär dator, men kan bli ett problem på stora nät som består av hundratals datorer, eftersom det elnät de är anslutna till kanske inte är konstruerade för att ge maximal räckvidd. Det kan också vara ett problem när du kör en bärbar dator på batteriet medan du gör intensiva beräkningar. Batterilivslängd medan du gör intensiva flytpunktsberäkningar kan vara en liten del av vad det är när du läser e-post, surfar på webben eller redigerar ett dokument i OpenOffice. Decimal to Floating Point Conversion Konverteringsproceduren Reglerna för att konvertera ett decimaltal till flytande punkten är följande: Konvertera absolutvärdet av numret till binärt, kanske med en deldel efter binärpunkten. Detta kan göras genom att omvandla integrerade och fraktionerade delar separat. Integraldelen omvandlas med tidigare undersökta tekniker. Den delade delen kan omvandlas genom multiplikation. Detta är i grunden invers av divisionsmetoden: vi multiplicerar upprepade gånger med 2 och skördar varje bit som den visas kvar av decimal. Lägg till tider 2 0 till slutet av det binära numret (vilket inte ändrar sitt värde). Normalisera numret. Flytta den binära punkten så att den är en bit från vänster. Justera exponenten för två så att värdet inte ändras. Placera mantiten i mantissfältet på numret. Släpp den ledande och fyll i nollor till höger. Lägg till bias till exponent av två, och placera den i exponentfältet. Förspänningen är 2 k minus1 minus 1, där k är antalet bitar i exponentfältet. För åtta bitars format, k 3, så är bias 2 3minus1 minus 1 3. För IEEE 32-bitars, k 8, så är bias 2 8minus1 minus 1 127. Ställ in teckenbiten 1 för negativ, 0 för positiv, enligt tecknet på det ursprungliga numret. Använda konverteringsproceduren Konvertera 2.625 till vårt 8-bitars flytpunktsformat. Den integrerade delen är lätt, 2 10 10 2. För den delade delen: Generera 1 och inget kvarstår. Så 0,40625 10 0,01101 2. Normalisera: 0,01101 2 1,101 2 gånger 2 -2. Mantissa är 1010, exponent är -2 3 1 001 2. teckenbit är 0. Så 0.40625 är 0 001 1010 1a 16 Convert -12.0 till vårt 8-bitars flytpunktsformat. 12 10 1100 2. Normalisera: 1100.0 2 1.1 2 gånger 2 3. Mantissa är 1000, exponent är 3 3 6 110 2. teckenbit är 1. Så -12.0 är 1 110 1000 e8 16 Konvertera decimal 1.7 till vårt 8-bitars flytpunktsformat. Den integrerade delen är lätt, 1 10 1 2. För den delade delen: Generera 1 och fortsätt med resten. Anledningen till att processen verkar fortsätta oändligt är att den gör det. Numret 710, som gör en perfekt rimlig decimalfraktion, är en repeterande fraktion i binär, precis som fraktionen 13 är en upprepande fraktion i decimal. (Det upprepas också i binärt.) Vi kan inte representera detta exakt som ett flytande punktnummer. Det närmaste vi kan komma i fyra bitar är .1011. Eftersom vi redan har en ledande 1, är det bästa 8-bitarsnummeret vi kan göra 1,1011. Redan normaliserad: 1.1011 2 1.1011 2 gånger 2 0. Mantissa är 1011, exponent är 0 3 3 011 2. teckenbit är 0. Resultatet är 0 011 1011 3b 16. Detta är inte exakt, förstås. Om du konverterar den till decimal får du 1,6875. Konvertera -1313.3125 till IEEE 32-bitars flytpunktsformat. Den integrerade delen är 1313 10 10100100001 2. Fraktionen: Generera 0 och fortsätt.

No comments:

Post a Comment