Guest User

Untitled

a guest
Apr 26th, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.74 KB | None | 0 0
  1. # Jeconias Santos
  2.  
  3. import math
  4.  
  5.  
  6. class i3Braulio754():
  7.  
  8. _base = None # ESSE VALOR É PARA ALTERAR A BASE, PRA FICAR MAIS FLEXÍVEL // NÃO FINALIZADO, APENAS FUNCIONA PARA BASE 2
  9. _x32x64 = None # ESSE É PARA QUAL PADRÃO O VALOR SERÁ CONVERTIDO // NÃO USADO
  10. _sinal = None # AQUI FICARÁ O SINAL DE BIT
  11. _number = None # NÚMERO DE ENTRADA EM DECIMAL/IEEE
  12. _ieee754 = None # NÚMERO DE ENTRADA EM DECIMAL/IEEE -> QUASE UM PULO DO GATO
  13. _conversion = None # AQUI É ARMAZENADO O VALOR QUE DEFINE O TIPO DE CONVERSÃO
  14.  
  15. def __init__(self, number, base=2, x32_x64=32):
  16. self._base = base
  17. self._x32x64 = x32_x64
  18. self._sinal = 0 if float(number) > 0 else 1
  19. self._number = float(number)
  20. self._ieee754 = number # SERÁ SUBSTITUIDO SE A CONVERSÃO FOR DE DECIMAL PARA IEEE
  21.  
  22. # DETECTAR O TIPO DE ENTRADA -> ieee, decimal / BÁSICO, MAS FUNCIONAL
  23. number = list(number)
  24. ponto = '.'
  25. negative = '-'
  26. if ponto in number:
  27. number.remove(ponto)
  28. if negative in number:
  29. number.remove(negative)
  30.  
  31. for i in number:
  32. i = int(i)
  33. if i <= 1:
  34. self._conversion = 'ieee'
  35. elif i >= 2:
  36. self._conversion = 'decimal'
  37. break
  38. else:
  39. self._conversion = 'undefined'
  40.  
  41. # ESSE MÉTODO CONVERTE INTEIRO PARA BINÁRIO
  42. def inteiroBin(self, number):
  43. number = int(number)
  44. binario = ''
  45. while number != 0:
  46. binario += str(number % 2)
  47. number = math.trunc(number / 2)
  48. return binario[::-1]
  49. # ESSE MÉTODO CONVERTE VALORES FLUTUANTES PARA DECIMAL
  50.  
  51. def floatBin(self, number, binNumberQtd=0):
  52. # ADICIONAR O ZERO NO NÚMERO DEPOIS DO PONTO
  53. number = float('0.' + str(number))
  54. # STRING QUE SERÁ RETORNADA COM TODOS OS 0 E 1
  55. binario = ''
  56. # CONTADOR PARA WHILE
  57. count = 0
  58. # IF COUNT < 23 - A QUANTIDADE DE 0 OU 1 DO NÚMERO ANTES DO PONTO
  59. while (count < 23 - len(str(binNumberQtd))):
  60. number = round(number * self._base, 2)
  61. # print(number)
  62. binario += str(number)[0]
  63. if number >= 1:
  64. number -= 1
  65. if number == 0:
  66. break
  67. count += 1
  68. return binario
  69. # PEGANDO O EXPOENTE DO NÚMERO
  70.  
  71. def expoente(self, numberFirst):
  72. expoente = len(numberFirst) - 1
  73. return self.inteiroBin(127 + expoente)
  74.  
  75. # AQUI MONTAMOS O NÚMERO BIN PARA O PADRÃO IEEE
  76. def binIeee(self):
  77. # SEPARANDO O NÚMERO DE ENTRADA
  78. number = str(self._number).split('.')
  79. # O NUMERO ANTES DO PONTO PARA BINÁRIO
  80. intBin = self.inteiroBin(number[0])
  81. # O NÚMERO DEPOIS DO PONTO PARA BINÁRIO
  82. floatBin = self.floatBin(number[1], intBin)
  83. # O EXPOENTE
  84. expoente = self.expoente(intBin)
  85. # O SINAL EM STR
  86. sinal = str(self._sinal)
  87. ieee754 = sinal + expoente + intBin[1:] + floatBin
  88. if len(ieee754) < 32:
  89. ieee754 = ieee754 + ('0' * (32 - len(ieee754)))
  90. self._ieee754 = ieee754
  91. return ieee754
  92.  
  93. # MÉTODOS PARA IEEE -> DECIMAL
  94.  
  95. # CONVERTENDO BIN PARA INT
  96. def binInt(self, numberBin):
  97. return int(numberBin, 2)
  98.  
  99. # MONTANDO E CONVERTENDO O NÚMERO IEEE PARA DECIMAL
  100. def ieeeDecimal(self):
  101. # SINAL
  102. sinal = self._ieee754[0]
  103. # PEGANDO O EXPOENTE
  104. expoente = self.binInt(self._ieee754[1:9]) - 127
  105. # O NÚMERO EM BINÁRIO SEM SINAL E EXPOENTE
  106. number = '1' + self._ieee754[9:]
  107. # VALOR DO NÚMERO ANTES DO PONTO EM DECIMAL
  108. primeiroValor = int(number[0:expoente + 1], 2)
  109. # VALOR DO NÚMERO DEPOIS DA VIRGULA EM ieee754
  110. segundoValor = '0' + number[expoente + 1:]
  111.  
  112. decimal = 0
  113. count = 0
  114. while(count < len(segundoValor)):
  115. decimal += int(segundoValor[count]) * 2 ** (count * - 1)
  116. count += 1
  117. segundovalor = str(decimal)[1:]
  118.  
  119. # VERIFICANDO O SINAL E RETORNANDO NEGATIVO OU POSITIVO
  120. if int(sinal) == 1:
  121. return float('-' + str(primeiroValor) + segundovalor)
  122. return float(str(primeiroValor) + segundovalor)
  123.  
  124.  
  125. print('{} i3Braulio754 {}\n###### Press Enter to exit ######\n{}'.format(
  126. '#' * 10, '#' * 9, '#' * 33))
  127.  
  128. while True:
  129. value = input('Enter IEEE754 or Decimal number: ')
  130. if value == '':
  131. print('Bye!')
  132. break
  133. run = i3Braulio754(value)
  134. if run._conversion == 'ieee':
  135. print('\nEntrada: {}\nValor armazenado em float: {}\n'.format(
  136. value, run.ieeeDecimal()))
  137. elif run._conversion == 'decimal':
  138. print('\nEntrada: {}\ni3Braulio754: {}\n'.format(value, run.binIeee()))
Add Comment
Please, Sign In to add comment