Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # 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()))
Add Comment
Please, Sign In to add comment