El complemento bit a bit de la representación binaria de un número de punto flotante

Me pregunto si el complemento bit a bit (NO) de la representación binaria de un número de coma flotante de un número es el mismo número pero con un cambio en su signo.

Gracias a todas las posibles referencias a artículos o documentación.

¿Quieres decir bit a bit NO? "Bitwise" abarca muchas operaciones. ¿A cuál en particular te refieres?
Me refiero a cambiar los unos por ceros, y los ceros por unos.
La inversión binaria de un número (lo que usted describe) se denomina operación "lógica NO".
creo que la operación en cuestión también se conoce como el "complemento de unos" :)

Respuestas (5)

Los números de punto flotante IEEE 754 se representan como un signo, una mantisa y un exponente.

Es posible trabajar con flotadores a un nivel de bits, pero necesita saber lo que está haciendo .

Aquí hay algunos documentos que explican más.

http://www.engrng.pitt.edu/hunsaker/3097/floatingpoint.pdf

http://punto-flotante-gui.de/

A diferencia de los enteros en complemento a dos, el punto flotante IEEE 754 tiene un positivo y un negativo. cero.
También tiene NaN, Infinity y 'subnormales' (los pequeños desviados)... ¡Dios mío! Este formato de número está diseñado para simplificar la vida de los métodos numéricos acelerados por hardware. ¡IEEE 754 incluso admite decimales! (base 10): en.wikipedia.org/wiki/Decimal32_floating-point_format .

No estoy seguro de lo que quieres decir con "bit a bit". Hay muchas operaciones bit a bit. Las opciones lógicas son complemento a uno/NO bit a bit (suposición de nombre falso) o complemento a dos (cambia el signo por enteros con signo). Las opciones menos lógicas son OR, AND, XOR y sus complementos NOR, NAND, XNOR. Ninguno de estos producirá el resultado deseado para un número de punto flotante.

Como puede ver en el bonito diagrama de Joby, el primer bit es el bit de signo, luego el exponente (sesgado) ocupa 8 bits, luego la mantisa. Lo que quieres hacer es XOR el bit de signo:

FloatingPointNumber ^ 0x80000000 == -(FloatingPointNumber)

Esa constante asume que estás usando flotantes de 32 bits. Deberá agregar otros 8 ceros al final de la constante para un número de tipo doble.

No, no es.

Puede probarlo aquí: http://babbage.cs.qc.edu/IEEE-754/32bit.html

Por ejemplo, puede ingresar el número de la página de wikipedia binary32 :

00111110 00100000 00000000 00000000 binary = 3E200000 hex

y verás que en realidad es 0.15625 decimal.

Cuando ahora ingresa el NOT bit a bit (complemento de unos) de esa representación binaria:

11000001 11011111 11111111 11111111 binary = C1DFFFFF hex

verás que es -27.999998092651367 .

Consulte la respuesta de Joby Taffey para obtener una explicación de por qué.
Solo invierte el MSB, por lo tanto, en su ejemplo, 0x3E20 0000 se convierte en 0xBE20 0000, que de hecho es la respuesta correcta
Necesitará una operación XOR para eso.

No, es basura. Los puntos flotantes tienen una estructura interna compleja, por lo que no puedes hacer eso.

Puede hacer algunas manipulaciones en la mantisa, pero no en números enteros.

No estoy de acuerdo con este comentario, pero no pude rechazar el voto.
@Eddie Hitler Para votar negativamente, necesita una reputación de más de 125 electronics.stackexchange.com/faq
Expliqué cómo se ve afectada la estructura interna y por qué esto es aproximadamente -4.0/f, y créanme, realicé algunas simulaciones numéricas. ¿Algo más que pueda hacer para convencerte, querido @BarsMonster?

El resultado de invertir todos los bits de un flotador f puede verse como una aproximación cruda de -4.0/f. Esto funciona porque los tres elementos del flotador se comportan de manera predecible:

-el bit de signo está invertido
-el exponente está invertido, justo por un factor de uno
-la nueva mantisa se convierte en un áspero 3 - mantisa (¡cuidado con el bit oculto que siempre es uno!)

Ejemplo:

hexadecimal: 0x3F800000
signo: +
exponente: 127
mantisa: 1,00000000000000000000000 (binario) = 1,0
valor decimal: + 2**(127-127) * 1,0 = 1,0

Con cada bit invertido:

hexadecimal: 0xC07FFFFF
signo: -
exponente: 128
mantisa: 1,111111111111111111111 (binario) = 1,99999
valor decimal: - 2**(128-127) * 1,99999 = -3,999999