Computer nummerformat - Computer number format

Et computernummerformat er den interne repræsentation af numeriske værdier i hardware og software til digital enhed, såsom i programmerbare computere og regnemaskiner . Numeriske værdier gemmes som grupperinger af bits , såsom bytes og ord. Kodningen mellem numeriske værdier og bitmønstre vælges af bekvemmelighed ved computerens drift; kodningen, der bruges af computerens instruktionssæt, kræver generelt konvertering til ekstern brug, f.eks. til udskrivning og visning. Forskellige typer processorer kan have forskellige interne repræsentationer af numeriske værdier, og forskellige konventioner bruges til heltal og reelle tal. De fleste beregninger udføres med nummerformater, der passer ind i et processorregister, men nogle softwaresystemer tillader gengivelse af vilkårligt store tal ved hjælp af flere hukommelsesord.

Binær nummerrepræsentation

Computere repræsenterer data i sæt med binære cifre. Repræsentationen er sammensat af bits, som igen er grupperet i større sæt såsom bytes.

Tabel 1: Binær til oktal
Binær streng Oktal værdi
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
Tabel 2: Antal værdier for en bitstreng.
Længde af bitstreng (b) Antal mulige værdier (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 ciffer , der repræsenterer en af to tilstande . Begrebet bit kan forstås som en værdi på enten 1 eller 0 , til eller fra , ja eller nej , sand eller falsk , eller kodet af en switch eller skifte af en slags.

Mens en enkelt bit alene er i stand til kun at repræsentere to værdier, kan en streng af bits bruges til at repræsentere større værdier. For eksempel kan en streng på tre bits repræsentere op til otte forskellige værdier som illustreret i tabel 1.

Når antallet af bits, der komponerer en streng, stiger, øges antallet af mulige 0 og 1 kombinationer eksponentielt . En enkelt bit tillader kun to værdikombinationer, to bits kombineret kan lave fire separate værdier, tre bits til otte osv., Hvilket øges med formlen 2 ^ n. Mængden af ​​mulige kombinationer fordobles med hvert binært ciffer tilføjet som illustreret i tabel 2.

Grupperinger med et bestemt antal bits bruges til at repræsentere forskellige ting og har specifikke navne.

En byte er en bitstreng, der indeholder antallet af bits, der er nødvendige for at repræsentere et tegn . På de fleste moderne computere er dette en otte bit streng. Fordi definitionen af ​​en byte er relateret til antallet af bits, der komponerer et tegn, har nogle ældre computere brugt en anden bitlængde til deres byte. I mange computerarkitekturer er byte den mindste adresserbare enhed , atomets adresserbarhed, siger. For eksempel, selvom 64-bit processorer kan adressere hukommelse 64 bit ad gangen, kan de stadig splitte hukommelsen i otte-bit stykker. Dette kaldes byte-adresserbar hukommelse. Historisk set læser mange CPU'er data i nogle multiple af otte bits. Fordi byte-størrelsen på otte bits er så almindelig, men definitionen ikke er standardiseret, bruges udtrykket oktet undertiden til eksplicit at beskrive en otte-bit sekvens.

En nibble (undertiden Nybble ), er en række bestående af fire bit. At være en halv-byte blev nippe navngivet som et ordspil. En person kan have brug for flere nibbles for en bid af noget; Tilsvarende er en nybble en del af en byte. Fordi fire bits giver mulighed for seksten værdier, kaldes en nibble undertiden som et hexadecimalt tal .

Visning af oktalt og hexadecimalt tal

Oktal og hexadecimal kodning er praktiske måder at repræsentere binære tal, som de bruges af computere. Computeringeniører har ofte brug for at skrive binære mængder ud, men i praksis er skrivning af et binært tal som 1001001101010001 kedeligt og tilbøjeligt til fejl. Derfor er binære størrelser skrevet i en base-8 eller "oktal" eller, meget mere almindeligt, en base-16, "hexadecimal" ( hex ), talformat. I decimalsystemet er der 10 cifre, 0 til 9, som kombineres til at danne tal. I et oktalt system er der kun 8 cifre, 0 til 7. Det vil sige, at værdien af ​​en oktal "10" er den samme som en decimal "8", en oktal "20" er en decimal "16", og så på. I et hexadecimalt system er der 16 cifre, 0 til 9 efterfulgt af konvention med A til F. Det vil sige, et hexadecimalt "10" er det samme som et decimal "16" og et hexadecimalt "20" er det samme som et decimal "32". Et eksempel og en sammenligning af tal i forskellige baser er beskrevet i nedenstående skema.

Ved indtastning af tal bruges formateringstegn til at beskrive nummersystemet, for eksempel 000_0000B eller 0b000_00000 for binært og 0F8H eller 0xf8 for hexadecimale tal.

Konvertering mellem baser

Tabel 3: Sammenligning af værdier i forskellige baser
Decimal Binær Octal Hexadecimal
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 13 0B
12 001100 14 0C
13 001101 15 0D
14 001110 16 0E
15 001111 17 0F

Hvert af disse talsystemer er et positionssystem, men mens decimalvægte er kræfter på 10, er de oktale vægte kræfter på 8 og de hexadecimale vægte er kræfter på 16. At konvertere fra hexadecimal eller oktal til decimal, for hvert ciffer multiplicerer man værdi af cifferet med værdien af ​​dets position og tilføjer derefter resultaterne. For eksempel:

Repræsenterer fraktioner i binær

Faste punktum

Formatering med fast punkt kan være nyttigt til at repræsentere brøker i binær.

Antallet af bits, der er nødvendige for den nøjagtige præcision og rækkevidde, skal vælges for at gemme brøkdel og heltal af et tal. F.eks. Ved anvendelse af et 32-bit format kan 16 bit bruges til heltalet og 16 til brøkdelen.

Ottens bit efterfølges af fires bit, derefter to bit, derefter ens bit. Brøkdelbitene fortsætter det mønster, der er indstillet af heltalbitene. Den næste bit er halvdelens bit, derefter kvartens bit, derefter ⅛'s bit osv. For eksempel:

heltal bits brøkdele
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 form for kodning kan ikke repræsentere nogle værdier i binær. For eksempel brøkdelen 1 / 5 , 0,2 i decimal, vil de nærmeste tilnærmelser være som følger:

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

Selvom der bruges flere cifre, er en nøjagtig gengivelse umulig. Nummeret 1 / 3 , skrevet i decimal som 0.333333333 ..., fortsætter på ubestemt tid. Hvis den afsluttes for tidligt, repræsenterer værdien ikke 1 / 3 præcist.

Flydende numre

Mens både usignerede og underskrevne heltal bruges i digitale systemer, er selv et 32-bit heltal ikke nok til at håndtere alle de række af numre, som en lommeregner kan håndtere, og det inkluderer ikke engang brøker. For at tilnærme det større interval og præcision af reelle tal er vi nødt til at opgive underskrevne heltal og faste punktum og gå til et " flydende punkt " -format.

I decimalsystemet kender vi formens flydende tal ( videnskabelig notation ):

1,1030402 × 10 5 = 1,1030402 × 100000 = 110304,02

eller mere kompakt:

1.1030402E5

hvilket betyder "1.1030402 gange 1 efterfulgt af 5 nuller". Vi har en vis numerisk værdi (1.1030402) kendt som en " significand ", ganget med en effekt på 10 (E5, hvilket betyder 10 5 eller 100.000), der er kendt som en " eksponent ". Hvis vi har en negativ eksponent, betyder det, at tallet ganges med en 1, der mange steder til højre for decimaltegnet. For eksempel:

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

Fordelen ved denne ordning er, at ved at bruge eksponenten kan vi få et meget bredere interval af tal, selvom antallet af cifre i signifikant eller "numerisk præcision" er meget mindre end området. Lignende binære flydende punktformater kan defineres til computere. Der er en række sådanne ordninger, de mest populære er blevet defineret af Institute of Electrical and Electronics Engineers (IEEE). Den IEEE 754-2008 standard specifikation definerer en 64 bit floating-point format med:

  • en 11-bit binær eksponent ved hjælp af "excess-1023" -format. Overskud-1023 betyder, at eksponenten vises som et usigneret binært heltal fra 0 til 2047; at trække 1023 giver den faktiske underskrevne værdi
  • en 52-bit signifikant, også et usigneret binært tal, der definerer en brøkværdi med en ledende underforstået "1"
  • et tegnbit, der giver nummeret på nummeret.

Lad os se, hvordan dette format ser ud ved at vise, hvordan et sådant nummer vil blive gemt i 8 byte hukommelse:

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 blevet ekstraheret, konverteres de med beregningen:

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

Denne ordning giver numre, der er gyldige til ca. 15 decimaler med følgende talinterval:

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

Specifikationen definerer også flere specielle værdier, der ikke er definerede tal, og er kendt som NaNs , for "Not A Number". Disse bruges af programmer til at betegne ugyldige operationer og lignende.

Nogle programmer bruger også 32-bit floating-point numre. Den mest almindelige ordning bruger en 23-bit signifikant med en tegnbit plus en 8-bit eksponent i "overskydende-127" -format, hvilket giver syv gyldige decimalcifre.

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 konverteres til en numerisk værdi med beregningen:

<sign> × (1 + <fraktioneret significand>) × 2 <eksponent> - 127

hvilket fører til følgende rækkevidde:

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

Sådanne flydende tal er kendt som "reals" eller "floats" generelt, men med et antal variationer:

En 32-bit floatværdi kaldes undertiden en "real32" eller en "single", hvilket betyder "single-precision floating-point-værdi".

En 64-bit float kaldes undertiden en "real64" eller en "double", hvilket betyder "dobbelt-præcision floating-point værdi".

Forholdet mellem tal og bitmønstre vælges af bekvemmelighed i computermanipulation; otte byte gemt i computerhukommelsen kan repræsentere et 64-bit rigtigt, to 32-bit real eller fire signerede eller usignerede heltal eller en anden form for data, der passer ind i otte byte. Den eneste forskel er, hvordan computeren fortolker dem. Hvis computeren lagrede fire usignerede heltal og derefter læste dem tilbage fra hukommelsen som en 64-bit reel, ville det næsten altid være et perfekt gyldigt reelt tal, selvom det ville være junk data.

Kun et endeligt område af reelle tal kan repræsenteres med et givet antal bits. Aritmetiske operationer kan løbe over eller understrømme og producere en værdi, der er for stor eller for lille til at blive repræsenteret.

Repræsentationen har en begrænset præcision. For eksempel kan kun 15 decimalcifre repræsenteres med en 64-bit real. Hvis der føjes et meget lille flydende nummer til et stort, er resultatet bare det store. Det lille antal var for lille til endda at dukke op i 15 eller 16 cifre opløsning, og computeren kasserer det effektivt. Analysering af effekten af ​​begrænset præcision er et velstuderet problem. Skøn over størrelsen af ​​afrundingsfejl og metoder til at begrænse deres virkning på store beregninger er en del af ethvert stort beregningsprojekt. Præcisionsgrænsen er forskellig fra rækkevidden, da den påvirker signifikant og ikke eksponenten.

Betydningen er en binær brøk, der ikke nødvendigvis passer perfekt til en decimalbrøk. I mange tilfælde svarer en sum af gensidige kræfter på 2 ikke til en bestemt decimalfraktion, og resultaterne af beregningerne vil være lidt ude. For eksempel svarer decimalfraktionen "0,1" til en uendeligt gentagende binær brøk: 0,000110011 ...

Tal i programmeringssprog

Programmering på samlingssprog kræver, at programmøren holder styr på repræsentationen af ​​tal. Hvis processoren ikke understøtter en påkrævet matematisk operation, skal programmøren udarbejde en passende algoritme og instruktionssekvens til at udføre operationen; på nogle mikroprocessorer skal der foretages endog multiplikation af heltal i software.

Programmeringssprog på højt niveau som Ruby og Python tilbyder et abstrakt tal, der kan være en udvidet type som rationel , bignum eller kompleks . Matematiske operationer udføres af biblioteksrutiner leveret af implementeringen af ​​sproget. Et givet matematisk symbol i kildekoden, ved operatøroverbelastning , vil påkalde forskellige objektkoder, der passer til repræsentationen af ​​den numeriske type; matematiske operationer på ethvert tal - hvad enten det er signeret, usigneret, rationelt, flydende punkt, fast punkt, integreret eller komplekst - skrives nøjagtigt på samme måde.

Nogle sprog, såsom REXX og Java , giver decimaler flydende punktoperationer, som giver afrundingsfejl i en anden form.

Se også

Noter og referencer

Den oprindelige version af denne artikel var baseret på en public domain- artikel fra Greg Goebels Vectorsite .