Datanummerformat - Computer number format

Et datamaskinsnummerformat er den interne representasjonen av numeriske verdier i maskinvare og programvare for digital enhet, for eksempel i programmerbare datamaskiner og kalkulatorer . Numeriske verdier lagres som grupperinger av biter , for eksempel byte og ord. Kodingen mellom numeriske verdier og bitmønstre er valgt for å gjøre det lettere for datamaskinen; kodingen som brukes av datamaskinens instruksjonssett krever vanligvis konvertering for eksternt bruk, for eksempel for utskrift og visning. Ulike typer prosessorer kan ha forskjellige interne representasjoner av numeriske verdier, og forskjellige konvensjoner brukes for heltall og reelle tall. De fleste beregninger utføres med tallformater som passer inn i et prosessorregister, men noen programvaresystemer tillater representasjon av vilkårlig store tall ved bruk av flere ord med minne.

Binær nummerrepresentasjon

Datamaskiner representerer data i sett med binære sifre. Representasjonen er sammensatt av biter, som igjen er gruppert i større sett som byte.

Tabell 1: Binær til oktal
Binær streng Oktal verdi
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
Tabell 2: Antall verdier for en bitstreng.
Lengde på bitstreng (b) Antall mulige verdier (N)
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
...

En bit er et binært sifret som representerer en av to tilstander . Konseptet med litt kan forstås som en verdi på enten 1 eller 0 , eller av , ja eller nei , sant eller usant , eller kodet av en bryter eller bryter av noe slag.

Mens en enkelt bit på egen hånd bare kan representere to verdier, kan en bit med bits brukes til å representere større verdier. For eksempel kan en streng på tre biter representere opptil åtte forskjellige verdier som illustrert i tabell 1.

Når antall bits som komponerer en streng øker, øker antallet mulige 0 og 1 kombinasjoner eksponentielt . En enkeltbit tillater bare to verdikombinasjoner, to bit kombinert kan lage fire separate verdier, tre bits for åtte, og så videre, og øke med formelen 2 ^ n. Mengden mulige kombinasjoner dobles med hvert binært siffer som er lagt til som illustrert i tabell 2.

Grupperinger med et spesifikt antall biter brukes til å representere forskjellige ting og har spesifikke navn.

En byte er en bitstreng som inneholder antall biter som trengs for å representere et tegn . På de fleste moderne datamaskiner er dette en åtte-bits streng. Fordi definisjonen av en byte er relatert til antall biter som komponerer et tegn, har noen eldre datamaskiner brukt en annen bitlengde for deres byte. I mange datamaskinarkitekturer er byten den minste adresserbare enhet , den atom av adresserbarhet, si. For eksempel, selv om 64-biters prosessorer kan adressere minne sekstifire bits om gangen, kan de fremdeles dele det minnet i åtte-biters stykker. Dette kalles byte-adresserbart minne. Historisk sett leser mange CPUer data i noen multiple på åtte bits. Fordi byte-størrelsen på åtte bits er så vanlig, men definisjonen ikke er standardisert, brukes begrepet oktett noen ganger for å eksplisitt beskrive en åtte-bits sekvens.

En nibble (noen ganger nybble ), er et tall som består av fire biter. Å være en halv byte ble bite navngitt som et ordspill. En person kan trenge flere snacks for en bit av noe; Tilsvarende er en nybble en del av en byte. Fordi fire biter tillater seksten verdier, er en nibble noen ganger kjent som et heksadesimalt siffer .

Visning av oktale og heksadesimale tall

Oktal og heksadesimal koding er praktiske måter å representere binære tall, som de brukes av datamaskiner. Datateknikere trenger ofte å skrive ut binære mengder, men i praksis er det å skrive ut et binært tall som 1001001101010001 kjedelig og utsatt for feil. Derfor blir binære størrelser skrevet i en base-8, eller "oktal", eller, mye mer vanlig, en base-16, "heksadesimal" ( heks ), tallformat. I desimalsystemet er det 10 sifre, 0 til 9, som kombineres for å danne tall. I et oktalt system er det bare 8 sifre, 0 til 7. Det vil si at verdien av en oktal "10" er den samme som en desimal "8", en oktal "20" er en desimal "16", og så på. I et heksadesimalt system er det 16 sifre, 0 til 9 fulgt av konvensjon, med A til F. Det vil si at et heksadesimalt "10" er det samme som et desimal "16" og et heksadesimalt "20" er det samme som en desimal "32". Et eksempel og sammenligning av tall i forskjellige baser er beskrevet i diagrammet nedenfor.

Når du skriver inn tall, brukes formateringstegn til å beskrive tallsystemet, for eksempel 000_0000B eller 0b000_00000 for binære og 0F8H eller 0xf8 for heksadesimale tall.

Konvertering mellom baser

Tabell 3: Sammenligning av verdier i forskjellige baser
Desimal Binær Octal Heksadesimal
0 000000 00 00
1 000001 01 01
2 000010 02 02
3 000011 03 03
4 000100 04 04
5 000101 05 05
6 000110 06 06
7 000111 07 07
8 001000 10 08
9 001001 11 09
10 001010 12 0A
11 001011 1. 3 0B
12 001100 14 0C
1. 3 001101 15 0D
14 001110 16 0E
15 001111 17 0F

Hvert av disse tallsystemene er et posisjonssystem, men mens desimalvekter er krefter på 10, er oktalvektene krefter på 8 og heksadesimale vekter er krefter på 16. For å konvertere fra heksadesimal eller oktal til desimal, for hvert siffer multipliserer man verdien av sifferet etter verdien av posisjonen og legger deretter til resultatene. For eksempel:

Representerer brøker i binær

Fastpunktsnumre

Fast punkt formatering kan være nyttig for å representere fraksjoner i binær.

Antall bits som trengs for presisjonen og ønsket område må velges for å lagre brøkdelene og heltallene til et tall. For eksempel, ved bruk av et 32-biters format, kan 16 bits brukes til heltallet og 16 for brøkdelen.

Åttens bit etterfølges av fires bit, så tos bit, deretter ens bit. Brøkdelene fortsetter mønsteret satt av heltallbitene. Den neste biten er halvpartens bit, deretter kvartparten, deretter biten til ⅛ og så videre. For eksempel:

heltall biter brøkdeler
0,500 = 1 / 2 = 00000000 00000000.10000000 00000000
1.250 = 1 + 1 / 4 = 00000000 00000001.01000000 00000000
7.375 = 7 + 3 / 8 = 00000000 00000111.01100000 00000000

Denne kodingsformen kan ikke representere noen verdier i binær. For eksempel brøkdelen 1 / 5 , 0,2 i desimal, vil de nærmeste tilnærmingene være som følger:

13107/65536 = 00000000 00000000.00110011 00110011 = 0.1999969 ... i desimal
13108/65536 = 00000000 00000000.00110011 00110100 = 0.2000122 ... i desimal

Selv om flere sifre brukes, er en eksakt representasjon umulig. Antallet 1 / 3 , skrevet i desimal som 0.333333333 ..., fortsetter på ubestemt tid. Hvis den avsluttes for tidlig, vil ikke verdien representere 1 / 3 presist.

Flytende tall

Mens både usignerte og signerte heltall brukes i digitale systemer, er til og med et 32-biters heltall ikke nok til å håndtere alle tallene som en kalkulator kan håndtere, og det inkluderer ikke engang brøker. For å tilnærme større rekkevidde og presisjon av reelle tall , må vi forlate signerte heltall og fastpunkttall og gå til et " flyt-punkt " -format.

I desimalsystemet er vi kjent med flytende tall i skjemaet ( vitenskapelig notasjon ):

1.1030402 × 10 5 = 1.1030402 × 100000 = 110304.02

eller mer kompakt:

1.1030402E5

som betyr "1.1030402 ganger 1 etterfulgt av 5 nuller". Vi har en viss numerisk verdi (1.1030402) kjent som en " significand ", multiplisert med en kraft på 10 (E5, som betyr 10 5 eller 100 000), kjent som en " eksponent ". Hvis vi har en negativ eksponent, betyr det at tallet multipliseres med en 1 som mange steder til høyre for desimaltegnet. For eksempel:

2.3434E − 6 = 2.3434 × 10 −6 = 2.3434 × 0.000001 = 0.0000023434

Fordelen med denne ordningen er at ved å bruke eksponenten kan vi få et mye større tallspekter, selv om antall sifre i signifikant, eller "numerisk presisjon", er mye mindre enn området. Lignende binære flytende punktformater kan defineres for datamaskiner. Det er en rekke slike ordninger, de mest populære er definert av Institute of Electrical and Electronics Engineers (IEEE). Den IEEE 754-2008 standardspesifikasjon definerer en 64 bit flytende punktformat med:

  • en 11-bit binær eksponent, ved hjelp av formatet "excess-1023". Overskudd-1023 betyr at eksponenten vises som et usignert binært heltall fra 0 til 2047; å trekke 1023 gir den faktiske signerte verdien
  • en 52-bits signifikant, også et usignert binært tall, som definerer en brøkverdi med en ledende underforstått "1"
  • et tegnbit, som gir tegnet på nummeret.

La oss se hvordan dette formatet ser ut ved å vise hvordan et slikt nummer vil bli lagret i 8 byte minne:

byte 0 S x10 x9 x8 x7 x6 x5 x4
byte 1 x3 x2 x1 x0 m51 m50 m49 m48
byte 2 m47 m46 m45 m44 m43 m42 m41 m40
byte 3 m39 m38 m37 m36 m35 m34 m33 m32
byte 4 m31 m30 m29 m28 m27 m26 m25 m24
byte 5 m23 m22 m21 m20 m19 m18 m17 m16
byte 6 m15 m14 m13 m12 m11 m10 m9 m8
byte 7 m7 m6 m5 m4 m3 m2 m1 m0

hvor "S" betegner tegnbiten, "x" betegner en eksponentbit, og "m" betegner en signifikant bit. Når bitene her er ekstrahert, blir de konvertert med beregningen:

<sign> × (1 + <fractional significand>) × 2 <exponent> - 1023

Denne ordningen gir tall som er gyldige til omtrent 15 desimaler, med følgende tallområde:

maksimum minimum
positivt 1.797693134862231E + 308 4.940656458412465E-324
negativ -4.940656458412465E-324 -1,797693134862231E + 308

Spesifikasjonen definerer også flere spesielle verdier som ikke er definerte tall, og er kjent som NaNs , for "Not A Number". Disse brukes av programmer for å betegne ugyldige operasjoner og lignende.

Noen programmer bruker også 32-bits flytende tall. Den vanligste ordningen bruker en 23-biters signifikant med en tegnbit, pluss en 8-biters eksponent i "overskudd-127" -format, som gir syv gyldige desimaltegn.

byte 0 S x7 x6 x5 x4 x3 x2 x1
byte 1 x0 m22 m21 m20 m19 m18 m17 m16
byte 2 m15 m14 m13 m12 m11 m10 m9 m8
byte 3 m7 m6 m5 m4 m3 m2 m1 m0

Bitene blir konvertert til en numerisk verdi med beregningen:

<sign> × (1 + <fractional significand>) × 2 <exponent> - 127

fører til følgende antall tall:

maksimum minimum
positivt 3.402823E + 38 2.802597E-45
negativ -2.802597E-45 -3.402823E + 38

Slike flytende tall er kjent som "reals" eller "floats" generelt, men med en rekke varianter:

En 32-biters flytverdi kalles noen ganger en "real32" eller en "single", som betyr "single-precision floating point value".

En 64-bits flottør kalles noen ganger en "real64" eller en "dobbel", noe som betyr "dobbelt-presisjons flytpunkt".

Forholdet mellom tall og bitmønstre er valgt for enkelhets skyld i datamanipulering; åtte byte lagret i dataminnet kan representere en 64-biters reell, to 32-biters real eller fire signerte eller usignerte heltall, eller en annen type data som passer inn i åtte byte. Den eneste forskjellen er hvordan datamaskinen tolker dem. Hvis datamaskinen lagret fire usignerte heltall og deretter leser dem tilbake fra minnet som en 64-biters ekte, ville det nesten alltid være et helt gyldig reelt tall, selv om det ville være søppeldata.

Bare et endelig utvalg av reelle tall kan vises med et gitt antall biter. Aritmetiske operasjoner kan strømme over eller strømme under, og gi en verdi som er for stor eller for liten til å bli representert.

Representasjonen har en begrenset presisjon. For eksempel kan bare 15 desimaler vises med en 64-biters reell. Hvis et veldig lite flytende nummer legges til et stort, blir resultatet bare det store. Det lille antallet var for lite til å vises i 15 eller 16 sifre med oppløsning, og datamaskinen kastet det effektivt. Å analysere effekten av begrenset presisjon er et godt studert problem. Estimater av størrelsen på avrundingsfeil og metoder for å begrense effekten av store beregninger er en del av ethvert stort beregningsprosjekt. Presisjonsgrensen er forskjellig fra rekkevidden, da den påvirker betydningen og ikke eksponenten.

Betydningen er en binær brøk som ikke nødvendigvis samsvarer perfekt med en desimalbrøk. I mange tilfeller samsvarer en sum av gjensidige krefter på 2 ikke med en bestemt desimalbrøk, og resultatene av beregninger vil være litt av. For eksempel tilsvarer desimalfraksjonen "0,1" en uendelig gjentatt binær brøkdel: 0,000110011 ...

Tall i programmeringsspråk

Programmering på monteringsspråk krever at programmereren holder rede på representasjonen av tall. Der prosessoren ikke støtter en nødvendig matematisk operasjon, må programmereren utarbeide en passende algoritme og instruksjonsrekkefølge for å utføre operasjonen; på noen mikroprosessorer må til og med multiplikasjon av heltall gjøres i programvare.

Programmeringsspråk på høyt nivå som Ruby og Python tilbyr et abstrakt tall som kan være en utvidet type som rasjonell , bignum eller kompleks . Matematiske operasjoner utføres av bibliotekrutiner gitt av implementeringen av språket. Et gitt matematisk symbol i kildekoden, ved operatøroverbelastning , vil påkalle annen objektkode som passer til representasjonen av den numeriske typen; matematiske operasjoner på et hvilket som helst tall - enten signert, usignert, rasjonelt, flytende punkt, fast punkt, integrert eller komplekst - skrives nøyaktig på samme måte.

Noen språk, for eksempel REXX og Java , gir desimaloperasjoner med flytende punkter, som gir avrundingsfeil av en annen form.

Se også

Merknader og referanser

Den første versjonen av denne artikkelen var basert på en offentlig domene- artikkel fra Greg Goebels Vectorsite .