En informática , una representación numérica de coma fija es un tipo de datos real para un número que tiene un número fijo de dígitos después (y a veces también antes) del punto de base (después del punto decimal '.' En notación decimal inglesa). La representación de números de punto fijo se puede comparar con la representación de números de punto flotante más complicada (y más exigente desde el punto de vista computacional) .
Los números de punto fijo son útiles para representar valores fraccionarios , generalmente en base 2 o base 10, cuando el procesador en ejecución no tiene una unidad de punto flotante (FPU) como es el caso de los microprocesadores y microcontroladores integrados más antiguos o de bajo costo , si son de punto fijo proporciona un mejor rendimiento o precisión para la aplicación en cuestión, o si su uso es más natural para el problema (como para la representación de ángulos ).
Representación
Valor mostrado | Entero manejado internamente |
---|---|
0,00 | 0 |
0,01 | 1 |
0,02 | 2 |
... | |
0,99 | 99 |
1,00 | 100 |
Un valor de un tipo de datos de punto fijo es esencialmente un número entero que se escala mediante un factor específico implícito determinado por el tipo. Por ejemplo, el valor 1,23 se puede representar como 1230 en un tipo de datos de punto fijo con un factor de escala de 1/1000, y el valor 1,230,000 se puede representar como 1230 con un factor de escala de 1000. A diferencia de los tipos de datos de punto flotante, el El factor de escala es el mismo para todos los valores del mismo tipo y no cambia durante todo el cálculo.
El factor de escala suele ser una potencia de 10 (para conveniencia humana) o una potencia de 2 (para eficiencia computacional). Sin embargo, pueden usarse ocasionalmente otros factores de escala, por ejemplo, un valor de tiempo en horas puede representarse como un tipo de punto fijo con un factor de escala de 1/3600 para obtener valores con una precisión de un segundo.
El valor máximo de un tipo de punto fijo es simplemente el valor más grande que se puede representar en el tipo entero subyacente multiplicado por el factor de escala; y lo mismo para el valor mínimo.
Operaciones
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 R y dividirse por S ; es decir, multiplicada por la relación R / S . Así, por ejemplo, para convertir el valor 1.23 = 123/100 de un tipo con factor de escala R = 1/100 a uno con factor de escala S = 1/1000 , el entero subyacente 123 debe multiplicarse por (1/100) / (1/1000) = 10, dando la representación 1230/1000. Si S no divide R (en particular, si el nuevo factor de escala S es mayor que el R original ), el nuevo entero tendrá que redondearse . Las reglas y métodos de redondeo suelen ser parte de la especificación del lenguaje.
Para sumar o restar dos valores del mismo tipo de punto fijo, es suficiente sumar o restar los enteros subyacentes y mantener su factor de escala común. El resultado se puede representar exactamente en el mismo tipo, siempre que no se produzca un desbordamiento (es decir, siempre que la suma de los dos enteros encaje en el tipo entero subyacente). Si los números tienen diferentes tipos de punto fijo, con diferentes factores de escala, entonces uno de ellos debe convertirse al otro antes de la suma.
Para multiplicar dos números de coma fija, basta con multiplicar los dos enteros subyacentes y asumir que el factor de escala del resultado es el producto de sus factores de escala. Esta operación no implica redondeo. Por ejemplo, multiplicar los números 123 escalados por 1/1000 (0,123) y 25 escalados por 1/10 (2,5) da como resultado el entero 123 × 25 = 3075 escalado por (1/1000) × (1/10) = 1/10000 , eso es 3075/10000 = 0,3075. Si los dos operandos pertenecen al mismo tipo de coma fija, y el resultado también se va a representar en ese tipo, entonces el producto de los dos enteros debe multiplicarse explícitamente por el factor de escala común; en este caso, el resultado puede tener que redondearse y puede producirse 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. Esto debe multiplicarse por 1/100 para obtener 31 (0,31) o 30 (0,30), según el método de redondeo utilizado, para obtener un factor de escala final de 1/100.
Para dividir dos números de coma fija, se toma el cociente de sus números enteros subyacentes y se supone que el factor de escala es el cociente de sus factores de escala. La primera división implica redondeo en general. Por ejemplo, la división de 3456 escalada por 1/100 (34,56) y 1234 escalada por 1/1000 (1,234) da como resultado el entero 3456 ÷ 1234 = 3 (redondeado) con factor de escala (1/100) / (1/1000) = 10, es decir, 30. Se puede obtener un resultado más preciso convirtiendo primero el dividendo a un tipo más preciso: en el mismo ejemplo, convirtiendo 3456 escalado por 1/100 (34.56) a 3,456,000 escalado por 1/100000, antes de dividir por 1234 escalado por 1/1000 (1.234), produciría 3456000 ÷ 1234 = 2801 (redondeado) con factor de escala (1/100000) / (1/1000) = 1/100, es decir 28.01 (en lugar de 30). Si ambos operandos y el resultado deseado tienen el mismo factor de escala, entonces el cociente de los dos enteros debe multiplicarse explícitamente por ese factor de escala común.
Binario vs decimal
Las dos clases más comunes de tipos de coma fija son decimal y binario. Los tipos decimales de coma fija tienen un factor de escala que es una potencia de diez; para los tipos binarios de coma fija es una potencia de dos.
Los tipos binarios de punto fijo se utilizan con mayor frecuencia, porque las operaciones de cambio de escala se pueden implementar como cambios rápidos de bits . Los números binarios de coma fija pueden representar potencias fraccionarias de dos exactamente, pero, como los números binarios de coma flotante, no pueden representar exactamente potencias fraccionarias de diez. Si se desean potencias fraccionarias exactas de diez, se debe utilizar un formato decimal. Por ejemplo, un décimo (0.1) y un centésimo (0.01) se pueden representar solo aproximadamente mediante representaciones binarias de coma fija o coma flotante binaria, mientras que pueden representarse exactamente en representaciones decimales de coma fija o decimal de coma flotante. . Estas representaciones se pueden codificar de muchas formas, incluido el decimal codificado en binario (BCD).
Un ejemplo trabajado
Suponga que existe la siguiente multiplicación con 2 números de coma fija y 3 decimales.
(10.500) (1.050) = 1 * 10.500 + 0.050 * 10.500 = 10.500 + 0.525000 = 11.025000
Tenga en cuenta que, dado que hay 3 lugares decimales, mostramos los ceros finales. Para volver a caracterizar esto como una multiplicación de enteros, primero debemos multiplicar por 1000 (10 ^ 3) moviendo todos los lugares decimales a lugares enteros, luego multiplicaremos por (10 ^ -3) para devolverlos, la ecuación ahora se ve así
(10.500) (10 ^ (3)) (10 ^ (- 3)) (1.050) (10 ^ (3)) (10 ^ (- 3)) (10 ^ (- 3)) (10 ^ (- 3) ))= (10500) (1050) (10 ^ -6)= 11025 000= 11,025000
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 aproximadamente 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 0.0000110011.
10 = 8 + 2 = 2 ^ 3 + 2 ^ 11 = 2 ^ 00.5 = 2 ^ -10.05 = 0.0000110011_2
Así nuestra multiplicación se convierte en
(1010.100) (2 ^ 3) (1.0000110011) (2 ^ 10) (2 ^ -13)= (1010100) (10000110011) (2 ^ -13)= (10110000010111100) (2 ^ -13)= 1011,0000010111100
Esto se redondea a 11.023 con tres dígitos después del punto decimal.
Notación
Hay varias notaciones que se utilizan para representar la longitud de la palabra y el punto de base en un número binario de coma fija. 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 yb el número total de bits.
- Q f : El prefijo "Q". Por ejemplo, Q15 representa un número con 15 bits fraccionarios. Esta notación es ambigua ya que no especifica la longitud de la palabra; sin embargo, generalmente se supone que la longitud de la palabra es de 16 o 32 bits, dependiendo del procesador de destino que se utilice. [1]
- Q m . f : La forma inequívoca de la notación "Q". Dado que la palabra completa es un entero en complemento a 2, se implica un bit de signo. Por ejemplo, Q1.30 describe un número con 1 bit entero y 30 bits fraccionarios almacenados como un entero de complemento a 2 de 32 bits. [1] [2]
- fx m . b : El prefijo "fx" es similar al anterior, pero utiliza la longitud de la palabra como segundo elemento del par de puntos. Por ejemplo, fx1.16 describe un número con 1 bit de magnitud y 15 bits fraccionarios en una palabra de 16 bits. [3]
- s : m : f : Sin embargo, otras notaciones incluyen un bit de signo, como este que se usa en la Guía del usuario de PS2 GS. [4] También se diferencia del uso convencional al utilizar dos puntos en lugar de un punto como separador. Por ejemplo, en esta notación, 0: 8: 0 representa un entero de 8 bits sin signo.
- (p, q) Se utiliza en el lenguaje de programación PL / I , para especificar p dígitos totales (sin incluir el signo) con q después del punto de base. q puede ser positivo o negativo, y la base binaria o decimal.
,> Como se usa con el lenguaje de programación LabVIEW, para números de punto fijo 'FXP'. Donde s es + o ±, lo que significa un número sin signo o con signo en complemento a 2, respectivamente. Este formato indica p dígitos totales, siendo i la 'parte entera'. Es notable que este formato permite la ubicación arbitraria del lugar de las 'unidades', que no es necesario que ocurra dentro de los dígitos dados. Es decir; mientras que el total de bits p debe ser un entero natural, i puede ser mayor, cero o incluso negativo; estas situaciones simplemente corresponden a diferentes factores de escala generales para el número.
Pérdida y desbordamiento de precisión
Debido a que las operaciones de punto fijo pueden producir resultados que tienen más dígitos que los operandos , es posible que se pierda información. Por ejemplo, el resultado de la multiplicación de punto fijo podría tener tantos dígitos como la suma de la cantidad de dígitos en los dos operandos. Para ajustar el resultado en el mismo número de dígitos que los operandos, la respuesta debe redondearse o truncarse . Si este es el caso, la elección de qué dígitos conservar es muy importante. Al multiplicar dos números de coma fija con el mismo formato, por ejemplo con dígitos enteros y dígitos fraccionarios, la respuesta podría tener hasta dígitos enteros y dígitos fraccionarios.
Para simplificar, muchos procedimientos de multiplicación de coma fija utilizan el mismo formato de resultado que los operandos. Esto tiene el efecto de mantener los dígitos medios; el número I de los dígitos enteros menos significativos y el número Q de los dígitos fraccionarios más significativos. Los dígitos fraccionarios perdidos por debajo de este valor representan una pérdida de precisión que es común en la multiplicación fraccionaria. Sin embargo, si se pierde algún dígito entero, el valor será radicalmente inexacto. Algunos paquetes de punto fijo basados en modelos [5] permiten especificar un formato de resultado diferente de los formatos de entrada, lo que permite al usuario maximizar la precisión y evitar el desbordamiento.
Algunas operaciones, como dividir, a menudo tienen una limitación de resultados incorporada, de modo que cualquier desbordamiento positivo da como resultado el mayor número posible que se puede representar con el formato actual. Del mismo modo, el desbordamiento negativo da como resultado el mayor número negativo representado por el formato actual. Esta limitación incorporada a menudo se denomina saturación .
Algunos procesadores admiten un indicador de desbordamiento de hardware que puede generar una excepción en caso de desbordamiento, pero generalmente es demasiado tarde para recuperar el resultado adecuado en este punto.
Implementaciones de lenguaje informático
Muy pocos lenguajes de computadora incluyen soporte integrado para valores de punto fijo que no sean con el punto de base inmediatamente a la derecha del dígito menos significativo (es decir, un número entero ), porque para la mayoría de las aplicaciones, las representaciones de punto flotante binario o decimal suelen ser más fáciles de usar. y lo suficientemente precisa. Las representaciones de punto flotante son más fáciles de usar que las representaciones de punto fijo, porque pueden manejar un rango dinámico más amplio y no requieren que los programadores especifiquen el número de dígitos después del punto de base. Sin embargo, si son necesarios, los números de punto fijo se pueden implementar incluso en lenguajes de programación como C y C ++ , que comúnmente no incluyen dicho soporte.
Un uso común de los números BCD de coma fija es para almacenar valores monetarios, donde los valores inexactos de los números binarios de coma flotante son a menudo un riesgo. Históricamente, las representaciones de punto fijo eran la norma para los tipos de datos decimales; por ejemplo, en PL / I o COBOL . El lenguaje de programación Ada incluye soporte integrado para coma fija (binaria y decimal) y coma flotante. JOVIAL y Coral 66 también proporcionan tipos de punto fijo y flotante.
ISO / IEC TR 18037 [6] especifica tipos de datos de punto fijo para el lenguaje de programación C; Se espera que los proveedores implementen las extensiones de lenguaje para aritmética de punto fijo en los próximos años. El soporte de punto fijo se implementa en GCC . [7] [8]
El punto fijo no debe confundirse con el punto flotante decimal en lenguajes de programación como C # y Python .
Casi todas las bases de datos relacionales y SQL admiten aritmética decimal de coma fija y almacenamiento de números. PostgreSQL tiene un especialnuméricoescriba para el almacenamiento exacto de números de hasta 1000 dígitos. [9]
Ejemplos de aplicaciones de software
- La biblioteca de utilidades de Nest Labs proporciona un conjunto limitado de macros y funciones para números de punto fijo, particularmente cuando se trata de esos números en el contexto del muestreo del sensor y las salidas del sensor.
- GnuCash es una aplicación para rastrear dinero que está escrita en C. Pasó de una representación de dinero de punto flotante a una implementación de punto fijo a partir de la versión 1.6. Este cambio se realizó para intercambiar los errores de redondeo menos predecibles de las representaciones de punto flotante por un mayor control sobre el redondeo (por ejemplo, al centavo más cercano ).
- Tremor , Toast y MAD son bibliotecas de software que decodifican los formatos de audio Ogg Vorbis , GSM Full Rate y MP3 , respectivamente. Estos códecs usan aritmética de punto fijo porque muchos dispositivos de hardware de decodificación de audio no tienen una FPU (en parte para ahorrar dinero, pero principalmente para ahorrar energía; las unidades enteras son mucho más pequeñas en el área de silicio que una FPU) y la decodificación de audio requiere rendimiento en la medida en que una implementación de software de punto flotante en dispositivos de baja velocidad no produciría salida en tiempo real.
- Todos los motores de gráficos 3D de los sistemas de videojuegos PlayStation original de Sony , Saturn de Sega , Game Boy Advance de Nintendo (solo 2D ), Nintendo DS (2D y 3D), Nintendo Gamecube [10] y GP2X Wiz utilizan aritmética de punto fijo por la misma razón que Tremor y Toast: para ganar rendimiento en una arquitectura sin FPU (por ejemplo, la PlayStation incluyó soporte de hardware para valores de 4.12bit en su coprocesador de transformación).
- La especificación OpenGL ES 1.x incluye un perfil de punto fijo, ya que es una API destinada a sistemas embebidos, que no siempre tienen una FPU.
- TeX utiliza un punto fijo con 16 bits después del punto binario, en unidades de puntos , para todos los cálculos de posición. Los archivos de métricas de fuentes TeX utilizan números de coma fija con signo de 32 bits, con 12 bits a la izquierda del decimal.
- Los programas dc y bc son calculadoras de precisión arbitrarias , pero solo mantienen un registro de un número fijo (especificado por el usuario) de dígitos fraccionarios.
- VisSim Un lenguaje de diagrama de bloques programado visualmente que admite un conjunto de bloques de punto fijo para permitir la simulación y la generación automática de códigos de operaciones de punto fijo. Tanto el tamaño de la palabra como el punto de base se pueden especificar según el operador.
- Fractint representa los números como números de punto fijo Q2.29 , [11] para acelerar el dibujo en PC antiguas con procesadores 386 o 486SX , que carecían de FPU.
- Doom fue el últimotítulo de disparos en primera persona de id Software en usar una representación de punto fijo de 16.16 para todos sus cálculos no enteros, incluido el sistema de mapas, la geometría, la representación, el movimiento del jugador, etc. reproducible en CPU 386 y 486SX sin una FPU. Por razones de compatibilidad, esta representación todavía se usa en los puertos de origen modernos de Doom .
- Wavpack es un compresor de audio de punto fijo y sin pérdidas. Su creador, David Bryant, justifica la decisión de implementar un punto fijo en lugar de un punto flotante: "Creo que las operaciones con enteros son menos susceptibles a variaciones sutiles de chip a chip que podrían corromper la naturaleza sin pérdidas de la compresión". [12]
- Los números de punto fijo se utilizan a veces para almacenar y manipular imágenes y fotogramas de vídeo. Los procesadores con unidades SIMD destinadas al procesamiento de imágenes pueden incluir instrucciones adecuadas para manejar datos empaquetados de punto fijo.
- El lenguaje de programación Q # para las computadoras cuánticas de Azure , que implementan puertas lógicas cuánticas , contiene una biblioteca numérica estándar para realizar aritmética de punto fijo en registros de qubits . [13]
- El formato de fuente TrueType usa el formato F26Dot6 ( coma fija con signo de 32 bits con 26 bits a la izquierda del decimal) para algunos valores numéricos en sus instrucciones. [14] Este formato se eligió para proporcionar la cantidad mínima de precisión requerida para insinuar y por razones de rendimiento. [15]
- El paquete FixedPointNumbers para Julia implementos tanto 2 n y 2 n -1 escalado fija números de punto. Estos últimos se utilizan como base para el procesamiento de imágenes para proporcionar una escala consistente tanto para valores de intensidad "enteros" como de coma flotante, evitando así el implícito "255 == 1.0" (no ecuación) presente en muchos otros marcos de procesamiento de imágenes.
Ver también
- Escala binaria
- Q (formato de número)
- Libfixmath : una biblioteca escrita en C para matemáticas de punto fijo
- Aritmética de coma flotante
- Sistema de números logarítmicos
Referencias
- ^ a b Texas Instruments, TMS320C64x DSP Library Programmer's Reference , Apéndice A.2
- ^ "Glosario de documentación de la caja de herramientas de punto fijo de MathWorks" . mathworks.com .
- ^ Inc., pensamiento sólido. "VisSim ahora es solidThinking Embed" . www.vissim.com .
- ^ Guía del usuario de PS2 GS, capítulo 7.1 "Notas explicativas"
- ^ Guía del usuario de VisSim de punto fijo | http://www.vissim.com/downloads/doc/EmbeddedControlsDeveloper_UGv80.pdf
- ^ JTC1 / SC22 / WG14, estado de TR 18037: C integrado
- ^ Wiki de GCC, Soporte aritmético de punto fijo
- ^ Usando GCC, sección 5.13 Tipos de punto fijo
- ^ Manual de PostgreSQL, sección 8.1.2. Números de precisión arbitrarios
- ^ "Emulador de delfines" . Emulador de delfines .
- ^ Fractint, Un pequeño código
- ^ "Descripción técnica de WavPack" . www.wavpack.com . Consultado el 13 de julio de 2015 .
- ^ "Introducción a la Biblioteca de Numéricos Cuánticos" . Consultado el 13 de noviembre de 2019 .
- ^ "El conjunto de instrucciones TrueType: tipos de datos" .
- ^ "[Freetype] ¿Por qué 26,6?" .
Otras lecturas
- Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.
enlaces externos
- Matemáticas simples de punto fijo
- Aritmética de punto fijo: una introducción
- Representación de punto fijo y matemática fraccionada
- Una mirada calculada a la aritmética de punto fijo , (PDF)
- Fundamento de Ada '83, 5.3.2: Tipos de punto fijo
- Números de coma fija para Julia