jueves, marzo 17, 2005

Numeros flotantes y un exponente 'x'

Bueno veamos un programa sencillo pero muy interesante….

#include
main()
{
float a,b;
clrscr();
b=2.0e20+1.0;
a=b-2.0e20;
printf("\n Valor de a: %f",a);
getch();
}


El saber porque cuando un lo compila no da 1.0, si se hace en una calculadora eso sale… y porque el programa no lo hace?, bueno una explicación a esto podría ser que :

La estructura de la memoria del computador
Los números se almacenan en las variables. Una variable representa un trozo de la memoria del computador. La memoria está formada por una gran cantidad de bytes y cada byte está constituido por 8 bits. Un bit puede almacenar un 1 o un 0.

Los reales
Una variable real (float) está formada por 4 bytes, es decir el doble de un entero. En ella se almacenan números reales en formato binario.
Representación en punto flotante
Un número real se almacena en una variable especificando 3 componentes: el signo (+ o -), la mantisa y el exponente. Por ejemplo, el número 11 se representa como:

el signo: +
mantisa: 10110000...
exponente: 4

La mantisa es una secuencia de bits que siempre comienza en 1. El exponente indica en donde colocar el punto que separa la parte entera de la fraccionaria. Un valor 0 indica que el punto se coloca justo antes del primer bit. Un valor 4 indica que se coloca después del cuarto bit. Un valor -3 indica que hay que imaginar que el número va precedido por 0.000 y luego viene la mantisa.

¿Qué número es el siguiente?

el signo: -
mantisa: 110010000...
exponente: 7
Solución: -1100100.00... , que es -(4+32+64)= -100

En una variable de tipo real se destina 1 bit para el signo, 7 bits para el exponente y 24 bits para la mantisa.
Precisión y error de representación

La desventaja es que los números se almacenan con una precisión limitada. Esto significa que un número que requiera 100 bits de mantisa será aproximado a uno que solo ocupa 24, introduciéndose entonces un error de representación.
El error que se comente se puede visualizar mejor en base 10. El error que comete es como cuando el siguiente número:

1234567890123456789012345678901234567890

Se aproxima al siguiente valor:

1234567*10^33

Es decir, solo se representan 7 dígitos de los 40 iniciales. El error absoluto que se comete es:
890123456789012345678901234567890

Que parece enorme, pero lo que importa es el error relativo que es ~10^(-7) que es bajísimo y para la mayoría de las aplicaciones numéricas es insignificante. Pero es un error que conviene tener presente.