Skip to content

Instantly share code, notes, and snippets.

@Jeconias
Last active June 24, 2019 00:13
Show Gist options
  • Save Jeconias/67baea0d57ea2773be62df3c023ac29e to your computer and use it in GitHub Desktop.
Save Jeconias/67baea0d57ea2773be62df3c023ac29e to your computer and use it in GitHub Desktop.
Conversor de ponto flutuante para IEEE754 e o inverso / Floating Point to IEEE 754 32bit Converter
# Jeconias Santos
import math
class i3Braulio754():
_base = None # ESSE VALOR É PARA ALTERAR A BASE, PRA FICAR MAIS FLEXÍVEL // NÃO FINALIZADO, APENAS FUNCIONA PARA BASE 2
_x32x64 = None # ESSE É PARA QUAL PADRÃO O VALOR SERÁ CONVERTIDO // NÃO USADO
_sinal = None # AQUI FICARÁ O SINAL DE BIT
_number = None # NÚMERO DE ENTRADA EM DECIMAL/IEEE
_ieee754 = None # NÚMERO DE ENTRADA EM DECIMAL/IEEE -> QUASE UM PULO DO GATO
_conversion = None # AQUI É ARMAZENADO O VALOR QUE DEFINE O TIPO DE CONVERSÃO
def __init__(self, number, base=2, x32_x64=32):
self._base = base
self._x32x64 = x32_x64
self._sinal = 0 if float(number) > 0 else 1
self._number = float(number)
self._ieee754 = number # SERÁ SUBSTITUIDO SE A CONVERSÃO FOR DE DECIMAL PARA IEEE
# DETECTAR O TIPO DE ENTRADA -> ieee, decimal / BÁSICO, MAS FUNCIONAL
number = list(number)
ponto = '.'
negative = '-'
if ponto in number:
number.remove(ponto)
if negative in number:
number.remove(negative)
for i in number:
i = int(i)
if i <= 1:
self._conversion = 'ieee'
elif i >= 2:
self._conversion = 'decimal'
break
else:
self._conversion = 'undefined'
# ESSE MÉTODO CONVERTE INTEIRO PARA BINÁRIO
def inteiroBin(self, number):
number = int(number)
binario = ''
while number != 0:
binario += str(number % 2)
number = math.trunc(number / 2)
return binario[::-1]
# ESSE MÉTODO CONVERTE VALORES FLUTUANTES PARA DECIMAL
def floatBin(self, number, binNumberQtd=0):
# ADICIONAR O ZERO NO NÚMERO DEPOIS DO PONTO
number = float('0.' + str(number))
# STRING QUE SERÁ RETORNADA COM TODOS OS 0 E 1
binario = ''
# CONTADOR PARA WHILE
count = 0
# IF COUNT < 23 - A QUANTIDADE DE 0 OU 1 DO NÚMERO ANTES DO PONTO
while (count < 23 - len(str(binNumberQtd))):
number = round(number * self._base, 2)
# print(number)
binario += str(number)[0]
if number >= 1:
number -= 1
if number == 0:
break
count += 1
return binario
# PEGANDO O EXPOENTE DO NÚMERO
def expoente(self, numberFirst):
expoente = len(numberFirst) - 1
return self.inteiroBin(127 + expoente)
# AQUI MONTAMOS O NÚMERO BIN PARA O PADRÃO IEEE
def binIeee(self):
# SEPARANDO O NÚMERO DE ENTRADA
number = str(self._number).split('.')
# O NUMERO ANTES DO PONTO PARA BINÁRIO
intBin = self.inteiroBin(number[0])
# O NÚMERO DEPOIS DO PONTO PARA BINÁRIO
floatBin = self.floatBin(number[1], intBin)
# O EXPOENTE
expoente = self.expoente(intBin)
# O SINAL EM STR
sinal = str(self._sinal)
ieee754 = sinal + expoente + intBin[1:] + floatBin
if len(ieee754) < 32:
ieee754 = ieee754 + ('0' * (32 - len(ieee754)))
self._ieee754 = ieee754
return ieee754
# MÉTODOS PARA IEEE -> DECIMAL
# CONVERTENDO BIN PARA INT
def binInt(self, numberBin):
return int(numberBin, 2)
# MONTANDO E CONVERTENDO O NÚMERO IEEE PARA DECIMAL
def ieeeDecimal(self):
# SINAL
sinal = self._ieee754[0]
# PEGANDO O EXPOENTE
expoente = self.binInt(self._ieee754[1:9]) - 127
# O NÚMERO EM BINÁRIO SEM SINAL E EXPOENTE
number = '1' + self._ieee754[9:]
# VALOR DO NÚMERO ANTES DO PONTO EM DECIMAL
primeiroValor = int(number[0:expoente + 1], 2)
# VALOR DO NÚMERO DEPOIS DA VIRGULA EM ieee754
segundoValor = '0' + number[expoente + 1:]
decimal = 0
count = 0
while(count < len(segundoValor)):
decimal += int(segundoValor[count]) * 2 ** (count * - 1)
count += 1
segundovalor = str(decimal)[1:]
# VERIFICANDO O SINAL E RETORNANDO NEGATIVO OU POSITIVO
if int(sinal) == 1:
return float('-' + str(primeiroValor) + segundovalor)
return float(str(primeiroValor) + segundovalor)
print('{} i3Braulio754 {}\n###### Press Enter to exit ######\n{}'.format(
'#' * 10, '#' * 9, '#' * 33))
while True:
value = input('Enter IEEE754 or Decimal number: ')
if value == '':
print('Bye!')
break
run = i3Braulio754(value)
if run._conversion == 'ieee':
print('\nEntrada: {}\nValor armazenado em float: {}\n'.format(
value, run.ieeeDecimal()))
elif run._conversion == 'decimal':
print('\nEntrada: {}\ni3Braulio754: {}\n'.format(value, run.binIeee()))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment