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