En informática , un factor de escala es un número que se utiliza como multiplicador para representar un número en una escala diferente , funcionando de forma similar a un exponente en matemáticas . Se utiliza un factor de escala cuando un conjunto de números del mundo real necesita representarse en una escala diferente para ajustarse a un formato numérico específico . Si bien el uso de un factor de escala amplía el rango de valores representables, también disminuye la precisión , lo que puede provocar errores de redondeo en ciertos cálculos.
Usos
Ciertos formatos numéricos pueden elegirse para una aplicación por conveniencia en la programación, o debido a ciertas ventajas que ofrece el hardware para ese formato numérico. Por ejemplo, los primeros procesadores no admitían de forma nativa la aritmética de punto flotante para representar valores fraccionarios, por lo que se usaban enteros para almacenar representaciones de los valores del mundo real aplicando un factor de escala al valor real. De manera similar, debido a que la aritmética de hardware tiene un ancho fijo (comúnmente 16, 32 o 64 bits , dependiendo del tipo de datos ), los factores de escala permiten la representación de números más grandes (multiplicando o dividiendo manualmente por el factor de escala especificado), aunque a expensas de la precisión. [ 1 ] Por necesidad, esto se hacía en software , ya que el hardware no admitía valores fraccionarios. Los factores de escala también se usan en números de punto flotante, y más comúnmente son potencias de dos . Por ejemplo, el formato de doble precisión reserva 11 bits para el factor de escala (un exponente binario ) y 53 bits para la mantisa , lo que permite diversos grados de precisión para representar diferentes rangos de números y amplía el rango de números representables más allá de lo que podría representarse utilizando 64 bits explícitos (aunque a costa de la precisión). [ 2 ]
Como ejemplo de dónde se pierde precisión, un entero sin signo de 16 bits ( uint16 ) solo puede almacenar un valor de hasta 65 535 × 10⁶ . Si se utilizan enteros sin signo de 16 bits para representar valores de 0 a 131 070 × 10⁶ , se introduciría un factor de escala de 1/2 , de modo que los valores escalados se correspondan exactamente con los enteros pares del mundo real . En consecuencia, por ejemplo, el número 3 no se puede representar, porque un 1 almacenado representa un 2 del mundo real, y un 2 almacenado representa un 4 del mundo real; no hay suficientes bits disponibles para evitar este error en esta representación.
Operaciones con valores escalados
Una vez almacenada la representación escalada de un valor real, a menudo se puede ignorar la escala hasta que el valor necesite volver al "mundo real". Por ejemplo, sumar dos valores escalados es tan válido como desescalar los valores, sumar los valores reales y luego escalar el resultado, y el primero es mucho más fácil y rápido. Sin embargo, en ambos casos, los dos números sumados deben escalarse de la misma manera. [ 3 ] Para otras operaciones, la escala es muy importante.
La multiplicación, por ejemplo, debe tener en cuenta que ambos números están escalados. Como ejemplo, consideremos dos valores del mundo real A y B. La multiplicación de estos valores del mundo real es:
A * B = P
Si en cambio se representan con un factor de escala Z , y estas representaciones escaladas se multiplican posteriormente, el resultado es el siguiente:
AZ * BZ = Q
AZ es el valor escalado del mundo real de A , o simplemente el producto de A * Z , y de igual manera, BZ es la representación escalada de B. Después de la multiplicación escalada, la respuesta no se escribe PZ , porque el valor almacenado en PZ no es la respuesta. Esto se puede ver reorganizando la afirmación, donde cada línea de la siguiente es equivalente:
AZ * BZ = Q A * Z * B * Z = Q (A * B) * Z * Z = Q P * Z * Z = Q PZ * Z = Q
En la línea 4, P sustituye A * B. Por lo tanto, el resultado de AZ * BZ (que es Q ) no es PZ , sino PZ * Z. Si PZ fuera la respuesta, podría almacenarse directamente, ya que tiene el factor de escala incorporado, como ocurre con la suma y la resta . Sin embargo, para la multiplicación, el producto de dos valores escalados tiene un factor de escala adicional incorporado. Siempre que se tenga esto en cuenta, no es necesario convertir AZ y BZ en A y B antes de realizar la operación; el resultado debe dividirse por Z antes de almacenarlo. Después de esto, PZ se almacenará como el resultado de la multiplicación, que es la representación escalada del resultado de A * B (la respuesta deseada) en lugar del resultado de AZ * BZ (que todavía está escalado).
Escenarios de escalado comunes
Valores fraccionarios escalados a números enteros
Como se describió anteriormente, muchos procesadores antiguos (y posiblemente algunos actuales) no admiten de forma nativa la aritmética fraccionaria. En este caso, los valores fraccionarios se pueden convertir a enteros multiplicándolos por diez elevado a la potencia de la precisión decimal deseada. En otras palabras, para conservar n dígitos a la derecha del punto decimal , es necesario multiplicar el número completo por 10ⁿ . En las computadoras que realizan cálculos en binario, el número real se multiplica por 2ᵐ para conservar m dígitos a la derecha del punto binario ; alternativamente, se puede desplazar el valor m posiciones a la izquierda. Por ejemplo, en el siguiente conjunto de valores fraccionarios reales, todos tienen tres dígitos a la derecha del punto decimal:
15.400, 0.133, 4.650, 1.000, 8.001
Para guardar toda esa información (es decir, sin perder precisión ), estos números deben multiplicarse por 10³ (1000), lo que da como resultado valores enteros de:
15400, 133, 4650, 1000, 8001
Debido al valor de los números escalados, no se pueden almacenar en enteros de 8 bits; requerirán al menos 14 bits sin signo o, de forma más realista, 16.
Valores enteros a fracciones
Ciertos procesadores, en particular los DSP comunes en la industria de sistemas embebidos , tienen soporte incorporado para la aritmética de punto fijo , como los formatos Q e IQ .
Dado que la parte fraccionaria de un número ocupa algunos bits en el campo, el rango de valores posibles en un valor de punto fijo es menor que el que proporcionaría la misma cantidad de bits a un entero. [ 4 ] Por ejemplo, en un campo de 8 bits , un entero sin signo puede almacenar valores de [0, 255] , pero un punto fijo sin signo con 5 bits asignados a la parte fraccionaria solo tiene 3 bits restantes para el valor entero, por lo que solo puede almacenar valores enteros de [0, 7] . (La cantidad de valores distintos que pueden almacenar los dos campos es la misma, 2 × 8 = 256, porque el campo de punto fijo también puede almacenar 32 valores fraccionarios por cada valor entero). Por lo tanto, es común que se utilice un factor de escala para almacenar valores del mundo real que pueden ser mayores que el valor máximo del formato de punto fijo.
Por ejemplo, al usar un formato de punto fijo de 8 bits sin signo (que tiene 4 bits enteros y 4 bits fraccionarios), el valor entero representable más alto es 15, y el valor mixto representable más alto es 15.9375 (0xF.F o 1111.1111 b). Si los valores del mundo real deseados están en el rango [0,160], deben escalarse para que se ajusten a esta representación de punto fijo. No se puede usar un factor de escala de 1/10 , porque escalar 160 por 1/10 da 16 , que es mayor que el valor máximo que se puede almacenar en este formato de punto fijo. Sin embargo, 1/11 funcionará como factor de escala, porque el valor escalado máximo, 160/11 = 14.54 , se ajusta a este rango. Dado este conjunto:
154, 101, 54, 3, 0, 160
Al escalarlos con el factor de escala 1/11 se obtienen los siguientes valores:
154/11 = 14 101/11 = 9,1818... 54/11 = 4,9090... 3/11 = 0,2727... 0/11 = 0 160/11 = 14,5454...
Muchos de estos valores se han truncado porque contienen decimales periódicos , lo cual se deriva del factor de escala elegido (las onceavas no terminan en decimal). Al almacenarlos en nuestro formato de punto fijo, se perderá cierta precisión (a diferencia de los valores exactos de los enteros originales). Esto también es un problema porque un formato de 8 bits puede almacenar 256 valores diferentes, pero los números en este conjunto están en un rango con solo 161 valores posibles (de 0 a 160). Resulta que el problema era el factor de escala, 1/11 , que introdujo requisitos de precisión innecesarios y errores de redondeo (al aproximar un valor real con el valor representable más cercano). [ 5 ] Para evitar o resolver este problema, se debe elegir un mejor factor de escala .
Elegir un factor de escala
El ejemplo anterior ilustra cómo ciertos factores de escala pueden causar una pérdida de precisión innecesaria o errores de redondeo, lo que subraya la importancia de elegir el factor de escala adecuado. Al usar un factor de escala de 1/11 y convertirlo a representaciones binarias, se obtienen los siguientes valores:
154/11 = 14 = 1110.0 101/11 = 9,1818... = 1001,00101110... 54/11 = 4,9090... = 100,111010... 3/11 = 0,2727... = 0,010010... 0/11 = 0 = 0.0 160/11 = 14,5454... = 1110,10010...
Varias fracciones binarias requieren más de los cuatro bits fraccionarios que proporciona el formato de punto fijo establecido. (Esto se debe en parte a que los onceavos tampoco terminan en binario). Para que quepan en los campos (4 bits enteros y 4 fraccionarios), es posible truncar los bits restantes, lo que da como resultado las siguientes representaciones almacenadas:
1110.0000 1001.0010 0100.1110 0000.0100 0000.0000 1110.1001
O en decimal:
14.0 9.125 4.875 0,25 0.0 14.5625
Cuando se les llama de vuelta al mundo real, se dividen por el factor de escala, 1/11 . Este es el inverso de la escala original, lo que da como resultado los siguientes valores del "mundo real" :
154.0 100.375 53.625 2,75 0 160.1875
Estos valores no son equivalentes a los originales (antes de reducirlos y ajustarlos a esta representación de 8 bits). Lo más destacable es que ya no son todos números enteros, lo que indica de inmediato que se introdujo un error en el almacenamiento debido a una mala elección del factor de escala.
Elegir un factor de escala mejor
La mayoría de los conjuntos de datos no tendrán un factor de escala perfecto; lo más probable es que se introduzca algún error durante el proceso de escalado. Sin embargo, es posible elegir un factor de escala mejor. El factor de escala ideal no tiene por qué ser el más pequeño, sino aquel que conserve la mayor precisión posible.
Dividing a number by a power of two is the same as shifting all the bits to the right once for each power of two. (This is the binary equivalent to shifting all decimal digits to the left or right when, respectively, multiplying or dividing by powers of ten.) The pattern of bits does not change, it just moves the number of places equal to the binary exponent (for instance, 3 places to the right when dividing by 8 = 23). On the other hand, when dividing by a number that is not an integer power of two in binary, the bit pattern changes. This is likely to produce a bit pattern with more bits to the right of the binary point, artificially introducing required precision. This is especially true when the fractional part has a denominator that is not a power of two, as all fractions not reciprocals of powers of two recur in binary.[6] Therefore, it is almost always preferable to use a scale factor that is a power of two. It may still be possible to lose bits that get shifted right off the end of the field as a result of truncation, but this avoids introducing new bits that will be imprecise (due to rounding error) or truncated.[6]
As an illustration the use of powers of two in the scale factor, a scale factor of 1⁄16 can be applied to the above data set. The binary values for the original data set are given below:
154 = 1001 1010 101 = 0110 0101 54 = 0011 0110 3 = 0000 0011 0 = 0000 0000 160 = 1010 0000
Being integers between 0 and 255, these all can be represented precisely with 8 bits. Scaling these by 1⁄16 is the same as dividing by 16, which is the same as shifting the bits 4 places to the right. In this case, scaling is done by inserting a binary point between the first 4 bits and last 4 bits of each number. That happens to equal the predetermined format of this representation. Consequently, since all these numbers do not require more than 8 bits to represent them as integers, no more than 8 bits are required to scale them down and store them in a fixed-point format.
See also
References
- ↑Linz & Wang 2003, pp. 12–13.
- ↑Linz & Wang 2003, pp. 14–15.
- ↑Yates 2013, p. 6.
- ↑Yates 2013, pp. 4–5.
- ↑Linz & Wang 2003, p. 18.
- 12"Binary Fractions". Floating-point-gui.de. Retrieved 6 July 2020.
- Yates, R. (2013). "Aritmética de punto fijo: una introducción" (PDF) . Digital Signal Labs. Archivado (PDF) del original el 12 de septiembre de 2015.
- Linz, P.; Wang, RLC (2003). Explorando métodos numéricos: Una introducción a la computación científica con MATLAB . Jones and Bartlett Publishers . ISBN 0-7637-1499-2.
- Teoría de la computación