stringtranslate.com

Aritmética de punto fijo

En informática , el punto fijo es un método para representar números fraccionarios (no enteros) almacenando un número fijo de dígitos de su parte fraccionaria. Las cantidades en dólares , por ejemplo, a menudo se almacenan con exactamente dos dígitos fraccionarios, que representan los centavos (1/100 de dólar). De manera más general, el término puede referirse a la representación de valores fraccionarios como múltiplos enteros de alguna unidad pequeña fija, por ejemplo, una cantidad fraccionaria de horas como un múltiplo entero de intervalos de diez minutos. La representación de números en punto fijo a menudo se contrasta con la representación en punto flotante, más complicada y exigente desde el punto de vista computacional.

En la representación de punto fijo, la fracción a menudo se expresa en la misma base numérica que la parte entera, pero usando potencias negativas de la base b . Las variantes más comunes son decimal (base 10) y binaria (base 2). Este último también se conoce comúnmente como escalado binario . Por lo tanto, si se almacenan n dígitos de fracción, el valor siempre será un múltiplo entero de b n . La representación de punto fijo también se puede utilizar para omitir los dígitos de orden inferior de valores enteros, por ejemplo, cuando se representan valores grandes en dólares como múltiplos de $1000.

Cuando se muestran números decimales de coma fija para lectura humana, los dígitos de fracción generalmente están separados de los de la parte entera por un carácter de base (generalmente '.' en inglés, pero ',' o algún otro símbolo en muchos otros idiomas). Internamente, sin embargo, no hay separación y la distinción entre los dos grupos de dígitos está definida únicamente por los programas que manejan dichos números.

La representación en punto fijo era la norma en las calculadoras mecánicas . Dado que la mayoría de los procesadores modernos tienen una unidad de punto flotante (FPU) rápida, las representaciones de punto fijo ahora se utilizan sólo en situaciones especiales, como en microprocesadores y microcontroladores integrados de bajo costo ; en aplicaciones que exigen alta velocidad y/o bajo consumo de energía y/o área de chip pequeña , como procesamiento de imágenes , video y señales digitales ; o cuando su uso sea más natural para el problema. Ejemplos de esto último son la contabilidad de cantidades en dólares, cuando las fracciones de centavos deben redondearse a centavos enteros de maneras estrictamente prescritas; y la evaluación de funciones mediante búsqueda de tablas .

Representación

Una representación de punto fijo de un número fraccionario es esencialmente un número entero que se multiplica implícitamente por un factor de escala fijo. Por ejemplo, el valor 1,23 se puede almacenar en una variable como el valor entero 1230 con un factor de escala implícito de 1/1000 (lo que significa que se supone implícitamente que los últimos 3 dígitos decimales son una fracción decimal), y el valor 1 230 000 puede representarse como 1230 con un factor de escala implícito de 1000 (con "menos 3" dígitos de fracción decimal implícitos, es decir, con 3 dígitos cero implícitos a la derecha). Esta representación permite que las unidades aritméticas enteras estándar realicen cálculos con números racionales .

Los valores negativos generalmente se representan en formato binario de punto fijo como un entero con signo en representación en complemento a dos con un factor de escala implícito como se indicó anteriormente. El signo del valor siempre estará indicado por el primer bit almacenado (1 = negativo, 0 = no negativo), incluso si el número de bits de fracción es mayor o igual al número total de bits. Por ejemplo, el entero binario de 8 bits con signo (11110101) 2 = −11, tomado con -3, +5 y +12 bits de fracción implícitos, representaría los valores −11/2 −3 = −88, −11/ 2 5 = −0. 343 75 y −11/2 12 = −0. 002 685 546 875 , respectivamente.

Alternativamente, los valores negativos se pueden representar mediante un número entero en el formato signo-magnitud , en cuyo caso el signo nunca se incluye en el número de bits de fracción implícitos. Esta variante se utiliza más comúnmente en aritmética decimal de punto fijo. Por lo tanto, el entero decimal de 5 dígitos con signo (−00025) 10 , tomado con -3, +5 y +12 dígitos de fracción decimal implícitos, representaría los valores −25/10 −3 = −25000, −25/10 5 = −0,00025 y −25/10 12 = −0. 000 000 000 025 , respectivamente.

Un programa generalmente asumirá que todos los valores de punto fijo que se almacenarán en una variable determinada o que serán producidos por una instrucción determinada tendrán el mismo factor de escala. Generalmente, el programador puede elegir este parámetro dependiendo de la precisión necesaria y del rango de valores que se almacenarán.

Es posible que el factor de escala de una variable o fórmula no aparezca explícitamente en el programa. Las buenas prácticas de programación requieren entonces que se proporcionen en la documentación , al menos como un comentario en el código fuente .

Elección de factores de escala

Para una mayor eficiencia, los factores de escala a menudo se eligen como potencias (positivas o negativas) de la base b utilizada para representar los números enteros internamente. Sin embargo, a menudo el mejor factor de escala lo dicta la aplicación. Por lo tanto, a menudo se utilizan factores de escala que son potencias de 10 (por ejemplo, 1/100 para valores en dólares), por conveniencia humana, incluso cuando los números enteros se representan internamente en binario. Los factores de escala decimal también encajan bien con el sistema métrico (SI) , ya que la elección del factor de escala de punto fijo suele equivaler a la elección de una unidad de medida (como centímetros o micras en lugar de metros ).

Sin embargo, ocasionalmente pueden usarse otros factores de escala, por ejemplo, una cantidad fraccionaria de horas puede representarse como un número entero de segundos; es decir, como un número de punto fijo con factor de escala de 1/3600.

Incluso con el redondeo más cuidadoso, los valores de punto fijo representados con un factor de escala S pueden tener un error de hasta ±0,5 en el número entero almacenado, es decir, ±0,5 S en el valor. Por lo tanto, los factores de escala más pequeños generalmente producen resultados más precisos.

Por otro lado, un factor de escala más pequeño significa un rango más pequeño de valores que se pueden almacenar en una variable de programa determinada. El valor máximo de punto fijo que se puede almacenar en una variable es el valor entero más grande que se puede almacenar en ella, multiplicado por el factor de escala; y lo mismo para el valor mínimo. Por ejemplo, la siguiente tabla proporciona el factor de escala implícito S , los valores mínimo y máximo representables V min y V max , y la precisión δ = S /2 de los valores que podrían representarse en formato de punto fijo binario con signo de 16 bits, dependiendo sobre el número f de bits de fracción implícitos.

Se ha dicho que los formatos de punto fijo con factores de escala de la forma 2 n -1 (es decir, 1, 3, 7, 15, 31, etc.) son apropiados para el procesamiento de imágenes y otras tareas de procesamiento de señales digitales. Se supone que proporcionan conversiones más consistentes entre valores de coma fija y flotante que la escala habitual de 2 n . El lenguaje de programación Julia implementa ambas versiones. [1]

Valores exactos

Cualquier fracción binaria a /2 m , como 1/16 o 17/32, se puede representar exactamente en punto fijo, con un factor de escala de potencia de dos 1/2 n con cualquier nm . Sin embargo, la mayoría de las fracciones decimales como 0,1 o 0,123 son fracciones infinitas que se repiten en base 2 y, por lo tanto, no se pueden representar de esa manera.

De manera similar, cualquier fracción decimal a /10 m , como 1/100 o 37/1000, se puede representar exactamente en punto fijo con un factor de escala de potencia de diez 1/10 n con cualquier nm . Este formato decimal también puede representar cualquier fracción binaria a /2 m , como 1/8 (0,125) o 17/32 (0,53125).

De manera más general, un número racional a / b , con a y b relativamente primos y b positivos, puede representarse exactamente en punto fijo binario sólo si b es una potencia de 2; y en punto fijo decimal sólo si b no tiene factores primos distintos de 2 y/o 5.

Comparación con punto flotante

Los cálculos de punto fijo pueden ser más rápidos y/o utilizar menos hardware que los de punto flotante. Si el rango de los valores a representar se conoce de antemano y es suficientemente limitado, el punto fijo puede aprovechar mejor los bits disponibles. Por ejemplo, si hay 32 bits disponibles para representar un número entre 0 y 1, una representación de punto fijo puede tener un error menor que 1,2 × 10 −10 , mientras que la representación de punto flotante estándar puede tener un error de hasta 596 × 10 −10. - porque 9 de los bits se desperdician con el signo y exponente del factor de escala dinámico. Específicamente, al comparar el audio de punto fijo de 32 bits con el de punto flotante , una grabación que requiere menos de 40 dB de espacio libre tiene una relación señal-ruido más alta usando un audio fijo de 32 bits.

Los programas que utilizan cálculos de punto fijo suelen ser más portátiles que los que utilizan cálculos de punto flotante, ya que no dependen de la disponibilidad de una FPU. Esta ventaja era particularmente fuerte antes de que se adoptara ampliamente el estándar de punto flotante IEEE , cuando los cálculos en punto flotante con los mismos datos arrojaban resultados diferentes según el fabricante y, a menudo, según el modelo de computadora.

Muchos procesadores integrados carecen de una FPU, porque las unidades aritméticas de números enteros requieren sustancialmente menos puertas lógicas y consumen un área de chip mucho menor que una FPU; y la emulación de software de punto flotante en dispositivos de baja velocidad sería demasiado lenta para la mayoría de las aplicaciones. Los chips de CPU para las computadoras personales y consolas de juegos anteriores , como Intel 386 y 486SX , también carecían de FPU.

La resolución absoluta (diferencia entre valores sucesivos) de cualquier formato de punto fijo es constante en todo el rango, es decir, el factor de escala S. Por el contrario, la resolución relativa de un formato de punto flotante es aproximadamente constante en todo su rango, variando dentro de un factor de la base b ; mientras que su resolución absoluta varía en muchos órdenes de magnitud, como los valores mismos.

En muchos casos, los errores de redondeo y truncamiento de los cálculos de punto fijo son más fáciles de analizar que los de los cálculos equivalentes de punto flotante. Aplicar técnicas de linealización al truncamiento, como el tramado y/o la configuración de ruido, es más sencillo dentro de la aritmética de punto fijo. Por otro lado, el uso de punto fijo requiere un mayor cuidado por parte del programador. Para evitar el desbordamiento se requieren estimaciones mucho más estrictas para los rangos de variables y todos los valores intermedios en el cálculo y, a menudo, también código adicional para ajustar sus factores de escala. La programación de punto fijo normalmente requiere el uso de tipos de números enteros de diferentes anchos . Las aplicaciones de punto fijo pueden utilizar bloque de punto flotante , que es un entorno de punto fijo en el que cada matriz (bloque) de datos de punto fijo se escala con un exponente común en una sola palabra.

Aplicaciones

Un uso común del punto fijo decimal es para almacenar valores monetarios, para los cuales las complicadas reglas de redondeo de los números de punto flotante suelen ser un inconveniente. Por ejemplo, la aplicación de gestión de dinero de código abierto GnuCash , escrita en C, pasó de punto flotante a punto fijo a partir de la versión 1.6, por este motivo.

El punto fijo binario (escalado binario) se utilizó ampliamente desde finales de los años 1960 hasta los años 1980 para la computación en tiempo real que era matemáticamente intensiva, como la simulación de vuelo y los algoritmos de control de plantas de energía nuclear . Todavía se utiliza en muchas aplicaciones DSP y microprocesadores personalizados. Los cálculos que involucran ángulos usarían medición angular binaria (BAM).

El punto fijo binario se utiliza en los coprocesadores CORDIC de la serie STM32G4 y en los algoritmos de transformación de coseno discreto (DCT) utilizados para comprimir imágenes JPEG .

Los instrumentos electrónicos como los contadores de electricidad y los relojes digitales suelen utilizar polinomios para compensar los errores introducidos, por ejemplo, por la temperatura o la tensión de alimentación. Los coeficientes se obtienen mediante regresión polinómica . Los polinomios binarios de punto fijo pueden utilizar más bits de precisión que los de punto flotante, y lo hacen en código rápido utilizando CPU económicas. La precisión, crucial para los instrumentos, se compara bien con los cálculos de punto flotante de bits equivalentes, si se factorizan los polinomios de punto fijo (por ejemplo, y = d + x(c + x(b + xa))) para reducir el número de veces que se produce el redondeo y las multiplicaciones de punto fijo utilizan sumandos redondeados.

Operaciones

Adición y sustracción

Para sumar o restar dos valores con el mismo factor de escala implícito, es suficiente sumar o restar los números enteros subyacentes; el resultado tendrá su factor de escala implícito común, por lo que se puede almacenar en las mismas variables del programa que los operandos. Estas operaciones producen el resultado matemático exacto, siempre que no se produzca un desbordamiento , es decir, siempre que el número entero resultante pueda almacenarse en la variable del programa receptor . Si los operandos tienen diferentes factores de escala, deben convertirse a un factor de escala común antes de la operación.

Multiplicación

Para multiplicar dos números de coma fija, basta con multiplicar los dos números enteros subyacentes y suponer que el factor de escala del resultado es el producto de sus factores de escala. El resultado será exacto, sin redondeo, siempre que no desborde la variable receptora.

Por ejemplo, multiplicar los números 123 escalado por 1/1000 (0,123) y 25 escalado por 1/10 (2,5) produce el número entero 123×25 = 3075 escalado por (1/1000)×(1/10) = 1/10000 , es decir 3075/10000 = 0,3075. Como otro ejemplo, multiplicar el primer número por 155 implícitamente escalado por 1/32 (155/32 = 4,84375) produce el número entero 123×155 = 19065 con factor de escala implícito (1/1000)×(1/32) = 1/32000 , es decir 19065/32000 = 0,59578125.

En binario, es común utilizar un factor de escala que es una potencia de dos. Después de la multiplicación, el factor de escala se puede dividir desplazándose hacia la derecha. El cambio es simple y rápido en la mayoría de las computadoras. El redondeo es posible añadiendo un 'suma de redondeo' de la mitad del factor de escala antes del cambio; La prueba: round(x/y) = piso(x/y + 0.5) = piso((x + y/2)/y) = desplazamiento de n(x + 2^(n-1)) Una similar El método es utilizable en cualquier escala.

División

Para dividir dos números de punto fijo, se toma el cociente entero de sus enteros subyacentes y se supone que el factor de escala es el cociente de sus factores de escala. En general, la primera división requiere redondeo y por tanto el resultado no es exacto.

Por ejemplo, la división de 3456 escalado por 1/100 (34,56) y 1234 escalado por 1/1000 (1,234) produce el número entero 3456÷1234 = 3 (redondeado) con factor de escala (1/100)/(1/1000) = 10, es decir, 30. Como otro ejemplo, la división del primer número por 155 implícitamente escalada por 1/32 (155/32 = 4,84375) produce el número entero 3456÷155 = 22 (redondeado) con factor de escala implícito (1/ 100)/(1/32) = 32/100 = 8/25, es decir 22×32/100 = 7,04.

Si el resultado no es exacto, el error introducido por el redondeo se puede reducir o incluso eliminar convirtiendo el dividendo a un factor de escala menor. Por ejemplo, si r = 1,23 se representa como 123 con una escala de 1/100, y s = 6,25 se representa como 6250 con una escala de 1/1000, entonces la división simple de los números enteros produce 123÷6250 = 0 (redondeado) con factor de escala ( 1/100)/(1/1000) = 10. Si r se convierte primero a 1.230.000 con un factor de escala 1/1000000, el resultado será 1.230.000÷6250 = 197 (redondeado) con un factor de escala 1/1000 (0,197). El valor exacto 1,23/6,25 es 0,1968.

Conversión de escala

En la computación de punto fijo a menudo es necesario convertir un valor a un factor de escala diferente. Esta operación es necesaria, por ejemplo:

Para convertir un número de un tipo de punto fijo con factor de escala R a otro tipo con factor de escala S , el entero subyacente debe multiplicarse por la relación R / S . Así, por ejemplo, para convertir el valor 1,23 = 123/100 del factor de escala R = 1/100 a uno con factor de escala S = 1/1000, se debe multiplicar el número entero 123 por (1/100)/(1/1000 ) = 10, lo que da la representación 1230/1000.

Si el factor de escala es una potencia de la base utilizada internamente para representar el número entero, cambiar el factor de escala requiere solo eliminar los dígitos de orden inferior del número entero o agregar cero dígitos. Sin embargo, esta operación debe preservar el signo del número. En la representación en complemento a dos, eso significa extender el bit de signo como en las operaciones de desplazamiento aritmético .

Si S no divide a R (en particular, si el nuevo factor de escala S es mayor que el R original ), es posible que sea necesario redondear el nuevo número entero .

En particular, si r y s son variables de punto fijo con factores de escala implícitos R y S , la operación rr × s requiere multiplicar los números enteros respectivos y dividir explícitamente el resultado por S. Es posible que sea necesario redondear el resultado y que se produzca un desbordamiento.

Por ejemplo, si el factor de escala común es 1/100, multiplicar 1,23 por 0,25 implica multiplicar 123 por 25 para obtener 3075 con un factor de escala intermedio de 1/10000. Para volver al factor de escala original 1/100, el número entero 3075 debe multiplicarse por 1/100, es decir, dividirse por 100, para obtener 31 (0,31) o 30 (0,30), según la política de redondeo . usado.

De manera similar, la operación rr / s requerirá dividir los números enteros y multiplicar explícitamente el cociente por S. Aquí también puede producirse redondeo y/o desbordamiento.

Conversión hacia y desde punto flotante

Para convertir un número de punto flotante a punto fijo, se puede multiplicar por el factor de escala S y luego redondear el resultado al entero más cercano. Se debe tener cuidado para garantizar que el resultado encaje en la variable o registro de destino. Dependiendo del factor de escala y del tamaño de almacenamiento, y de los números de entrada del rango, es posible que la conversión no implique ningún redondeo.

Para convertir un número de punto fijo a punto flotante, se puede convertir el número entero a punto flotante y luego dividirlo por el factor de escala S. Esta conversión puede implicar redondeo si el valor absoluto del número entero es mayor que 2 · 24 (para coma flotante IEEE binaria de precisión simple) o de 2 · 53 (para precisión doble). Puede producirse un desbordamiento o un desbordamiento insuficiente si | S | es muy grande o muy pequeño, respectivamente.

Soporte de hardware

Escalado y renormalización

Los procesadores típicos no tienen soporte específico para la aritmética de punto fijo. Sin embargo, la mayoría de las computadoras con aritmética binaria tienen instrucciones rápidas de desplazamiento de bits que pueden multiplicar o dividir un número entero por cualquier potencia de 2; en particular, una instrucción de desplazamiento aritmético . Estas instrucciones se pueden utilizar para cambiar rápidamente factores de escala que son potencias de 2, conservando al mismo tiempo el signo del número.

Las primeras computadoras como la IBM 1620 y la Burroughs B3500 usaban una representación decimal codificada en binario (BCD) para números enteros, es decir, base 10, donde cada dígito decimal se codificaba de forma independiente con 4 bits. Es posible que algunos procesadores, como los microcontroladores, aún lo utilicen. En tales máquinas, la conversión de factores de escala decimales se puede realizar mediante desplazamientos de bits y/o manipulación de direcciones de memoria.

Algunas arquitecturas DSP ofrecen soporte nativo para formatos de punto fijo específicos, por ejemplo, números de n bits con signo con n −1 bits de fracción (cuyos valores pueden oscilar entre −1 y casi +1). El soporte puede incluir una instrucción de multiplicación que incluye renormalización: la conversión de escala del producto de 2 n −2 a n −1 bits de fracción. [ cita necesaria ] Si la CPU no proporciona esa característica, el programador debe guardar el producto en un registro o variable temporal lo suficientemente grande y codificar la renormalización explícitamente.

Desbordamiento

El desbordamiento ocurre cuando el resultado de una operación aritmética es demasiado grande para almacenarse en el área de destino designada. En sumas y restas, el resultado puede requerir un bit más que los operandos. En la multiplicación de dos enteros sin signo con myn bits , el resultado puede tener m + n bits .

En caso de desbordamiento, los bits de orden superior generalmente se pierden, ya que el entero sin escalar se reduce en módulo 2 n , donde n es el tamaño del área de almacenamiento. En particular, se pierde el bit de signo, lo que puede cambiar radicalmente el signo y la magnitud del valor.

Algunos procesadores pueden establecer un indicador de desbordamiento de hardware y/o generar una excepción en caso de que se produzca un desbordamiento. En cambio, algunos procesadores pueden proporcionar aritmética de saturación : si el resultado de una suma o resta se desborda, almacenan en su lugar el valor de mayor magnitud que cabe en el área receptora y que tiene el signo correcto. [ cita necesaria ]

Sin embargo, estas características no son muy útiles en la práctica; generalmente es más fácil y seguro seleccionar factores de escala y tamaños de palabras para excluir la posibilidad de desbordamiento, o verificar los operandos en busca de valores excesivos antes de ejecutar la operación.

Soporte de lenguaje informático

Algunos lenguajes informáticos, en particular PL/I , COBOL , Ada , JOVIAL y Coral 66 , proporcionan soporte explícito para números de punto fijo . Proporcionan tipos de datos de punto fijo , con un factor de escala binario o decimal. El compilador genera automáticamente código para realizar las conversiones de escala adecuadas al realizar operaciones en estos tipos de datos, al leer o escribir variables o al convertir los valores a otros tipos de datos, como los de punto flotante.

La mayoría de esos lenguajes se diseñaron entre 1940 y 1990. Los lenguajes más modernos generalmente no ofrecen ningún tipo de datos de punto fijo ni soporte para la conversión de factores de escala. Este es también el caso de varios lenguajes antiguos que todavía son muy populares, como FORTRAN , C y C++ . La amplia disponibilidad de procesadores rápidos de punto flotante, con un comportamiento estrictamente estandarizado, ha reducido en gran medida la demanda de soporte binario de punto fijo. [ cita necesaria ] De manera similar, el soporte para punto flotante decimal en algunos lenguajes de programación, como C# y Python , ha eliminado la mayor parte de la necesidad de soporte para punto fijo decimal. En las pocas situaciones que requieren operaciones de punto fijo, el programador puede implementarlas, con conversión de escala explícita, en cualquier lenguaje de programación.

Por otro lado, todas las bases de datos relacionales y la notación SQL admiten la aritmética decimal de punto fijo y el almacenamiento de números. PostgreSQL tiene una especialnuméricotipo para el almacenamiento exacto de números de hasta 1000 dígitos. [2]

Además, en 2008 la Organización Internacional de Normalización (ISO) emitió una propuesta para ampliar el lenguaje de programación C con tipos de datos de punto fijo, en beneficio de los programas que se ejecutan en procesadores integrados. [3] Además, GNU Compiler Collection (GCC) tiene soporte de back-end para punto fijo. [4] [5]

Ejemplos detallados

Multiplicación de coma fija decimal

Supongamos que existe la siguiente multiplicación con 2 números de coma fija y 3 decimales.

Tenga en cuenta que, dado que hay 3 decimales, mostramos los ceros finales. Para volver a caracterizar esto como una multiplicación de números enteros, primero debemos multiplicar moviendo todos los lugares decimales a lugares enteros, luego multiplicaremos por para volver a colocarlos, la ecuación ahora se ve así

Esto funciona de manera equivalente si elegimos una base diferente, en particular la base 2 para calcular, ya que un desplazamiento de bits es lo mismo que una multiplicación o división por un orden de 2. Tres dígitos decimales equivalen a unos 10 dígitos binarios, por lo que debemos redondear 0,05 a 10 bits después del punto binario. La aproximación más cercana es entonces 0,0000110011.

Así nuestra multiplicación se convierte en

Esto se redondea a 11,023 con tres dígitos después del punto decimal.

Multiplicación binaria de punto fijo

Considere la tarea de calcular el producto de 1,2 y 5,6 con punto fijo binario utilizando 16 bits de fracción. Para representar los dos números, se los multiplica por 2 16 , obteniendo 78 643,2 y 367 001,6 ; y redondea estos valores a los números enteros más cercanos, obteniendo 78 643 y 367 002 . Estos números encajarán cómodamente en una palabra de 32 bits con formato con signo en complemento a dos.

Al multiplicar estos números enteros se obtiene el entero de 35 bits 28 862 138 286 con 32 bits de fracción, sin ningún redondeo. Tenga en cuenta que almacenar este valor directamente en una variable entera de 32 bits provocaría un desbordamiento y la pérdida de los bits más significativos. En la práctica, probablemente se almacenaría en una variable o registro entero de 64 bits con signo .

Si el resultado se va a almacenar en el mismo formato que los datos, con 16 bits de fracción, ese número entero debe dividirse por 2 16 , lo que da aproximadamente 440 401 , 28, y luego redondearse al número entero más cercano. Este efecto se puede lograr sumando 2 15 y luego desplazando el resultado en 16 bits. El resultado es 440 401 , que representa el valor 6. 719 985 961 914 062 5 . Teniendo en cuenta la precisión del formato, ese valor se expresa mejor como 6. 719 986 ± 0. 000 008 (sin contar el error que proviene de las aproximaciones de operandos). El resultado correcto sería 1,2 × 5,6 = 6,72.

Para un ejemplo más complicado, supongamos que los dos números 1,2 y 5,6 están representados en formato de punto fijo de 32 bits con 30 y 20 bits fraccionarios, respectivamente. Al escalar por 2 30 y 2 20 se obtienen 1 288 490 188,8 y 5 872 025 , 6, que se redondean a 1 288 490 189 y 5 872 026 , respectivamente. Ambos números todavía caben en una variable entera con signo de 32 bits y representan las fracciones

1. 200 000 000 186 264 514 923 095 703 125 y
5. 600 000 381 469 726 562 50

Su producto es (exactamente) el entero de 53 bits 7 566 047 890 552 914 , que tiene 30+20 = 50 bits de fracción implícitos y por lo tanto representa la fracción

6. 720 000 458 806 753 229 623 609 513 510

Si optamos por representar este valor en formato fijo de 16 bits con signo con 8 bits de fracción, debemos dividir el producto entero entre 2 50-8 = 2 42 y redondear el resultado; lo cual se puede lograr sumando 2 41 y desplazando 42 bits. El resultado es 1720, que representa el valor 1720/2 8 = 6,718 75 , o aproximadamente 6,719 ± 0,002.

Notaciones

Se han utilizado varias notaciones para especificar de forma concisa los parámetros de un formato de punto fijo. En la siguiente lista, f representa el número de bits fraccionarios, m el número de bits de magnitud o enteros, s el número de bits de signo y b el número total de bits.

Ejemplos de aplicaciones de software

Ver también

Referencias

  1. ^ Paquete de documentación del lenguaje de programación Julia FixedPointNumbers.
  2. ^ Manual de PostgreSQL, sección 8.1.2. Números de precisión arbitraria
  3. ^ JTC1/SC22/WG14 (2008), estado de TR 18037: C integrado
  4. ^ Wiki de GCC, soporte aritmético de punto fijo
  5. ^ Usando GCC, sección 5.13 Tipos de punto fijo
  6. ^ IBM Corporation, "Elementos numéricos". Sitio de documentación en línea, consultado el 5 de julio de 2021.
  7. ^ Documentación de Ada 83: "Justificación, 5.3.2: Tipos de punto fijo". Consultado el 5 de julio de 2021.
  8. ^ ab "Apéndice A.2". Referencia del programador de la biblioteca DSP TMS320C64x (PDF) . Dallas, Texas, Estados Unidos: Texas Instruments Incorporated . Octubre de 2003. SPRU565. Archivado (PDF) desde el original el 22 de diciembre de 2022 . Consultado el 22 de diciembre de 2022 .
  9. ^ "Glosario de documentación de MathWorks Fix-Point Toolbox". mathworks.com .
  10. ^ "Guía de depuradores ARM Developer Suite AXD yarmsd". 1.2. BRAZO limitado . 2001 [1999]. Capítulo 4.7.9. AXD > Instalaciones AXD > Formato de datos > Formato Q. BRAZO DUI 0066D. Archivado desde el original el 4 de noviembre de 2017.
  11. ^ "Capítulo 4.7.9. AXD > Instalaciones AXD > Formato de datos > Formato Q". Guía de depuradores de RealView Development Suite AXD yarmsd (PDF) . 3.0. BRAZO limitado . 2006 [1999]. págs. 4–24. BRAZO DUI 0066G. Archivado (PDF) desde el original el 4 de noviembre de 2017.
  12. ^ "VisSim ahora es solidThinking Embed". www.vissim.com . pensamiento sólido inc.
  13. ^ Guía del usuario de PS2 GS, Capítulo 7.1 "Notas explicativas"
  14. ^ "El conjunto de instrucciones TrueType: tipos de datos".
  15. ^ "[Freetype] ¿Por qué 26,6?".
  16. ^ "Emulador de delfines". Emulador de delfines . 2014-03-15.
  17. ^ "Descripción técnica de WavPack". www.wavpack.com . Consultado el 13 de julio de 2015 .
  18. ^ Biblioteca de utilidades de Nest Labs
  19. ^ "Fractint, un pequeño código". Archivado desde el original el 27 de octubre de 2010 . Consultado el 24 de octubre de 2005 .
  20. ^ "Introducción a la biblioteca de numérica cuántica" . Consultado el 13 de noviembre de 2019 .

Otras lecturas

enlaces externos