Me pregunto si el complemento a nivel de bits (NO) de la representación binaria de un número de punto flotante de un número es el mismo número pero con un cambio en su signo.
Gracias a todas las referencias posibles a artículos o documentación.
Me pregunto si el complemento a nivel de bits (NO) de la representación binaria de un número de punto flotante de un número es el mismo número pero con un cambio en su signo.
Gracias a todas las referencias posibles a artículos o documentación.
IEEE 754 los números de punto flotante se representan como un signo, una mantisa y un exponente.
Es posible trabajar con flotadores en un nivel de bits, pero necesita saber lo que está haciendo .
Aquíhayalgunosdocumentosqueexplicanconmásdetalle.
No estoy seguro de lo que quieres decir con "el bit a bit". Hay muchas operaciones bitwise Las opciones lógicas son el complemento de One / Bitwise NOT (conjetura del nombre falso) o el complemento de Two (signo de cambios para 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 se 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 flotadores de 32 bits. Deberá agregar otros 8 ceros al final de la constante para un número de tipo doble.
No, no lo es.
Puede probarlo aquí: enlace
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 es realmente 0.15625 decimal.
Cuando ahora ingresa el NOT a nivel de bits (complemento de unas) de esa representación binaria:
11000001 11011111 11111111 11111111 binary = C1DFFFFF hex
verás que es -27.999998092651367 .
No, es basura. los puntos flotantes tienen una estructura interna compleja, por lo que no puedes hacer eso.
Puedes hacer algunas manipulaciones con la mantisa, pero no con el número entero.
El resultado de invertir todos los bits de un float f puede verse como una aproximación bruta de -4.0 / f. Esto funciona porque los tres elementos del flotador se comportan de una manera predecible:
-sign bit se voltea
-El exponente está invertido, solo por un factor de uno.
-nueva mantisa se convierte en roughy 3 - mantisa (¡cuidado con el bit oculto que siempre es uno!)
Ejemplo:
hex: 0x3F800000
signo: +
exponente: 127
mantisa: 1.0000000000000000000000 (binario) = 1.0 decimal
valor: + 2 ** (127-127) * 1.0 = 1.0
Con cada bit volteado:
hex: 0xC07FFFFF
señal: -
exponente: 128
mantisa: 1.111111111111111111111 (binario) = 1.99999 decimal
valor: - 2 ** (128-127) * 1.99999 = -3.999999
Lea otras preguntas en las etiquetas floating-point