Cálculos binarios para aritmética decimal.

Continuando investigando el problema de la precisión decimal usando aritmética binaria, que comenzó en publicaciones anteriores [1, 2, 3, 4], pude desarrollar algoritmos para calcular números reales presentados en el formato de números decimales de coma flotante, que dan el mismo resultado exacto que si Los cálculos se realizarían manualmente.

Estos algoritmos usan aritmética binaria, regulada por el estándar IEEE754. Para probar el funcionamiento de los algoritmos, se desarrolló un programa de prueba en C ++ que implementa una calculadora decimal de 18 bits.
Como el volumen del material excede el formato de la publicación, expuse los puntos principales en forma de resúmenes. Llamaremos a esta publicación las Tesis de mayo :(.

Entonces

Se sabe que


La aritmética familiar para el usuario es la aritmética decimal.

También hay aritmética b-ary, donde b es la base del sistema numérico, tomando cualquier valor distinto de cero [5].

Para mostrar números a diferentes escalas, usamos la notación de números de coma flotante en forma de un producto de la mantisa y algún grado arbitrario de base. Esta es la llamada notación exponencial.

Si el grado del número es fijo y la mantisa del número es un número entero, entonces este formato se llama formato de punto fijo. Un caso especial del formato de punto fijo es un número en el que el grado es cero. Este formato es un formato entero.

Si la mantisa es un número fraccionario en el sistema de números b-ary con la parte entera c ≠ 0 y c <b, entonces dicho número se llama normalizado.

A pesar de que, por su naturaleza física, los números son aproximados, para un dispositivo informático estos son números exactos y el dispositivo debe realizar operaciones en ellos con una precisión especificada por el usuario.

Los cálculos precisos en aritmética significan obtener un resultado con un número dado de dígitos significativos válidos después del punto [6].

Todos los cálculos en la computadora se realizan en forma binaria. Para ellos, la base es b = 2.

Dado que los sistemas de números binarios y decimales son inconmensurables, al convertir números reales decimales en código binario, con frecuencia obtenemos el valor aproximado del equivalente binario del número decimal. Por lo tanto, al traducir números decimales a binario, se producen errores de representación.

Los números decimales que tienen el equivalente binario exacto se llaman representables.
Los números decimales que no tienen el equivalente binario exacto se llaman no representativos.

Todos los números decimales enteros son representables si el número de dígitos significativos en su equivalente binario no excede la cuadrícula de bits del área de palabras de máquina en la que están escritos.

Cuantos más dígitos binarios se represente el equivalente binario del número, menor será el error de presentación. Esto explica el deseo de aumentar constantemente la capacidad del registro operativo del procesador.

Cualquier número decimal cuyo equivalente binario contiene el número de dígitos significativos que excede la cuadrícula de bits de una palabra de máquina solo se puede representar aproximadamente.

Las operaciones aritméticas, que dan como resultado un resultado que excede la profundidad de bits de la palabra máquina mantisa, devuelven un número aproximado.

Los números aproximados pueden contener números verdaderos, dudosos e incorrectos.
Los números incorrectos en los cálculos afectan la precisión y algunas veces pueden conducir a resultados completamente incorrectos [3].

De acuerdo con la teoría de los cálculos aproximados, para obtener resultados correctos, los números aproximados se redondean para excluir los números incorrectos [6].

La precisión que el usuario desea, o puede obtener en los cálculos, está determinada por la cantidad de dígitos válidos que proporciona el algoritmo computacional.

Cualquier número binario se puede redondear al número especificado de dígitos binarios, descartando bits adicionales.

Del mismo modo, cualquier número decimal se puede redondear al número requerido de dígitos decimales, descartando dígitos adicionales.

No puede simplemente descartar dígitos binarios adicionales en un número binario para redondear su equivalente decimal a un número dado de dígitos decimales, ya que al disminuir la profundidad de bits del equivalente binario de un número decimal aumentará el número de dígitos inválidos en su equivalente decimal.

Cualquier número real expresado en forma de fracción decimal puede representarse con precisión en el formato de un número de punto flotante (TFT), en el que la mantisa es un número entero. El expositor en el NTC indicará la posición del punto en ese número.

Si el número se presenta en el formato de un NTC con una mantisa entera, entonces la mantisa y el exponente de este número se pueden convertir con precisión en código binario.

Nuevo


Un formato en el que la mantisa decimal TNT está representada por el equivalente binario de la mantisa entera decimal, y el exponente es el equivalente binario de la potencia de 10 (base b = 10), se denominará formato mixto decimal-binario (SDDF).

La diferencia entre el SDDF y el formato TFT binario es que el exponente en el SDDF es igual al grado base b = 10, mientras que el exponente del formato TFT binario es igual al grado base binario b = 2. En consecuencia, para SDDF, el número se presentará como F=M210ey para el CNC, en el estándar IEEE754, como F=M22e.

La diferencia entre el SDDF y el formato decimal binario (DDF o BCD) del CTT es que en el DDF la mantisa y el exponente son números decimales enteros en los que cada dígito se escribe como un byte o tétrada, mientras que en el SDDF todos los números decimales se expresan sus equivalentes binarios enteros.

Por lo tanto, cualquier número real decimal puede representarse en SDDF con un código binario de hasta N dígitos decimales significativos.

Todas las operaciones aritméticas en CTD decimales en SDDF se llevan a cabo de acuerdo con las reglas de la aritmética ordinaria, donde todos los argumentos son enteros.

Antes de cada operación aritmética, el número decimal se representa en el formato SDDF: [S, M, z, e]. ¿Dónde está el código S del signo del número (0 o 1)? M es el número entero binario equivalente de la mantisa de un número con el número de dígitos decimales N. Donde N es la precisión de los cálculos. z es el signo del exponente, e es el valor del exponente. Tal representación es una representación decimal normalizada.

Por ejemplo, para cálculos con precisión de N = 7 dígitos significativos, el número 123,456 debe representarse como 1234560 * 10 ^ -4.

La mantisa decimal mínima para N = 7 será M = 1,000,000.

La mantisa decimal máxima para N = 7 será M = 9999999.

El equivalente binario del número máximo de 7 bits 9999999 será 100 110 001 001 011 001 111 111. Contiene 24 dígitos binarios. Por lo tanto, se requiere un registro binario de 24 bits para representar mantisas decimales en el rango de 1,000,000 a 9999999.

Si en una palabra de máquina binaria de 32 bits, en la que se asignan 24 dígitos a la mantisa, se asigna un dígito al signo del número S, un dígito al signo del exponente z y 6 dígitos al exponente, entonces los números reales decimales se pueden representar en tal SDF preciso a N = 7 números decimales significativos. Los valores absolutos de estos números varían de 1,000,000 * 10 ^ -64 a 9999999 * 10 ^ 64.

Después de cada operación aritmética, la mantisa decimal del número debe normalizarse y redondearse al entero más cercano. Para hacer esto, el equivalente binario resultante de la mantisa del número, si es necesario, debe multiplicarse o dividirse por el equivalente binario de 10 hasta el punto de que el número de dígitos del equivalente decimal de la mantisa sea igual a N. El número resultante debe redondearse al número entero más cercano.

Un ejemplo

Encuentre, hasta N = 7, el resultado de la expresión (9675,423 * 10 ^ 2-9,675421 * 10 ^ 5) * 10 ^ 6 - 199992
Calculada manualmente, o en una calculadora de Windows, esta expresión será igual al número 8.000000
Escribimos los operandos en forma normalizada:

A=9,675423*10^5= 9675423*10^-1
B= 9675,421*10^2 = 9675421*10^-1
C=1000000 = 1000000*10^0
D = 1999920*10^-1


En SDDF, estos operandos se representarán como:

A=[0, 9675423,1, 1]
B=[0,9675421,1, 1]
C=[0, 1000000,0, 0]
D=[0, 1999920,1, 1]


Encuentra la diferencia S = AB. Como los exponentes de los operandos A y B son iguales, encontramos la mantisa de su diferencia:

9675423-9675421=2

Para normalizar la mantisa S, debemos multiplicarla por 10 ^ 6, mientras que el exponente debe reducirse por 6. Entonces S = 2 * 1,000,000 = 2,000,000 * 10 ^ -7

Calculamos el producto P = D * C. Para hacer esto, multiplique la mantisa de los factores y agregue los exponenciales:

M = 2,000,000 * 10 ^ -7 * 1,000,000 * 10 * 0 = 2,000,000,000,000 * 10 ^ -7
Después de normalizar la mantisa, obtenemos P = 2,000,000 * 10 ^ -1.
El resultado del cálculo R será igual a:
R = PD = 2,000,000 * 10 ^ -1-1999920 * 10 ^ -1 = 80 * 10 ^ -1
Después de la normalización, obtenemos R = 8000000 * 10 ^ -6.

A modo de comparación, calcular esta expresión en Excel da el resultado R = 8,0000698E + 00.

El autor ha desarrollado un algoritmo de calculadora en el SDDF que realiza la suma, resta, multiplicación y división de números decimales de hasta 18 dígitos significativos. Para confirmar la exactitud del algoritmo, se escribió un programa C ++. Como el autor no es un programador profesional, el programa desarrollado está destinado únicamente al estudio del algoritmo de cálculo.

A continuación, por ejemplo, hay una captura de pantalla que muestra el cálculo de la siguiente expresión:

1,23456789098765432*10^8 * 9,87654321234567891*10^(-9) - 1,2193263123914037*10^0≈ 3.0*10^(-17)



Para probar el rendimiento, la operación de multiplicar dos números de 18 bits se lanzó en un ciclo. El programa se ejecutó en una computadora Intel® Core (TM) i3-4330 CPU@3.50GHz 3.50 GHz. RAM 8.0 GB. Tipo de sistema: 64 bits La velocidad era igual a ≈ 2.4 * 10 ^ 6 multiplicaciones por segundo.

No puedo comparar con la velocidad de las calculadoras de Windows y Excel hasta ahora, no hay suficiente educación :(. En cuanto a la precisión de los cálculos, es lo mismo que si los cálculos se hicieran manualmente.

Referencias

  1. Vista lateral: estándar IEEE754
  2. ¿Es necesaria la normalización del flotador?
  3. Errores aritméticos binarios fatales al trabajar con números de coma flotante
  4. De nuevo sobre números de coma flotante
  5. Sistemas de numeración
  6. Reglas básicas para cálculos aproximados

Source: https://habr.com/ru/post/es412681/


All Articles