Anar al contingut

Format en menge flotant de simple precisió

De L'Enciclopèdia, la wikipedia en valencià

El format en menge (o punt) flotant de precisió simple és un format de número de computador o ordenador que ocupa 4 bytes (32 bits) en la seua memòria i representa un ampli ranc dinàmic de valors per mig de l'us de la menge flotant.

En la norma o estàndar IEEE 754-2008 el format de 32 bits de base 2 es coneix oficialment com binary32, encara que se li cridava single en la versió prèvia de l'estàndart IEEE 754-1985. En els equips més antics, es varen utilisar diferents formats de menge flotant de 4 bytes, com a eixemple, el tipo de senyes de precisió simple en el llenguage de programació GW-BASIC era un format de menge flotant de 32 bits MBF (Format Binario de Microsoft).

Un dels primers llenguages de programació en proporcionar tipos de senyes de menge flotant de simple i doble precisió va ser Fortran. Abans de l'adopció generalisada de l'estàndart IEEE 754-1985, la representació i les propietats del tipo de senyes simple i doble depenien del fabricant de l'equip i el model d'ordenador.

El format binario en menge flotant de precisió simple s'utilisa per comprendre un ranc de valors més ampli respecte al format de menge fixa (del mateix ample de bits), pero a costa de menor precisió. Un sancer en signe de 32 bits pot tindre un valor màxim de 231 - 1 = 2147483647, mentres que el valor màxim representable en menge flotant de l'estàndart IEEE 754 és (2-2−23) × 2127 ≈ 3,402823466×1038. Tots els número entero en sis o menys dígits decimals significatius es poden convertir a un valor de menge flotant IEEE 754 sense pèrdua de precisió, alguns número entero fins a nou dígits decimals significatius poden convertir-se a un valor de menge flotant IEEE 754 sense pèrdua de precisió, pero no és possible en els de més de nou dígits decimals significatius. Com a eixemple, l'número entero de 32 bits 2147483647 es convertix en 2147483650 aplicant la norma IEEE 754.

El format de precisió simple es coneix com REAL en Fortran,[1] float en C, C++, C#, Java,[2] Float en Haskell,[3] i, com Single en Delphi (Pascal), Visual Basic i MATLAB. No obstant, float en Python, Rubí, PHP, i OCaml i single en les versions d'Octave anteriors a la 3.2 es referixen a números de doble precisió. En la majoria de les implementacions de PostScript, l'única precisió real és simple.

Descripció del format

[editar | editar còdic]

L'estàndart IEEE 754 especifica que un format binary32 consta de:[4]

  • Bits de signe (S): 1 bit.
  • Exponent desplaçat (I): 8 bits.
  • Significant o Mantissa (T): 24 bits (23 almagasenats explícitament).

Este format proporciona una precisió de 6 a 9 dígits decimals significatius. Si una cadena decimal de fins a 6 dígits decimals significatius es convertix en format IEEE 754 de precisió simple i després es convertix de nou al mateix número de dígits decimals significatius, la cadena final deu coincidir en l'original i si un número de precisió simple IEEE 754 es convertix en una cadena decimal en a lo manco 9 dígits decimals significatius i després es convertix de nou a un número de precisió simple, llavors el número final deu coincidir en l'original.[5]

El bit de signe (S) determina el signe del número, que també és el signe de la mantissa o significant. L'exponent (I) és, tant un número entero de 8 bits en signe en el ranc de -126 a 127 (expressat en la forma de complement a 2) com un sancer sense signe (i) de 8 bits comprés de 0 a 255 que és la forma biaixada acceptada en la definició del format binary32 de IEEE 754. Si s'utilisa el format d'número entero sense signe, el valor de l'exponent utilisat en l'aritmètica és l'exponent desplaçat per un biaix (I). Per al cas del format binary32, un valor d'exponent desplaçat de 127 representa el zero real (és dir, per a que 2i-127 siga un, "i" deu valdre 127). L'exponent desplaçat (I=i-127) comprén des de −126 fins a +127 ya que els valors de −127 (tots zeros) i 128 (tots uns) són reservats per a números especials.

La mantissa real del format inclou 23 bits de la fracció a la dreta de la menge binaria i un bit d'encapçalat implícit (a l'esquerra de la menge binaria) en valor de "1" a menos que l'exponent s'almagasene en els seus bits en zero. Per lo tant només 23 bits de la mantissa apareixen en el format de la memòria, pero la precisió total és de 24 bits (equivalent a log10 (224) dígits ≈ 7225 decimals). Els bits s'establixen com seguix, per a este eixemple concret:

Archiu:Float example.svg

El valor real assumit per una determinada senya en format binary32 en un exponent biaixat (l'número entero sense signe de 8 bits) i una fracció de 23 bits ésː

v=(1)b31×(1,b22b21...b0)2×2e127=(1)b31×(1+i=022b22i2i)×2(e127)

a on:

  • b0,b1,,b22 (bits de la mantissa o significant)
  • b31=0
  • 1,b22b21...b0=1+i=123b23i2i=1+22=1,25
  • 2(e127)=2124127=23

per lo tant:

  • v=1.25×23=0,15625

Codificació de l'exponent

[editar | editar còdic]

L'exponent en els número binario de precisió simple en menge flotant es codifica per mig d'una representació desplaçada en binario, sent +127 el desplaçament zero; també conegut com a biaix d'exponent en la norma IEEE 754. Els valors de l'exponent són establits aixinaː

  • Imin = -126
  • Imax = 127
  • Biaix de l'Exponent = 127

Per lo tant, en la finalitat d'obtindre el verdader exponent com es definix per la representació binaria desplaçada, es té que restar el desplaçament de 127 de l'exponent almagasenat lo que equival a escriure-ho en complement a dos.

Els valors d'exponents expressats en el ranc de números en el sistema hexadecimal entre 0016 i FF16 s'interpreten de forma especial com s'indica en la següent taulaː

Exponent Significant zero Significant no-zero Equació
0016 zero, −0 números denormalizados (1)b31×(0,b22b21...b0)2×2e126
0116 a FE16 valor normalisat (1)b31×(1,b22b21...b0)2×2e127
FF16 ±infinit NaN (silenciós i senyalisat) Sense equació

El valor mínim positiu normalisat és de 2 −126 ≈ 1.18 × 10 −38 i el valor mínim positiu denormalizado és 2 −149 ≈ 1,4 × 10 −45.

Eixemples de conversió d'número decimal a format binary32

[editar | editar còdic]

En general, s'acodix a la norma IEEE 754 en sí per a la conversió estricta (incloent el comportament de grosseig) d'un número real en el seu equivalent en format binary32. Per a convertir un número real decimal en un de format binary32 es deu seguir el següent procedimentː[6]

  1. Si el número a analisar (N) és positiu, assignar a S=0 i, en cas contrari, S=1.
  2. Igualar N a 2x.
  3. Rebujar la variable "x", aplicant logaritmos decimals o naturals a abdós costats de l'equació.
  4. Prendre com a valor aproximat al sancer immediatament inferior i cridar-ho "i".
  5. Prendre novament l'número decimal N i igualar-ho a m*2i.
  6. Rebujar "m" i llevar-li la part sancera que sempre és "1". Est és el bit a l'esquerra de la menge binaria que mai s'inclou en el número en com a flotant.
  7. Prendre la fracció del resultat i convertir-la en binario. A este valor cridar-ho "T"
  8. Sumar a "i" el valor de 127 i convertir el resultat a binario cridant-ho "I"
  9. Juntar els resultats de S, I i T que formen part del número en format binary32.

La ventaja d'este procediment és que, en el pas 5, s'obté de colp i repent la mantissa, la qual es convertirà a binario, sense necessitat de convertir la part sancera, la qual sempre serà "1". A continuació, es presenten eixemples de conversió a format binary32 d'número real decimals majors que 1 tant sancers, com en part fraccionaria i un número chicotet major que zero i menor que 1. En números negatius, l'única diferència en el procés és la de fer el bit de signe igual a "1".

Número real sancer

[editar | editar còdic]

Considerem l'número real sancer 63. Aplicant el procés descrit anteriorment, s'obté:

63=2xx=ln63ln25,97

Per tant, el valor "i" serà el sancer immediatament inferior, el qual és 5. Novament usem 63 aplicant el pas 5 del procediment:

63=m×25m=6325=1,96875

Ya que l'exponent "i" és 5, se li suma el biaix de 127 unitats, la qual cosa dona 13210 equivalent a 100001002. La mantissa real consta dels 5 dígits a la dreta de la menge (0,96875) la qual es convertix a binario fins a completar els 23 bits del camp T (111110000000000000000002). Unint els resultats, es conseguix esta expressió:

01000010011111000000000000000000427C000016

L'expressió hexadecimal, com és habitual, s'obté a agrupant tots els bits en 8 conjunts de 4 i convertint cada u en el caràcter respectiu. En el cas d'un número real en part fraccionaria, es procedix d'igual manera, en la diferència de que el valor decimal de la mantissa serà convertit a binario de manera aproximada.

Número real gran en notació científica

[editar | editar còdic]

Per a número real molt grans en notació científica com 7,3491 x 1022, és aplicable el procediment descritːjj

7,3491×1022=2xx=ln7,3491×1022ln275,95

Redonejant al sancer inferior més pròxim, s'obté i = 75. Ara es calcula la mantissa:

7,3491×1022=M×275M=1,94529057310

La part fraccionaria és per tant 0,945290573 equivalent a 0,111100011111111010010002. A l'exponent decimal 75 se li sumen 127 unitats per a obtindre 202=110010102. Unint les cadenes numèriques, es conseguix la següent expressió en format binary32ː

011001010111100011111111010010002=6578FF4816

Número chicotet en notació científica

[editar | editar còdic]

Considerem l'número decimal 1023 x 10−21. Novament, apliquem el procediment ya conegut. Igualant este número a 2x:

1,023×1021=2xx=ln1,023×1021ln269,72


El sancer pròxim inferior de "x" és i=-70. Novament usem el número a analisar i ho igualem a m*2i:

1,023×1021=m×270m=1,023×10212701,207745228

La part fraccionaria de m (0,207745228) i es convertix a binario (0,001101010010111011001012) i a l'exponent i=-70 se li sumixca 127 i se li convertix a binario obtenint-se 001110012. Unint estes cadenes numèriques, es conseguix l'expressió en binary32:

000111001001101010010111011001012=1C9A976516

Si el valor per a "m" s'haguera redonejat a 1,2077 per eixemple, haurien existit errors que són inherents al format binary32 ya que es pert precisió encara que s'usen menys bits per a expressar cantitats decimals.

Eixemples en precisió simple

[editar | editar còdic]

Els eixemples que seguixen són expressions en hexadecimal i binario de valors en menge flotant que inclouen el signe, l'exponent desplaçat i la mantissa o significant.

3F80000016=001111111000000000000000000000002=1C000000016=110000000000000000000000000000002=2

Els següents valors són el màxim i el menor valor finito expressable en format de menge flotant

7F7FFFFF16=011111110111111111111111111111112=(1224)×21283,402823466×10380080000016=000000001000000000000000000000002=21261,175494351×1038

Les següents expressions proven l'existència de dos tipos de zeros en el format binary32:

0000000016=000000000000000000000000000000002=+08000000016=100000000000000000000000000000002=0

Estes expressions representen els valors infinits:

7F80000016=011111111000000000000000000000002=+FF80000016=111111111000000000000000000000002=

Conversió de binary32 a decimal

[editar | editar còdic]

Per a este eixemple de conversió, es comença en el número hexadecimal 41C80000, el qual és convertit a binario:

41C8000016=010000011100100000000000000000002

La cadena binaria deu ser dividida en tres parts: bit de signe (1 bit), exponent (8bits) i significant (23 bits).

  • Bit de signe= 0
  • Exponent: 1000 00112 = 131
  • Significant: 100 1000 0000 0000 0000 00002 = 48000016

Després, s'afig el bit implícit al significant:

  • Significant: 1100 1000 0000 0000 0000 00002

i es decodifica el valor de l'exponent restant-li 127: 131 − 127 = 4

Cada u dels 24 bits del significant (incloent el bit implícit), es multiplica per la potència de 2 corresponent:

bit I×20bit 22×21bit 21×22bit 20×23bit 19×24bit 18×25bit 0×223

En este eixemple la mantissa o significant té tres bits en "1 llògic": bit I (bit implícit, que sempre és "1"), bit 22 i bit 19. Sumant les tres contribucions d'estos bits :

  • Significant decodificado: 1 + 0,5 + 0,0625 = 1,5625.

Est significant deu ser multiplicat per la potència 4 de la base 2 per a obtindre el resultat final:

1,5625×24=25

Llímits de precisió sobre número entero

[editar | editar còdic]

La següent taula indica com són representats els números dins dels rancs indicats.

Rancs de sancers Representació de la mantissa
[16777216,16777216] Exacta
[33554432,16777217]o [16777217,33554432] Grosseig a un múltiple de

2 |-

[226,2251] o [225+1, 226] Grosseig a un múltiple de

4 |-

[2127,21261] o [2126+1, 2127] Grosseig a un múltiple de 2103
[2128+2104, 21271] o [2127+1, 21282104] Grosseig a un múltiple de 212723
(, 2128] o [2128, +) Grosseig a Infinit (± )

Optimisacions

[editar | editar còdic]

El disseny del format de menge flotant permet vàries optimisacions, resultants de la fàcil generació d'una aproximació d'un logaritmo binario des d'una vista sancera del patró de bits sense processar. L'aritmètica d'número entero i el desplaçament de bits poden produir una aproximació a la raïl quadrada recíproca (raïl quadrada inversa ràpida), comunament requerida en gràfics computarizados.

Vore també

[editar | editar còdic]

Referències

[editar | editar còdic]
  1. «REAL Statement» (en en). scc.ustc.edu.cn. University of Science and Technology of China. Archivat des d'el original, el 24 de febrer de 2021. Consultat el 4 de març de 2017.
  2. «Primitive Data Types (The Java™ Tutorials)» (en en-us). java.sun.com. Oracle Inc.. Consultat el 4 de març de 2017.
  3. «6 Predefined Types and Classes» (en en). www.haskell.org. Consultat el 4 de març de 2017.
  4. «IEEE Standard for Floating-Point Arithmetic» (en en). IEEE. Archivat des d'el original, el 6 de novembre de 2016. Consultat el 4 de març de 2017.
  5. William Kahan. «Lecture Notes on the Status of IEEE Standard 754 for Binary Floating-Point Arithmetic» (en en). Consultat el 4 de març de 2017.
  6. Antonio Bell. «Tutories UNED - IEEE 754 - Eixemples». Universitat d'Oviedo. Consultat el 4 de març de 2017.


Referències

[editar | editar còdic]