Posts actuales

miércoles, septiembre 12, 2007

Calcular el epsilon de la maquina y errores de truncamiento

Todos sabemos que la computadoras utilizan el sistemas binario para contar, también que el numero de bits de los registros de los procesadores es imitado, los mas comunes hoy en día son los sistemas de 30 y 36bits, lo que vamos a aprender aquí es a encontrar el limite del numero mas pequeños que puede ser registrado por un procesador, este numero se conoce con el nombre de epsilon de la maquina, este numero es muy importante porque nos dice el orden de los errores que se producen en cada calculo de nuestro procesador.

La manera de calcular el epsilon es muy sencilla, solo es necesario tomar un numero cualquiera y dividirlo entre dos consecutivamente hasta que el resultado sea igual que el numero dividido, esto significa que ya no fue posible subdividirlo mas ya que es la cantidad mas pequeña soportada por el registro del procesador. El error producido por este paso finto entre dos números produce un error de truncamiento, debido a hay en imposible representar exactamente un numero que no sea un múltiplo exacto de el epsilon de la maquina, que es caso usual. Los errores de truncamiento se acumulan por esto cuando se realiza un operación muchas veces se puede notar muy fácilmente el efecto que estos producen en los cálculos.

El código en C++ a continuación contiene un bucle que calcula el epsilon de la maquina y tiene un demostración de los errores de truncamiento en una sumatoria.
Código: Seleccionar todo

#include
#include
#include

using namespace std;

long double epsilon=1;
long double suma = 1;

int main(void)
{
// Para encontrar el epsilon de la maquina
while(epsilon+1.0>1.0){
epsilon=epsilon/2.0;
}
cout.setf(ios::scientific);
cout <<setprecision(16)<<"\nEl epsilon de la maquina = "<epsilon<"\n\n";

// Esta suma es para ver el error de truncamiento
for(int i = 1; i<=10000; i++)
{
suma = suma + 0.000010000000;
}
epsilon = 10000 * 0.000010000000 + 1;

cout <setprecision(16)<"El producto es = "<epsilon<"\n";
cout <setprecision(16)<"La suma es = "<suma<"\n";
cout <setprecision(16)<"El error acumulado es = "<suma-epsilon<"\n\n";

return 0;
}