punto hexadecimal flotante doble arithmetic floating-point ieee-754 exponent

floating point - hexadecimal - ¿Por qué sesgamos el exponente de un número de punto flotante?



ieee 754 doble precision (2)

Estoy tratando de envolver mi cabeza alrededor de esta representación de números binarios en punto flotante, pero no pude encontrar, sin importar dónde miré, una buena respuesta a la pregunta.

¿Por qué está sesgado el exponente?

¿Qué hay de malo con el método del complemento de los dos viejos y confiables?

Intenté mirar el artículo de Wikipedia sobre el tema, pero todo lo que dice es: "la representación habitual de los valores firmados haría más difícil la comparación".


No recuerdo los detalles, pero había un deseo de que el exponente más alto estuviera un poco más lejos de cero que el exponente menos normal. Esto aumenta el número de valores x para los que tanto x como su recíproco son aproximadamente representables. Por ejemplo, con el punto flotante binario IEEE-754 de 64 bits, el rango del exponente normal es de -1022 a 1023. Esto hace que el valor representable finito más grande sea inferior a 2 1024 , por lo que el intervalo para el cual x y su recíproco son aproximadamente representables es casi 2 -1024 a casi 2 1024 . (Los números en el extremo más bajo de este intervalo son subnormales, por lo que se pierde algo de precisión, pero aún se pueden representar).

Con una representación de complemento a dos, los valores exponenciales oscilarían entre -1024 y 1023, y tenemos que reservar dos de ellos para manejar ceros, subnormales, infinitos y NaN. Eso deja un rango de -1023 a 1022. Con esto, el intervalo para x tal que tanto x como su recíproco son aproximadamente representables es de casi 2 -1023 a 2 1023 . Por lo tanto, la disposición sesgada proporciona un mayor rango útil de valores.


Las codificaciones IEEE 754 tienen la propiedad conveniente de que se puede realizar una comparación de orden entre dos números positivos que no son NaN simplemente comparando las cadenas de bits correspondientes de forma lexicográfica o equivalente, interpretando esas cadenas de bits como enteros sin signo y comparando esos números enteros. Esto funciona en todo el rango de punto flotante de +0.0 a + Infinito (y luego es una cuestión simple extender la comparación para tener en cuenta el inicio de sesión). Así, por ejemplo, en formato binario 64 IEEE 754, 1.1 se codifica como la cadena de bits (primero msb)

0011111111110001100110011001100110011001100110011001100110011010

mientras que 0.01 se codifica como la cadena de bits

0011111110000100011110101110000101000111101011100001010001111011

que ocurre lexicográficamente antes de la cadena de bits para 1.1 .

Para que esto funcione, los números con exponentes más pequeños deben compararse con los números con exponentes más grandes. Un exponente sesgado hace que funcione, mientras que un exponente representado en el complemento de dos hará que la comparación sea más complicada. Creo que esto es a lo que se aplica el comentario de Wikipedia.

Otra observación es que con la codificación elegida, el número de punto flotante +0.0 se codifica como una cadena de bits que consta completamente de ceros.