Flyt Nummer I Binære Alternativer


Du tolker dataene dine på feil måte. 0 er tegnet, så tallet er positivt 100 er eksponenten som faktisk er 1 (21). Eksponenten er signert og mulige verdier er: 000 (tallet 0 og deormaliserte tallene) 001 -2 010 -1 011 0 100 1 101 2 110 3 111 (uendelighet og NAN) P. S. NAN. ikke et nummer (feilkoder og ting) 0101 er din mantissa. Hva dette faktisk betyr er at nummeret ditt er 1.0101 (det er en skjult bit for ekstra presisjon siden hvert tall må begynne med 1. at 1 ikke er faktisk lagret). Dette gir deg (1516) 2 2.625 Floating Point Number er 45 (Base 16), dvs. 01000101 (Base 2) .. 0101 er mantissa-delen og 100 er eksponenten en. Ved gjenoppretting av den ledende blir mantissen fornyet til 1.0101. Subtraherer forspenningen fra eksponenten, som er 3 ved 8-bits representasjon, blir eksponenten 1. Den binære representasjonen er 1.0101 21. De-normaliseringen får vi 10.101, som er den binære representasjonen for 2.625. Utvidelse på JasonDs svar Jeg tror det er trygt å anta at du forstår, eller heller tar for gitt, at en flyter kan ha en negativ eksponent. Men hvis du kommer til å tenke på det, hvordan skjer det egentlig, det er der bias kommer til å spille, og jeg tror det er den manglende lenken i din forståelse. I lenken din nevnte de følgende lov for å beregne bias: Hvor k er antall biter i eksponentfeltet. I ditt eksempel var k 3 bits, så bias er 3. På denne måten kan du kode en eksponent i området -3,4 (inkluderende). Så nå er det forhåpentligvis klart at når du dekoder nummeret, må du først og fremst unike eksponenten. Så din 24 er faktisk 21 som JasonD uttalt. svarte Mar 10 13 kl 12:14 Ditt svar 2017 Stack Exchange, IncFloating Point Thomas Finley, april 2000 Innhold og introduksjon Dette dokumentet forklarer IEEE 754 flytpunktstandarden. Det forklarer den binære representasjonen av disse tallene, hvordan man konverterer til desimal fra flytpunkt, hvordan man konverterer fra flytende punkt til desimal, diskuterer spesielle tilfeller i flytpunkt, og til slutt ender med noen C-koden til videre forståelse av flytpunkt. Dette dokumentet dekker ikke operasjoner med flytende punktnumre. Jeg skrev dette dokumentet slik at hvis du vet hvordan du skal representere, kan du hoppe over representasjonsdelen, og hvis du vet hvordan du konverterer til desimaltall fra enkel presisjon, kan du hoppe over den delen, og hvis du vet hvordan du konverterer til enkel presisjon fra desimal, du kan hoppe over den delen. Representasjon Først, vet at binære tall kan ha, hvis du gir tilgivelse, sier jeg et desimalpunkt. Det fungerer mer eller mindre på samme måte som desimaltegnet gjøres med desimaltall. For eksempel er desimal 22.589 bare 22 og 510 -1 810 -2 910 -3. På samme måte er det binære tallet 101.001 ganske enkelt 12 2 02 1 12 0 02 -1 02 -2 12 -3. eller ganske enkelt 2 2 2 0 2 -3 (dette nummeret utgjør 9.125, hvis det hjelper din tenkning). For det andre, vet at binære tall, som desimaltall, kan representeres i vitenskapelig notasjon. F. eks Desimal 923.52 kan representeres som 9.2352 10 2. Tilsvarende kan binære tall uttrykkes på den måten også. Si at vi har binærnummer 101011.101 (som er 43.625). Dette ville bli representert ved hjelp av vitenskapelig notering som 1.01011101 2 5. Nå som jeg er sikker på at forståelsen er perfekt, kan jeg endelig komme inn i representasjon. Enkeltprecisjons flytpunktsenheten er en pakke på 32 biter, delt inn i tre seksjoner en bit, åtte biter og treogtyve biter, i den rekkefølgen. Jeg vil benytte seg av det tidligere nevnte binære nummeret 1.01011101 2 5 for å illustrere hvordan man ville ta et binært tall i vitenskapelig notasjon og representere det i flytende punktnotasjon. Hvis vi bare konverterer fra hex til binær, er 0x64 0110 0100, som er det samme resultatet som 011001 gitt ovenfor. Denne metoden er mye raskere. Uansett Vi tar de tallene vi fikk, og representerer dem som .011001, plasserer dem i den rekkefølgen vi kjøpte dem. Sett i sekvens med vår binære representasjon på 329, får vi 101001001.011001. I vår binære vitenskapelige notasjon er dette 1.01001001011001 2 8. Vi bruker da det vi vet om hvordan enkelt presisjonsnummer er representert for å fullføre denne prosessen. Tegnet er positivt, så tegnetfeltet er 0. Eksponenten er 8. 8 127 135, så eksponentfeltet er 10000111. Mantissa er bare 01001001011001 (husk den underforståtte 1 av mantissa betyr at vi ikke inkluderer de ledende 1) pluss men mange 0s må vi legge til på høyre side for å gjøre det binære nummeret 23 bits langt. Siden en av lekseproblemer innebærer å representere dette som hex, vil jeg avslutte med et hex-nummer. Da bryter vi det inn i fire bitbiter (siden hvert heksadesimale siffer er lik 4 bits) og deretter konverteres hver fire biters mengde til det tilsvarende hexadecimale sifferet. Så i hexadecimal er dette nummeret 0x43A4B200. Spesielle tall Noen ganger føler datamaskinen at det er behov for å fremstille et resultat av en beregning som gjenspeiler at noen feil ble gjort. Kanskje var størrelsen på resultatet av en beregning større eller mindre enn dette formatet synes å kunne støtte. Kanskje du forsøkte å dele med null. Kanskje du prøver å representere null. Hvordan håndterer man disse problemene? Svaret er at det er spesielle tilfeller med flytende punktnumre, spesielt når eksponentfeltet er alle 1 bit (255) eller alle 0 bit (0). Denormaliserte tall Hvis du har et eksponentfelt som er alle nullbiter, er dette det som heter et denormalisert tall. Med eksponentfeltet lik null, ville du tro at den virkelige eksponenten ville være -127, så dette tallet ville ta form av 1.MANTISSA 2 -127 som beskrevet ovenfor, men det gjør det ikke. I stedet er det 0.MANTISSA 2 -126. Legg merke til at eksponenten ikke lenger er verdien av eksponentfeltet minus 127. Det er bare -126. Legg merke til at vi ikke lenger inkluderer en underforstått bit for mantissaen. For eksempel, ta flytpunktsnummeret representert som 0x80280000. Først konvertere dette til binær. Vårt tegnbit er 1, så dette tallet er negativt. Vår eksponent er 0, så vi vet at dette er et denormalisert nummer. Vår mantissa er 0101, som gjenspeiler en ekte mantissa på 0,0101, husk at vi ikke inkluderer hva som tidligere var en underforstått bit for en eksponent på null. Så betyr dette at vi har et tall -0.0101 2 2 -126 -0.3125 10 2 -126 -1.25 10 2 -128. Du kan tenke på null som bare et annet denormalisert tall. Null representeres av en eksponent på null og en mantissa på null. Fra vår forståelse av denormaliserte tall, oversettes dette til 02 -126 0. Denne tegnbiten kan enten være positiv (0) eller negativ (1), som fører til enten en positiv eller negativ null. Dette gjør ikke veldig mye fornuft matematisk, men det er tillatt. Akkurat som tilfellet med alle nullbiter i eksponentfeltet er et spesielt tilfelle, så er det tilfelle av alle en biter. Hvis eksponentfeltet er alle, og mantittene er alle nuller, så er dette tallet en uendelig. Det kan være enten positive eller negative uendigheter avhengig av tegnbiten. For eksempel er 0x7F800000 positiv uendelighet, og 0xFF800000 er negativ uendelighet. NaN (ikke et tall) Disse spesielle mengdene har et eksponentfelt på 255 (alle en biter) som uendelig, men avviger fra uendets representasjon ved at mantissa inneholder noen biter. Det spiller ingen rolle hvor de er eller hvor mange av dem det er, bare så lenge det er noen. Tegningsbiten ser ut til å ha ingen betydning for dette. Eksempler på denne spesielle mengden inkluderer 0x7FFFFFFF, 0xFF81ABD0, 0x7FAA12F9 og så fort. Sammendrag av spesielle saker Et sammendrag av spesielle tilfeller er vist i tabellen under. Det er mer eller mindre en kopi av tabellen som ble funnet på side 301 i den andre utgaven av Computer Organization and Design, Maskinvares programvaregrensesnitt av Patterson og Hennessy, læreboken for datalogi 104 i vår 2000-semesteret. Selv om bare enkeltpresisjon ble dekket i teksten ovenfor, inkluderer jeg dobbel presisjon for fullstendighetens skyld. Når, Hvor og Hvor Ikke Når du har operasjoner som 00 eller subtraherer uendelig fra uendelig (eller annen tvetydig beregning), vil du få NaN. Når du deler et tall med null, får du en uendelighet. Men regnskapsføring av disse spesielle operasjonene krever litt ekstra innsats av designeren, og kan føre til langsommere operasjoner, da flere transistorer benyttes i chipdesign. Av denne grunn utelater ikke CPUer for disse operasjonene, og i stedet genererer et unntak. For eksempel når jeg prøver å dele med null eller gjøre operasjoner med uendelig, genererer datamaskinen min unntak og nekter å fullføre operasjonen (datamaskinen har en G3-prosessor eller MPC750). Hjelperprogramvare Hvis du er interessert i å undersøke videre, inkluderer jeg to programmer som jeg gir C-koden du kan kjøre for å få større forståelse for hvordan flytende punkt fungerer, og også å kontrollere arbeidet ditt på ulike oppgaver. Hex 2 Float Dette programmet aksepterer som en heksadesimal kvantitet og skriver den som rå data i variabelen theFloat. Programmet utfører deretter den heksadesimale representasjonen av dataene i theFloat (gjenta inngangen), og skriver sammen med den flytende punktkvantiteten som den representerer. Jeg viser her en prøvekjøring av programmet. Legg merke til spesielle tilfelle flytpunkts mengder (0, uendelig, og ikke et tall). For de denormaliserte men ikke-nummerene, vil dette programmet vise null, selv om tallet ikke er egentlig null. Hvis du vil omgå dette problemet, må du erstatte f i formateringsstrengen til printf-funksjonen med e, som vil vise nummeret til stor presisjon med vitenskapelig notasjon. Jeg hadde det ikke som e fordi jeg finner vitenskapelig notasjon ekstremt irriterende. Float 2 Hex Dette er en liten modifikasjon av Hex 2 Float-programmet. Unntaket er det leses i et flytende punktnummer. Akkurat som og utgir den heksadesimale form pluss flytpunktsnummeret. Igjen inkluderer jeg en prøvekjøring av dette programmet, som bekrefter resultatene av eksempelproblemene jeg dekket tidligere i denne teksten, sammen med noen andre enkle tilfeller. Legg merke til den heksadesimale representasjonen på 0,2. Og det er slutten på det kapitlet. Thomas Finley 2000Decimal til flytende-punkt-konverteringer Konverteringsprosedyren Reglene for å konvertere et desimalnummer til flytpunkt er som følger: Konverter absoluttverdien til tallet til binær, kanskje med en brøkdel etter binærpunktet. Dette kan gjøres ved å konvertere de integrerte og brøkdelene separat. Integraldelen er konvertert med tidligere undersøkte teknikker. Fraksjonaldelen kan konverteres ved multiplikasjon. Dette er i utgangspunktet den inverse av divisjonsmetoden: vi gjentatte ganger multipliserer med 2, og høst hver enkelt bit som det vises til venstre for desimaltallet. Legg til tider 2 0 til slutten av binærnummeret (som ikke endrer verdien). Normaliser nummeret. Flytt binærpunktet slik at det er en bit fra venstre. Juster eksponenten til to slik at verdien ikke endres. Plasser mantissen i mantissa-feltet av nummeret. Fjern den ledende, og fyll med nuller til høyre. Legg til bias til eksponenten til to, og legg den i eksponentfeltet. Forspenningen er 2 k minus1 minus 1, hvor k er antall biter i eksponentfeltet. For åtte-bit formatet, k3, så er bias 2 3minus1 minus 1 3. For IEEE 32-bit, k 8, så er bias 2 8minus1 minus 1 127. Sett tegnbiten, 1 for negativ, 0 for positiv, ifølge tegnet på det opprinnelige nummeret. Bruke konverteringsprosedyren Konverter 2.625 til vårt 8-bits flytpunktsformat. Integrert del er lett, 2 10 10 2. For den delte delen: Generer 1 og ingenting gjenstår. Så 0,40625 10 0,01101 2. Normaliser: 0.01101 2 1.101 2 ganger 2 -2. Mantissa er 1010, eksponenten er -2 3 1 001 2. tegnbit er 0. Så 0.40625 er 0 001 1010 1a 16 Konverter -12.0 til vårt 8-bits flytpunktsformat. 12 10 1100 2. Normaliser: 1100.0 2 1.1 2 ganger 2 3. Mantissa er 1000, eksponenten er 3 3 6 110 2. tegnbit er 1. Så -12.0 er 1 110 1000 e8 16 Konverter desimal 1.7 til vårt 8-bits flytpunktsformat. Integrert delen er lett, 1 10 1 2. For brøkdel: Generer 1 og fortsett med resten. Årsaken til at prosessen ser ut til å fortsette uendelig er at den gjør det. Tallet 710, som gir en perfekt fornuftig desimalfraksjon, er en repeterende brøkdel i binær, akkurat som fraksjonen 13 er en repeterende brøkdel i desimal. (Det gjentas også i binær.) Vi kan ikke representere dette akkurat som et flytende punktnummer. Det nærmeste vi kan komme i fire biter er .1011. Siden vi allerede har en ledende 1, er det beste åtte-bit nummeret vi kan lage 1.1011. Allerede normalisert: 1.1011 2 1.1011 2 ganger 2 0. Mantissa er 1011, eksponenten er 0 3 3 011 2. tegnbit er 0. Resultatet er 0 011 1011 3b 16. Dette er ikke eksakt, selvfølgelig. Hvis du konverterer den tilbake til desimal, får du 1,6875. Konverter -1313.3125 til IEEE 32-biters flytpunktsformat. Integrert delen er 1313 10 10100100001 2. Den brøkdelte: Generer 0 og fortsett.

Comments

Popular Posts