Last active
June 24, 2019 00:13
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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