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.
| Binær streng | Oktal værdi |
|---|---|
| 000 | 0 |
| 001 | 1 |
| 010 | 2 |
| 011 | 3 |
| 100 | 4 |
| 101 | 5 |
| 110 | 6 |
| 111 | 7 |
| 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
| 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 .