Requisito previo: Números de punto flotante estándar IEEE 754
Dado un número de punto flotante, la tarea es encontrar la representación hexadecimal para el número según el estándar IEEE 754.
El estándar IEEE para aritmética de punto flotante (IEEE 754) es un estándar técnico para el cálculo de punto flotante que fue establecido en 1985 por el Instituto de Ingenieros Eléctricos y Electrónicos (IEEE). El estándar abordó muchos problemas encontrados en las diversas implementaciones de coma flotante que dificultaban su uso confiable y reducían su portabilidad. El punto flotante estándar IEEE 754 es la representación más común hoy en día para números reales en computadoras, incluidas las PC basadas en Intel, Mac y la mayoría de las plataformas Unix.
Ejemplos:
Input : -6744.90 Output : C5D2C733 Input : -263.3 Output : C383A666
Acercarse :
- Comprueba si el número es positivo o negativo. Guarde el signo como 0 para positivo y 1 para negativo, y luego convierta el número en positivo si es negativo.
- Convierte el número de coma flotante a binario .
- Separe la parte decimal y la parte entera.
- Calcula el exponente (E) y conviértelo a binario.
- Encuentra la mantisa.
- Concatenar el signo de la mantisa, el exponente y la mantisa.
- Conviértelo a hexadecimal.
Escribamos un programa Python para representar un número flotante como hexadecimal según el estándar IEEE 754.
Python3
# Function for converting decimal to binary def float_bin(my_number, places = 3): my_whole, my_dec = str(my_number).split(".") my_whole = int(my_whole) res = (str(bin(my_whole))+".").replace('0b','') for x in range(places): my_dec = str('0.')+str(my_dec) temp = '%1.20f' %(float(my_dec)*2) my_whole, my_dec = temp.split(".") res += my_whole return res def IEEE754(n) : # identifying whether the number # is positive or negative sign = 0 if n < 0 : sign = 1 n = n * (-1) p = 30 # convert float to binary dec = float_bin (n, places = p) dotPlace = dec.find('.') onePlace = dec.find('1') # finding the mantissa if onePlace > dotPlace: dec = dec.replace(".","") onePlace -= 1 dotPlace -= 1 elif onePlace < dotPlace: dec = dec.replace(".","") dotPlace -= 1 mantissa = dec[onePlace+1:] # calculating the exponent(E) exponent = dotPlace - onePlace exponent_bits = exponent + 127 # converting the exponent from # decimal to binary exponent_bits = bin(exponent_bits).replace("0b",'') mantissa = mantissa[0:23] # the IEEE754 notation in binary final = str(sign) + exponent_bits.zfill(8) + mantissa # convert the binary to hexadecimal hstr = '0x%0*X' %((len(final) + 3) // 4, int(final, 2)) return (hstr, final) # Driver Code if __name__ == "__main__" : print (IEEE754(263.3)) print (IEEE754(-263.3))
4383A666 C383A666