Estoy tratando de calcular el mínimo / máximo, o el rango de valor más bajo al más alto de un tipo de punto flotante de 48 bits MIL-STD-1750A (PDF) (WIKI) .
Ejemplo: cómo un rango doble es 1.7E +/- 308
He buscado ecuaciones y no estoy seguro de si lo que encontré funcionará.
La primera ecuación que encontré fue
No estoy muy seguro de por dónde empezar con estos, si son correctos en lo que necesito.
¿Alguien me impartirá sus conocimientos y me ayudará a resolver esto?
Comentarios
Respuesta
Para punto flotante de 32 bits, el valor máximo se muestra en la Tabla III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
Nosotros puede descomponer la mantisa / exponente en un valor decimal (cercano) de la siguiente manera:
7FFFFF <base-16> = 8,388,607 <base-10>.
Hay 23 bits de importancia, por lo que dividimos 8,388,607 entre 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
en cuanto al exponente:
7F <base-16> = 127 <base-10>
y ahora multiplicamos la mantisa por 2 ^ 127 (el exponente)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Este es el valor de coma flotante de 32 bits más grande porque se usa la mantisa más grande y el exponente más grande.
El punto flotante de 48 bits agrega 16 bits de mantisa de menor importancia pero deja el exponente del mismo tamaño. Por lo tanto, el valor máximo se representaría en hexadecimal como
mansissa=7FFFFFFFFF, exponent=7F.
nuevamente, podemos calcular
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
el exponente máximo sigue siendo 127, pero necesitamos dividir entre [23 + 16 = 39, entonces:] 2 ^ 39. 127-39 = 88, así que solo multiplique por 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Este es el valor de punto flotante de 48 bits más grande porque usamos la mantisa más grande posible y el mayor exponente posible.
Por tanto, los valores máximos son:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
El valor máximo para 48 bits es un poco mayor que para 32 bits, lo cual es lógico, ya que se agregan algunos bits al final de la mantisa.
(Para ser exactos, el número máximo para el formato de 48 bits se puede expresar como un número binario que consta de 39 1 «seguidos de 88 0» s.)
(El más pequeño es solo el negativo de este valor. El más cercano a cero sin ser cero también se puede calcular fácilmente como se indica arriba: use el mantisa más pequeña posible (positiva): 0000001 y el exponente más pequeño posible: 80 en hexadecimal, o -128 en decimal)
FYI
Algunos formatos de coma flotante utilizan un elemento oculto no representado 1
bit en la mantisa (esto permite un bit extra de precisión en la mantisa, como f ollows: el primer dígito binario de todos los números (excepto 0, o desnormales, ver más abajo) es un 1
, por lo tanto, no tenemos que almacenar ese 1
, y tenemos un poco más de precisión). Este formato en particular no parece hacer esto.
Otros formatos de punto flotante permiten la mantisa desnormalizada, que permite representar números (positivos) más pequeños que el exponente más pequeño, intercambiando bits de precisión por poderes adicionales (negativos) de 2. Es fácil de admitir si no admite también lo oculto un poco, un poco más difícil si lo hace.
8,388,607 / 2 ^ 23 es el valor que obtendría con mantisa = 0x7FFFFF y exponent = 0x00. No es el valor de un solo bit, sino el valor con una mantisa completa y una neutral, o más específicamente, una cero exponente.
La razón por la que este valor no es directamente 8388607 y requiere división (por 2 ^ 23 y por lo tanto es menor de lo que podría esperar) es que el implícito punto de base está al frente de la mantisa, en lugar de después . Por lo tanto, piense (un bit de signo, seguido de un punto de base, seguido de veintitrés bits 1) para la mantisa y +/- 111111111111 (sin punto de base aquí, solo un número entero, en este caso, 127 ) para el exponente.
mantissa = 0x7FFFFF con exponent = 0x7F es el valor más grande que corresponde a 8388607 * 2 ^ 104, donde 104 proviene de 127-23: nuevamente, restando 23 potencias de dos porque la mantisa tiene el punto de base al principio. Si el punto de la base estuviera al final, entonces el valor más grande (0x7FFFFF, 0x7F) sería de hecho 8,388,607 * 2 ^ 127.
Entre otras, hay formas posibles de considerar un valor de bit único para el mantisa. Una es mantisa = 0x400000 y la otra es mantisa = 0x000001. sin considerar el punto de la base ni el exponente, el primero es 4.194.304 y el segundo es 1. Con un exponente cero y considerando el punto de la base, el primero es 0.5 (decimal) y el segundo es 0.00000011920928955078125. Con un exponente máximo (o mínimo), podemos calcular valores de un solo bit máximo y mínimo.
(Tenga en cuenta que el último formato en el que la mantisa tiene ceros a la izquierda se consideraría desnormalizado en algunos formatos numéricos, y su representación normalizada sería 0x400000 con un exponente de -23).
Comentarios
- Tengo una duda. Al hacer 8,388,607 / 2 ^ 23 da lo que puede representar un solo bit en la mantisa. Entonces, ¿cómo 8,388,607 / 2 ^ 23 * 2 ^ 127 representa el valor máximo?
- @hariprasad, pondré una posdata en la respuesta, ya que es demasiado difícil de explicar en el formato de comentario.
- ¿Dónde está el valor mínimo? ¡Se solicita ' en el título!
- @CharlieParker, a diferencia de las representaciones de números enteros donde el mínimo y el máximo están desplazados, los formatos de punto flotante usan el signo & representaciones de magnitud, donde la magnitud está compuesta por un exponente y una mantisa. El número máximo en magnitud de signo es entonces (1) positivo (el bit de signo es 0) y (2) el mayor exponente posible y (3) la mayor mantisa posible. El número mínimo es idéntico: excepto que el bit de signo cambia, por lo que es (1) negativo (el bit de signo es 1), pero (2) el mayor exponente posible y (3) la mayor mantisa posible. Como expliqué anteriormente, el número mínimo es simplemente -max, así que simplemente coloque un signo
-
.
Respuesta
Puede tomar prestado de cómo se presenta el punto flotante IEEE para una comparación rápida: signo, exponente, mantisa. sin embargo, en ese PDF veo que la mantisa y el exponente están invertidos.
Esto significa que para comparar primero tendrás que verificar el bit de signo y si uno no es el ganador, compararás los exponentes y luego compararás la mantisa.
Si uno es positivo y el otro es negativo, entonces el positivo es el máximo.
Si ambos son positivos y un exponente es mayor, entonces es el máximo (si ambos son negativos, entonces es el mínimo)
De manera similar para mantisa.
a<b?a:b
ya>b?a:b