Thursday 3 August 2017

Flyttal Nummer Till Binär Alternativ


Du tolkar dina uppgifter på fel sätt. 0 är tecknet, så numret är positivt 100 är exponent som faktiskt är 1 (21). Exponenten är undertecknad och de möjliga värdena är: 000 (antalet 0 och detormaliserade tal) 001 -2 010 -1 011 0 100 1 101 2 110 3 111 (oändligheter och NAN) P. S. NAN. inte ett nummer (felkoder och grejer) 0101 är din mantissa. Vad det egentligen innebär är att ditt nummer är 1.0101 (det är en dold bit för extra precision eftersom varje nummer måste börja med 1. att 1 inte lagras faktiskt). Detta ger dig (1516) 2 2.625 Floating Point Number är 45 (Base 16), dvs 01000101 (Base 2) .. 0101 är mantissa-delen och 100 är exponent-en. Vid återställande av den ledande förnyas mantiten till 1.0101. Subtrahera bias från exponenten, som är 3 vid 8-bitars representation, exponentens blir 1. Den binära representationen är 1.0101 21. De-normaliserande får vi 10.101, vilket är den binära representationen för 2.625. Expandera på JasonDs svar Jag tycker att det är säkert att anta att du förstår eller hellre tar för givet att en flottör kan ha en negativ exponent. Men om du kommer att tänka på det, hur händer det egentligen där där bias kommer att spela, och jag tror det är den saknade länken i din förståelse. I din länk nämnde de följande lag för att beräkna bias: där k är antalet bitar i exponentfältet. I ditt exempel var k 3 bitar, så bias är 3. På så sätt kan du koda någon exponent inom intervallet -3,4 (inklusive). Så nu är det förhoppningsvis klart att när du avkodar numret måste du förstklara exponenten först. Så din 24 är faktiskt 21 som JasonD uttalade. svarat mar 10 13 kl 12:14 Ditt svar 2017 Stack Exchange, IncFloating Point Thomas Finley, april 2000 Innehåll och inledning Detta dokument förklarar IEEE 754 floating point-standarden. Den förklarar den binära representationen av dessa nummer, hur man konverterar till decimal från flytpunkten, hur man konverterar från flytpunkt till decimal, diskuterar speciella fall i flytpunkt och slutar slutligen med viss C-kod för att ytterligare förstå flytande punkt. Detta dokument täcker inte verksamhet med flytpunktsnummer. Jag skrev det här dokumentet så att om du vet hur man representerar kan du hoppa över representationsdelen och om du vet hur man konverterar till decimal från enkel precision, kan du hoppa över det här avsnittet och om du vet hur man konverterar till enkel precision från decimal, du kan hoppa över den sektionen. Representation Först, vet att binära siffror kan ha, om du ska förlåta mitt ordstäv så, en decimalpunkt. Det fungerar mer eller mindre på samma sätt som decimalpunkten gör med decimaltal. Till exempel är decimal 22.589 endast 22 och 510 -1 810 -2 910 -3. På samma sätt är det binära numret 101.001 helt enkelt 12 2 02 1 12 0 02 -1 02 -2 12 -3. eller ganska enkelt 2 2 2 0 2 -3 (detta nummer verkar vara 9.125, om det hjälper ditt tänkande). För det andra vet att binära tal, som decimaltal, kan representeras i vetenskaplig notering. T. ex. Decimalen 923.52 kan representeras som 9.2352 10 2. På samma sätt kan binära tal uttryckas på samma sätt. Säg att vi har binärnumret 101011.101 (vilket är 43.625). Detta skulle representeras med hjälp av vetenskaplig notation som 1.01011101 2 5. Nu när jag är säker på att förståelsen är perfekt, kan jag äntligen komma in i representation. Enhetsprecisionsflödespunktsenheten är ett paket med 32 bitar uppdelat i tre sektioner en bit, åtta bitar och tjugotre bitar i den ordningen. Jag kommer att använda sig av det tidigare nämnda binära numret 1.01011101 2 5 för att illustrera hur man skulle ta ett binärt tal i vetenskaplig notation och representera det i flytande punktnotering. Om vi ​​bara konverterar från hex till binär, är 0x64 0110 0100, vilket är samma resultat som 011001 gavs ovan. Denna metod är mycket snabbare. Hur som helst Vi tar de siffrorna som vi fick och representerar dem som .011001, placerade dem i den ordning vi förvärvade dem. Sats i följd med vår binära representation av 329 får vi 101001001.011001. I vår binära vetenskapliga notation är detta 1.01001001011001 2 8. Vi använder sedan vad vi vet om hur enkel precisionsnummer representeras för att slutföra processen. Tecknet är positivt, så tecknet fältet är 0. Exponentern är 8. 8 127 135, så exponentfältet är 10000111. Mantissa är bara 01001001011001 (kom ihåg den underförstådda 1 av mantissa betyder att vi inte inkluderar ledande 1) plus men många 0s måste vi lägga till till höger för att göra det binära nummeret 23 bitar långt. Eftersom ett av läxorproblemen innebär att det representerar detta som hex, kommer jag att avsluta med ett hex-nummer. Sedan bryter vi det i fyra bitar (eftersom varje hexadecimal siffra motsvarar 4 bitar) och konverterar sedan varje fyra bitars kvantitet till motsvarande hexadecimala siffra. Så i hexadecimal är detta nummer 0x43A4B200. Särskilda siffror Ibland känner datorn att man behöver lägga fram ett resultat av en beräkning som speglar att något fel gjordes. Kanske var storleken på resultatet av en beräkning större eller mindre än det här formatet verkar kunna stödja. Kanske försökte du dela upp med noll. Kanske försöker du representera noll Hur hanterar man dessa problem Svaret är att det finns speciella fall av flytande punktnummer, speciellt när exponentfältet är alla 1 bitar (255) eller alla 0 bitar (0). Denormalized Numbers Om du har ett exponentfält som är alla nollbitar, det här heter vad som är ett denormaliserat nummer. Med exponentfältet lika med noll, skulle du tro att den verkliga exponenten skulle vara -127, så det här numret skulle ha formen av 1.MANTISSA 2 -127 som beskrivits ovan, men det gör det inte. Istället är det 0.MANTISSA 2 -126. Observera att exponenten inte längre är värdet av exponentfältet minus 127. Det är helt enkelt -126. Observera också att vi inte längre innehåller en underförstådd bit för mantissen. Som ett exempel, ta det flytande punktnumret representerat som 0x80280000. Först konvertera det här till binärt. Vår teckenbit är 1, så det här numret är negativt. Vår exponent är 0, så vi vet att detta är ett denormaliserat nummer. Vår mantissa är 0101, vilket speglar en riktig mantissa av 0,0101, kom ihåg att vi inte inkluderar vad som tidigare var en underförstått bit för en exponent av noll. Så betyder det att vi har ett tal -0.0101 2 2 -126 -0.3125 10 2 -126 -1.25 10 2 -128. Du kan tänka på noll som bara ett annat detormaliserat nummer. Noll representeras av en exponent av noll och en mantissa av noll. Från vår förståelse av denormaliserade siffror översätts detta till 02 -126 0. Denna teckenbit kan vara antingen positiv (0) eller negativ (1), vilket leder till antingen en positiv eller negativ noll. Det här gör inte mycket meningsfullt matematiskt, men det är tillåtet. Precis som fallet med alla nollbitar i exponentfältet är ett speciellt fall, så är det fallet med alla en bit. Om exponentfältet är alla, och mantissen är alla nollor, så är detta nummer en oändlighet. Det kan vara antingen positiva eller negativa oändligheter beroende på teckenbiten. Till exempel är 0x7F800000 positiv oändlighet, och 0xFF800000 är negativ oändlighet. NaN (inte ett tal) Dessa speciella kvantiteter har ett exponentfält på 255 (alla en bit) som oändlighet, men skiljer sig från oändlighetens representation genom att mantissen innehåller några bitar. Det spelar ingen roll var de är eller hur många av dem finns, bara så länge som det finns några. Teckenbiten verkar inte ha någon betydelse för detta. Exempel på denna speciella kvantitet inkluderar 0x7FFFFFFF, 0xFF81ABD0, 0x7FAA12F9 och soforth. Sammanfattning av specialfall En sammanfattning av specialfall finns i nedanstående tabell. Det är mer eller mindre en kopia av tabellen på sidan 301 i andra utgåvan av Computer Organization and Design, Hardware Software Interface av Patterson och Hennessy, läroboken för datavetenskap 104 under våren 2000-terminen. Även om endast enstaka precision var täckt av ovanstående text, inkluderar jag dubbel precision för fullständighetens skull. När, Var och Var Inte När du har operationer som 00 eller subtraherar oändlighet från oändligheten (eller någon annan tvetydig beräkning) får du NaN. När du delar ett tal med noll får du en oändlighet. Men redovisning av dessa speciella operationer tar lite extra ansträngning från designerns sida och kan leda till långsammare drift eftersom fler transistorer används i chipdesign. Av denna anledning tar CPU inte ibland dessa transaktioner och genererar i stället ett undantag. När jag till exempel försöker dela upp med noll eller göra operationer med oändlighet, genererar min dator undantag och vägrar att slutföra operationen (min dator har en G3-processor eller MPC750). Helper-programvara Om du är intresserad av att undersöka ytterligare, innehåller jag två program där jag tillhandahåller C-koden som du kan köra för att få en större förståelse för hur flytande punkt fungerar och för att kontrollera ditt arbete på olika uppdrag. Hex 2 Float Detta program accepterar som input en hexadecimal kvantitet och läser den som rå data i variabeln theFloat. Programmet matar sedan ut den hexadecimala representationen av data i theFloat (upprepar ingången) och skriver ut tillsammans den flytande punktmängden som den representerar. Jag visar här ett provkörning av programmet. Observera de särskilda fallen flytpunkten kvantiteter (0, oändlighet, och inte ett tal). För detormaliserade men icke-siffernummer kommer detta program att visa noll trots att numret inte är riktigt noll. Om du vill komma runt detta problem ersätter du f i formateringssträngen i printf-funktionen med e, som kommer att visa numret till stor precision med vetenskaplig notering. Jag hade det inte som e eftersom jag hittar vetenskaplig notation extremt irriterande. Float 2 Hex Detta är en liten ändring av Hex 2 Float-programmet. Undantaget är det läser i ett flytpunktsnummer. Precis som och matar ut den hexadecimala formen plus det flytande punktnumret. Återigen inkluderar jag en provkörning av det här programmet, vilket bekräftar resultaten av de exempelproblem som jag behandlade tidigare i denna text, tillsammans med några andra enkla fall. Lägg märke till den hexadecimala representationen av 0,2. Och det är slutet på det här kapitlet. Thomas Finley 2000Decimal till flytande-punktkonverteringar Konverteringsproceduren Reglerna för att konvertera ett decimaltal till flytpunkten är följande: Konvertera absolutvärdet av numret till binärt, kanske med en bråkdel 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