Os números máquina (previo)

Os ordenadores tan só usan un subconxunto finito dos números reais, os chamados números máquina ou números de punto flotante; son números da forma

\displaystyle \pm m\times b^{\displaystyle\pm e}

onde

  • a base b, nos ordenadores binarios, é 2;
  • a mantisa m é un número entre 0 e 1 con n cifras significativas (é  dicir, m = 0,d_1\ldots d_n con 0\leq d_i<b-1 e d_1 \neq 0, agás para o cero);
  • o expoñente e é un enteiro limitado (|e|<M, M prefixado).

Todo número real x aproxímase nun ordenador por un número máquina próximo, que chamaremos fl(x). As linguaxes de computación Matlab e Octave usan o estándar IEEE 754 para aritmética de punto flotante. En particular, gardan os números máquina co formato binary64, que reserva 52 bits para a mantisa, 10 bits para o expoñente e 2 bits para os respectivos signos. Eso significa que o numero de cifras binarias significativas é 52, polo que o número de cifras decimais significativas é de 15,9.

Exercicio: Obtén o valor do menor e maior número máquina que Matlab e Octave poden almacenar, usando os comandos realmin e realmax. Intenta gardar números fóra dese rango para comprender que se entende no estándar IEEE 754 por “infinito”.

O erro de redondeo unitario

O número máquina fl(x) próximo a x adoita escollerse por unha destas vías:

  • truncando, é dicir, eliminado as cifras decimais significativas de x máis aló da n-ésima;
  • redondeando, escollendo o máis cercano entre o anterior e o resultado de  sumarlle 1 na cifra n-ésima.

Así, se x=0,d_1d_2\ldots d_nd_{n+1} \ldots\times 2^{\displaystyle e}, supoñendo e válido,

  • o seu truncamento a n cifras significativas é 0,d_1d_2\ldots d_n \times 2^{\displaystyle e} e
  • mentres que o redondeo é o máis próximo entre o anterior e (0,d_1d_2\ldots d_n + 2^{-n})\times 2^{\displaystyle e}.

Por definición, o erro de redondeo é menor ou igual que o de truncamento. Ademais, calculando fl(x) por redondeo, cúmprese que

\displaystyle\left|\frac{x-fl(x)}x\right|\leq 2^{\displaystyle -n}.

O valor \varepsilon = 2^{\displaystyle -n} chámase erro de redondeo unitario ou épsilon.

Exercicio: Acha o valor do épsilon en Matlab/Octave usando o comando eps. Comproba que se axusta á definición do épsilon, tendo en conta que n=52 no estándar IEEE 754.

Exercicio: Trunca e redondea o número \pi a 5 cifras decimais significativas.

O erro nas operacións básicas

O épsilon tamén serve de cota para o erro que aparece nas operacións básicas: se x e y son números máquina, daquela

\left|\frac{\displaystyle x\odot y -fl(x\odot y)}{\displaystyle x\odot y}\right|\leq \varepsilon,

onde \odot representa calquera das catro operacións básicas. É dicir, cando facemos un cálculo nun ordenador, non podemos esperar que o resultado sexa exacto; haberá, como pouco, un erro da orde de épsilon. Por exemplo, se comprobamos en Matlab/Octave se e^{\log 10} é igual a 10, veremos que, en xeral, non é así: exp(log(10))==10 devolve 0.

O caso anterior ilustra unha regra importante en programación: non se debe comprobar se un número en punto flotante é igual a outro (por exemplo, x==10), senón se o erro relativo é da orde de épsilon (mellor usar abs(x-10)<=eps*abs(x)).

Acabamos de ver como é o erro computacional cando operamos con números máquina. Na entrada seguinte, veremos un caso no que o erro empeora respecto da mesma operación con números reais.

Advertisements
Esta entrada foi publicada en Cálculo numérico. Ligazón permanente.

Deixar unha resposta

introduce os teu datos ou preme nunha das iconas:

Logotipo de WordPress.com

Estás a comentar desde a túa conta de WordPress.com. Sair / Cambiar )

Twitter picture

Estás a comentar desde a túa conta de Twitter. Sair / Cambiar )

Facebook photo

Estás a comentar desde a túa conta de Facebook. Sair / Cambiar )

Google+ photo

Estás a comentar desde a túa conta de Google+. Sair / Cambiar )

Conectando a %s