Por qué la representación de coma flotante usa un bit de signo en lugar del complemento de 2 para indicar números negativos

20

Considere una representación de punto fijo que puede considerarse como un caso degenerado de un número flotante. Es completamente posible usar el complemento de 2 para números negativos. Pero, ¿por qué es necesario un bit de signo para los números de coma flotante? ¿No deberían los bits de mantisa usar complementos de 2?

Además, ¿por qué los bits de exponente usan un sesgo en lugar de una representación de magnitud con signo (similar a los bits de mantisa) o la representación del complemento a 2?

Actualización: lo siento si no lo dejé claro. Estaba buscando la razón de cómo se forma la representación de punto flotante. Si no hay una solución de compromiso fuerte entre las alternativas, ¿alguien podría explicar los aspectos históricos de la representación en coma flotante?

koo
fuente

Respuestas:

7

El complemento a dos tiene sentido cuando las dos entidades en cuestión tienen las mismas "unidades" y el mismo "ancho". Por ancho quiero decir que, por ejemplo, si está agregando un número de N bits y un número de M bits, donde N y M son diferentes, entonces es mejor que no use el complemento de dos. Para los números de coma flotante, tenemos el problema de las unidades: si los exponentes son diferentes, entonces estamos cambiando mentalmente una de las mantisas, y ahora estamos en el mismo problema que antes (con el ancho).

En cuanto a los bits de exponente, al usar un sesgo en lugar de signo + magnitud, obtenemos un valor más (de lo contrario, tendríamos +0 y -0). Aquí el complemento a dos tiene sentido al multiplicar o dividir números (desde entonces estamos sumando o restando los exponentes), pero no tiene tanto sentido al sumar o restar.

Editar: Un comentarista comentó que puede agregar enteros complementarios de dos de diferentes longitudes usando la extensión de signo. También hay algún problema con la detección de desbordamiento, pero eso también se puede solucionar. En resumen, probablemente podría usar el complemento de dos, si tiene suficiente cuidado. (También debe manejar la multiplicación y la división).

Yuval Filmus
fuente
44
"Si está agregando un número de N bits y un número de M bits, donde N y M son diferentes, entonces es mejor que no use el complemento de dos" - ¿Podría aclarar un poco? Creo que es completamente posible firmar extender un número usando una representación de complemento a 2 usando su MSB, por ejemplo, 4'b1111 se extenderá a 5'b11111 y 4'b0111 -> 5'b00111. ¿No debería ser sencillo agregar esto a la palanca de cambios de barril existente dentro de una lógica aritmética de coma flotante?
koo
¡Gracias por su respuesta! He editado la pregunta para que pregunte más claramente sobre qué hace que el punto flotante actual.
koo
4

De Wikipedia:

El sistema del complemento a dos tiene la ventaja de que las operaciones aritméticas fundamentales de suma, resta y multiplicación son idénticas a las de los números binarios sin signo ...

El complemento a dos es una representación de números negativos que resulta muy conveniente. Esa es toda la razón para usarlo.

Un par mantisa-exponente es una representación de un número de coma flotante. La mayoría de las veces cuando se usan números de coma flotante, no se está haciendo aritmética únicamente en la mantisa o únicamente en el exponente.

Kache
fuente
4

Pero, ¿por qué es necesario un bit de signo para los números de coma flotante?

Suposición falsa. No es necesario Estoy bastante seguro de que he encontrado formatos de coma flotante que utilizan el complemento de 2 para la mantisa, pero tendría que buscar nombres.

Estoy lejos de ser un especialista en análisis numérico, pero entiendo que haber firmado cero es importante para ellos. Probablemente sea más fácil de manipular que el complemento de uno. Ese fue probablemente un criterio en la elección de IEEE-754.

Además, ¿por qué los bits de exponente usan un sesgo en lugar de una representación de magnitud con signo?

Una vez más, es algo que no se necesita y algunos han hecho algo diferente.

Es la representación para la que es más fácil hacer una implementación de hardware para el conjunto de operaciones que se realizan en exponentes (y aquí no se desea tener una representación para -0).

Una de las consecuencias de esa elección es que puede usar la comparación de enteros con signo para comparar el número de FP si no le importa NaN, lo que quizás fue un criterio para algunos (el hecho de que NaN necesita un manejo especial me hace dudar de que no sea para IEEE-754).

Un programador
fuente
Las comparaciones de enteros firmados clasificarán los números FP negativos hacia atrás. Para que se clasifiquen correctamente, habría sido necesario algún tipo de formato de complemento, con el complemento de uno probablemente el mejor (el negativo sería ... 110.1111 ..., con infinitos a la izquierda y a la derecha).
supercat
3
MIL-STD-1750A es probablemente la arquitectura de procesador más utilizada que especifica la representación de coma flotante complementaria de dos. En la sección 4.1: "El conjunto de instrucciones admitirá datos de precisión extendida de punto fijo de 16 bits, precisión doble de punto fijo de 32 bits, punto flotante de 32 bits y punto flotante de precisión de 48 bits en la representación complementaria de 2 " (énfasis mío) .
njuffa
2

IEEE 754 usa signo / magnitud, no el complemento de dos o el complemento de uno.

El complemento a dos tiene la desventaja de que los rangos positivo y negativo no son idénticos. Si todos los patrones de bits son válidos, entonces tiene números x donde no puede calcular fácilmente -x. Eso es malo. La alternativa es que hay patrones de bits no válidos, lo que también es malo. En IEEE 754 no hay patrones de bits no válidos para coma flotante de 64 o 32 bits, por lo que no debe preocuparse por eso.

El complemento de uno haría que la multiplicación / división sea más compleja (con una magnitud con signo, solo debes xorizar los signos y tratar la mantisa como un número sin signo). Para sumar y restar, realmente no quiero pensar en sumar y restar en el complemento, me duele la cabeza.

gnasher729
fuente
El primer párrafo de esta respuesta sugiere que no hay inconvenientes para firmar / magnitud. Signo / magnitud tiene +/- 0 y una aritmética más complicada que el complemento de dos.
Praxeolitic
Tener +/- cero es tanto un problema como una característica. Por ejemplo, dividir un pequeño número x por 10 ^ 100 dará +0 o -0, conservando el signo de x.
gnasher729
1

Tener ceros con signo proporciona una expresividad aumentada que puede ser útil en los cálculos numéricos. La página de wikipedia ' Firmado cero ' dice:

Se afirma que la inclusión del cero con signo en IEEE 754 hace que sea mucho más fácil lograr la precisión numérica en algunos problemas críticos , en particular cuando se computa con funciones elementales complejas .

Uno de los principales diseñadores del punto flotante IEEE 754, WH Kahan es un defensor del cero firmado por estas razones. Su opinión probablemente habrá tenido mucho peso.

equaeghe
fuente
1

Creo que es importante entender que los cálculos de punto flotante producen valores aproximados , no valores exactos . Es decir, si un cálculo de punto flotante produce un valor codificado X, entonces esto representa un valor teóricamente ideal que casi seguro NO es X, pero está en el rango [X .. X + e) ​​{donde 'e' es el ' máquina épsilon ', es decir, no hay un número de coma flotante entre X y X + e}. Más específicamente, un cero de coma flotante representa un número ideal que probablemente no sea exactamente cero, pero que es demasiado pequeño para representarlo con un valor codificado de coma flotante distinto de cero.

Dado eso, el uso de la representación de signo y magnitud es una forma de permitir que la codificación 'recuerde' exactamente en qué lado de cero está el valor ideal, el positivo o el negativo. Esto es crítico en ciertos cálculos complejos (en el sentido 'a + bi'): las funciones complejas-> complejas a menudo son 'multivalorizadas', por lo que para un cálculo adecuado es fundamental prestar atención a las ubicaciones de los 'cortes de rama'. Los ceros firmados luego, en cierto sentido, marcan las ubicaciones de estos cortes de rama: el cálculo realizado en el lado positivo será diferente del del lado negativo.

PMar
fuente
1
Los cálculos de punto flotante producen valores exactos . Son solo ligeramente diferentes de los valores que producen los números matemáticos reales. Un número de coma flotante representa un número, no un rango.
gnasher729
0

La mayoría de los formatos de punto flotante aprovechan el hecho de que, en un sistema binario, cualquier valor distinto de cero con un exponente no mínimo tendrá un "1" como el bit más significativo de la mantisa. Por lo tanto, en un sistema con un campo de 23 bits para la mantisa, las mantisas de números positivos no varían de 0 a 8,388,607, sino de 8,388,608 a 16,777,215. Las mantisas de números que pueden o no ser positivos varían de -16,777,215 a -8,388,608 y de +8,388,608 a +16,777,215. Si bien el complemento a dos es el mejor formato numérico cuando es necesario hacer que los cálculos crucen "sin problemas" a través de cero, los rangos discontinuos de valores de mantisa significan que los cálculos no podrían funcionar sin problemas a través de cero si usan el complemento de dos o algo más .

Super gato
fuente