Hola, hace tiempo que me venía rondando por la cabeza la idea de la precisión de la representación binaria de los números en coma flotante. He hecho unas pequeñas funciones en C que lo calculan y quería compartirlo con vosotros y escuchar vuestras sugerencias o incluso correcciones. En realidad fue bastante fácil tras leer detenidamente cómo se hace la representación en Wikipedia. Les dejo el código:
Para obtener el error de redondeo de variables de doble precisión (double):
Y de precisión simple (float):
Un pequeño ejemplo de prueba:
Obviamente las funciones necesitan la librería math.h y compilarse con -lm (GCC) y el ejemplo usa stdio.h.
Espero que les sea útil.
Para obtener el error de redondeo de variables de doble precisión (double):
Código:
double error(double x)
{
if(x==0.0 || log2(fabs(x))<-1022.0)
{
return ldexp(1.0,-1074);
}
else
{
return ldexp(fabs(x),-52);
}
return NAN;
}
Código:
float errorf(float x)
{
if(x==0.0f || log2f(fabsf(x))<-126.0f)
{
return ldexpf(1.0f,-149);
}
else
{
return ldexpf(fabsf(x),-23);
}
return NAN;
}
Código:
int main(int nargs, char **argv)
{
int i;
printf("DOUBLE:\n");
double a,e;
for(i=0; i<55; i++)
{
a = ldexp(1.0,-1021-i);
e = error(a);
printf("2^%d => %g +- %g (%g)\n",-1021-i,a,e,e/fabs(a));
}
printf("\nFLOAT:\n");
float f,ef;
for(i=0; i<26; i++)
{
f = ldexpf(1.0,-125-i);
ef = errorf(f);
printf("2^%d => %g +- %g (%g)\n",-125-i,f,ef,ef/fabsf(f));
}
return 1;
}
Espero que les sea útil.







Comentario