Wednesday 18 October 2017

Flyttalls Notasjon Binære Alternativer


Binære fraksjoner Mens de virker som de samme i prinsippet, er binære fraksjoner forskjellig fra desimalfraksjoner i hvilke tall de kan representere nøyaktig med et gitt antall sifre, og dermed også i hvilke tall som resulterer i avrundingsfeil: Spesielt kan binær bare representere disse tallene som en endelig brøkdel der nevneren er en kraft på 2. Dessverre inkluderer dette ikke de fleste tallene som kan representeres som endelige brøkdel i base 10, som 0,1. Avrundet til 4 siffer Avrundet verdi som brøk Og så får du allerede en avrundingsfeil når du bare skriver ned et nummer som 0,1 og kjører det gjennom tolken eller kompilatoren. Det er ikke så stort som 380 og kan være usynlig fordi datamaskiner kuttes av etter 23 eller 52 binære sifre i stedet for 4. Men feilen er der og vil forårsake problemer etter hvert hvis du bare ignorerer det. Hvorfor bruke Binary På laveste nivå, er datamaskiner basert på milliarder elektriske elementer som kun har to tilstander, (vanligvis lav og høy spenning). Ved å tolke disse som 0 og 1, er det veldig enkelt å bygge kretser for lagring av binære tall og beregninger med dem. Selv om det er mulig å simulere adferd av desimaltall med binære kretser, er det mindre effektivt. Hvis datamaskiner brukte decimaltall internt, har de mindre minne og er langsommere på samme nivå av teknologi. Siden forskjellen i atferd mellom binære og desimaltall ikke er viktig for de fleste applikasjoner, er det logiske valget å bygge datamaskiner basert på binære tall og leve med at det er nødvendig med ekstra forsiktighet og innsats for programmer som krever desimallignende oppførsel. The Floating Point Guide Home Basic Svar Referanser xkcd Number Formats3.10.1. Grunnleggende Flytepunktet kommer rundt begrensningene i fast punkt ved å bruke et format som ligner på vitenskapelig notasjon. Et vitenskapelig notasjonsnummer, som du sikkert vet, består av en mantissa (3,52 i eksemplet ovenfor) en radix (alltid 10), og en eksponent (3 i eksempelet ovenfor). Derfor er det generelle formatet for en vitenskapelig notasjonsverdi: mantissa x radix eksponent Den normaliserte formen har alltid en mantissa som er større enn eller lik 1,0 og mindre enn 10,0. Vi kan deformalisere verdien og uttrykke den på mange andre måter, for eksempel 35.2 x 10 2. eller 0.00325 x 10 0. For hver posisjon skifter vi sifrene i mantissen i forhold til desimaltegnet, vi øker eller reduserer verdien av mantissa med en faktor på 10. For å kompensere for dette, øker eller reduserer du eksponenten med 1. Denormalisering er nødvendig når du legger til vitenskapelige notasjonsverdier: Justering av mantissa og eksponent er også noen ganger nødvendig for å normalisere resultatene. For eksempel er 9,9 x 10 2 9,9 x 10 2 19,8 x 10 2. som må normaliseres til 1,98 x 10 3. Et binært flytende system lagrer en signert binær mantissa og en signert binær eksponent, og bruker vanligvis en radix på 2. Ved å bruke en radix av 2 (eller en hvilken som helst kraft på 2) kan vi normalisere og denormalisere ved å skifte de binære tallene i mantissaen og justere heltaleksponenten på radixen av 2. (Skiftende binære sifre i mantissa n-bitene til venstre eller høyre multipliserer eller deler mantitten med 2 n.) 00010 2 x 2 3 01000 2 x 2 1. Standard flytpunktformatene er definert av IEEE-samfunnet. IEEE-formatene er litt mer komplekse som er nødvendige for å forstå flytpunkt generelt, så vi starter med et enklere eksempel her. 3.10.2. Enkelt flytpunktsformat Anta at et 32-biters flytpunktsformat har en 24-biters komplementmantissa, en 8-bits to-komplement eksponent og en radix av 2. Den generelle strukturen er: mantissa x 2 eksponent Hvor mantissa er et 24-biters komplement integer, og eksponenten er et 8-biters komplement heltall. Det binære formatet er som følger: Tabell3.3.Fløytepunktformat Hva er verdien av følgende tall Mantissa er 000000000000000000010010 eller (2 16) 18. Eksponenten er 11111100 - (00000011 1) -00000100 -4. Verdien er derfor 18 x 2 -4 Hva er den største positive verdien vi kan representere i dette systemet Den største positive verdien vil bestå av den største positive mantissen og den største positive eksponenten. Den største mantissen er 011111111111111111111111, som i to komplement er 2 23 -1 (8388607). Den største eksponenten er 01111111, som i to komplement er 2 7 -1 (127). Derfor er den største positive verdien 8388607 x 2 127 1,42 x 10 45. Hva er den nest største positive verdien Hva er forskjellen mellom den største og nest største Hva er den minste positive verdien For å finne den minste positive verdien i form mantissa x radix eksponent. Vi velger den minste positive mantissen, og den minste negative eksponenten (den negative eksponenten med størst størrelse). Siden mantissa er et heltall, er den minste positive verdien mulig 1. Siden eksponenten er en 8-biters to-komplementverdi, er den minste negative eksponenten 10000000 2. av -27 -128. Derfor er den minste positive verdien 1 x 2 -128. eller 2,93873587706 x 10 -39. Hva er den andre minste positive verdien Hva er forskjellen mellom den minste og andre minste Represent -2.75 i dette flytpunktsystemet. Konverter tallet til fast punkt binært ved å bruke metodene som er beskrevet i tidligere seksjoner: Multipliser med radix eksponent lik 1: Skift Det binære punktet for å gjøre mantissen til et helt tall: - (1011 2) Ved å flytte binærpunktet to steder til høyre multiplicerer vi mantittene med 2 2. Vi må derfor dele (radix eksponent) med samme faktor: Konverter den mantissa og eksponent i de angitte formatene (to komplement i dette tilfellet): Mantissa: - (000000000000000000001011) 111111111111111111110101 Eksponent: -2 10 11111110 Binær representasjon 1111111111111111111010111111111010 Hvor mange forskjellige verdier kan dette systemet representere 3.10.3.Overstrømning og understrøm Overflow oppstår når Resultatet av en flytpunktsoperasjon er større enn den største positive verdien, eller mindre enn den minste negative verdien. Med andre ord, størrelsen er for stor til å representere. Understrømning oppstår når resultatet av en flytpunktsoperasjon er mindre enn den minste positive verdien, eller større enn den største negative verdien. Med andre ord, størrelsen er for liten til å representere. Eksemplet 32-bits format ovenfor kan ikke representere verdier som er større enn ca. 10 45 eller mindre enn ca. 10 -39. En teknikk for å unngå overflyt og understrømning er å alternere operasjoner som øker og reduserer mellomresultater. I stedet for å gjøre alle multiplikasjonene først, som kan forårsake overløp, eller alle divisjonene først, som kan forårsake understrømning, kan vi alternere multiplikasjoner og divisjoner for å moderere resultatene underveis. Teknikker som disse må ofte brukes i komplekse vitenskapelige beregninger. 3.10.4.Kost av flytende punkt Alt har en kostnad. Det økte området og muligheten til å representere ikke-hele tall er ikke noe unntak. Det er bare 2 32 mønstre på 32 0s og 1s. Derfor er det bare 2 32 unike tall som vi kan representere i 32 biter, uavhengig av formatet. Så hvordan er det vi kan representere tall opp til 10 45. Åpenbart må vi ofre noe i mellom. Hvilket flytende punkt betyr for oss at det er et begrenset antall binære mønstre vi har tilgjengelig for å dekke et større antall tall. Jo større eksponenten er, jo større er gapet mellom sammenhengende tall som vi nøyaktig kan representere. Nær 0, kan vi representere mange tall i et lite utvalg. Langt fra null vil det være et helt utvalg av hele tall som ikke kan representeres. Presisjonen til en 32-biters flytpunktsverdi er mindre enn nøyaktigheten til et 32-biters heltall. Ved å bruke 8 biter for eksponenten, ofrer vi de 8 bitene med presisjon. Derfor har vårt eksempelformat samme presisjon som et 24-bits signert heltalsystem. Prestasjonsarithmetikk på flytpunkt er flere ganger tregere enn på heltall. Dette er en inneboende egenskap av formatet. Vurder prosessen med å legge til to vitenskapelige notasjonsverdier. Equalize the exponents Legg til mantissas Normalisere resultatet Hver av disse operasjonene tar omtrent samme tid i en datamaskin som et heltall tilføyelse. Siden flytpunktet lagres som vitenskapelig notasjon, kan vi forvente at flytende punkttilskudd skal ta omtrent tre ganger så lang tid som heltalltilsetning. I virkeligheten tar en typisk PC omtrent 2,5 ganger så lang tid å utføre en flytende aritmetisk instruksjon som det gjør for å gjøre det samme heltall instruksjon. Vær oppmerksom på at dette bare gjelder operasjoner som kan utføres ved hjelp av enten en enkelt heltall instruksjon eller en enkelt flytende punkt instruksjon. Anta for eksempel at et program kjører på en 32-biters datamaskin, og det er ingen måte å representere dataene innenfor rekkevidden av et 32-biters heltall. I dette tilfellet vil flere helhetsinstruksjoner være nødvendige for å behandle heltallverdier på mer enn 32 biter, og hastighetsfordelen av heltall gjelder ikke. Det er også mulig i enkelte systemer at flytende punkt og heltall operasjoner kan oppstå samtidig, og dermed bruk av flytpunktet maskinvaren kan resultere i bedre ytelse enn å utføre flere heltall operasjoner mens flytende punkt enheten sitter tomgang. Dette er tilfellet med grafisk gjengivelse som oppstår ved bruk av flytpunkt på grafikkbehandlingsenheten (GPU) i stedet for CPU. Det ville ikke være fornuftig å flytte renderingskalkulasjonene til CPUen for å kunne bruke heltall, da dette bare ville øke arbeidsbelastningen for CPUen og la GPU-kraften gå til spill. Hvis maskinvare har innebygd flytende punktstøtte, kan alminnelige operasjoner som flytpunkts tillegg, subtraksjon, etc., håndteres av en enkelt instruksjon. Hvis maskinvare ikke har en flytende punktenhet (vanlig i innebygde prosessorer), må flytende punktoperasjoner håndteres av programvarerutiner. Derfor legger du til to flytende punktverdier som krever dusinvis av instruksjoner for å fullføre i stedet for bare en. Disse vil være hundrevis av ganger langsommere enn heltall, og vil forbruke en stor del av tilgjengelig programminne. De fleste algoritmer kan implementeres ved hjelp av heltall med litt tanke. Bruk av flytpunkt er ofte et resultat av ren latskap. Ikke bruk flytende punkt bare fordi det er intuitivt. Mer strømforbruk. CPUer oppnår sitt maksimale strømforbruk når de gjør flytende punktberegninger. Dette er vanligvis ikke merkbar på en stasjonær PC, men kan bli et problem på store nett som består av hundrevis av PCer, siden strømnettet de er festet til, kanskje ikke er konstruert for å gi maksimal tegning. Det kan også være et problem når du kjører en bærbar datamaskin på batteriet mens du gjør intensive beregninger. Batterilevetid mens du gjør intensive flytende punktberegninger kan være en liten del av hva det er mens du leser e-post, surfer på nettet eller redigerer et dokument i OpenOffice. Decimal til Floating Point-konverteringer. Konverteringsprosedyren Reglene for å konvertere et desimalnummer til flytende punkt 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.

No comments:

Post a Comment