Lección
La teoría — Coma flotante291 palabras
Un número en coma flotante es un número entero multiplicado por una potencia de dos: (−1)s × 1.f × 2E−1023. El formato decide cuántos bits corresponden a E y cuántos a f. Esta única división determina tanto el alcance del formato como su precisión para distinguir entre dos números.
Qué significa cada símbolo
s- el bit de signo, 0 para positivo y 1 para negativo. Va por separado en lugar de estar integrado en el número, y por eso el formato tiene un +0 y un −0.
E- el campo del exponente, almacenado con 1023 sumado para poder ser negativo sin necesitar un signo propio. Define en qué rango te encuentras, y el rango es lo que determina la distancia entre dos números vecinos.
f- la fracción: 52 bits que siguen a un 1 inicial que nunca se guarda, puesto que un número normalizado siempre empieza por uno. Esos 52 bits contienen toda la precisión, y el exponente no aporta ninguna.
- Supone
- Que el número es finito y normal. Por debajo de 2−1022 se descarta el 1 inicial y el formato continúa funcionando a costa de perder precisión, por lo que el valor positivo más pequeño de doble precisión es 4,94 × 10−324 y aporta un solo bit de mantisa.
- Falla cuando
- En dos partes, ambas en código real. Comparar dos valores calculados con
=falla siempre que se llegue a ellos por vías distintas, ya que cada método aplica el redondeo a su manera. Además, una suma larga depende del orden en el que se ejecuta. Suma una lista hacia adelante y luego hacia atrás; verás que los totales difieren. Si añades primero los términos más pequeños, la pérdida es mínima.
Problema resuelto al detalle
-
Un sistema de pagos almacena importes en libras usando binary64. Demuestra que tanto 0,10 £ como 0,20 £ se guardan con un valor ligeramente alto, que su suma no da 0,30 £ y explica cómo lo soluciona un ingeniero de pagos.
-
0,1 en base dos es 0,0001 seguido de 1001 que se repite infinitamente. Una décima necesita un cinco en su denominador, pero una fracción binaria solo tiene doses, por lo que el desarrollo nunca se cierra.
-
Se conservan 53 dígitos binarios y los demás se eliminan por redondeo. En este caso se redondean hacia arriba, por lo que el valor almacenado supera a 0,1 en 5,55 × 10⁻¹⁸. El paso de redondeo en la página ilustra esta dirección con una flecha.
-
0,2 tiene esos mismos 53 dígitos con el exponente incrementado en uno, por lo que su error es exactamente el doble: 1,11 × 10⁻¹⁷. Introduce 0,2 en la casilla y compara las dos tarjetas de error.
-
Al sumarlos, los dos valores almacenados caen exactamente en el punto medio entre los dos doubles situados a cada lado de 0,3. En caso de empate, se elige al vecino que termina en un bit par, que es el número superior.
-
Así que lo que se obtiene es 0,3000000000000000444089209850062616169452667236328125, y cualquier cálculo posterior arrastrará este valor.
-
Ahora teclea 10 y 20 en lugar de 0,1 y 0,2. Ambos son números enteros muy inferiores a 2⁵³, los dos se representan con exactitud, y 10 + 20 da 30 sin perder nada en el proceso.
Respuesta
Almacena el dinero como un número entero de la unidad más pequeña, peniques en lugar de libras, y la aritmética será exacta porque cada número entero hasta 2⁵³ es exacto. El único redondeo que queda es el que escribes tú mismo, en el momento que eliges, ahí donde puedes verlo claramente. La herramienta te muestra ambas partes en diez segundos: teclea 0,1 y la tarjeta de error no es cero, teclea 10 y sí lo es.
-