Двоичное представление малых значений с плавающей запятой в Python - PullRequest
0 голосов
/ 23 апреля 2020

Как я могу преобразовать небольшие значения с плавающей точкой, такие как 1.942890293094024e-15 или 2.8665157186802404e-07 в двоичные значения в Python?

Я пытался Решение GeeksforGeek , однако, оно не работает для таких малых значений (я получаю эту ошибку: ValueError: недопустимый литерал для int () с основанием 10: '1.942890293094024e-15' ).

Код выглядит так:

def float_bin(number, places = 3): 

    # split() seperates whole number and decimal  
    # part and stores it in two seperate variables 
    whole, dec = str(number).split(".") 

    # Convert both whole number and decimal   
    # part from string type to integer type 
    whole = int(whole) 
    dec = int (dec) 

    # Convert the whole number part to it's 
    # respective binary form and remove the 
    # "0b" from it. 
    res = bin(whole).lstrip("0b") + "."

    # Iterate the number of times, we want 
    # the number of decimal places to be 
    for x in range(places): 

        # Multiply the decimal value by 2  
        # and seperate the whole number part 
        # and decimal part 
        whole, dec = str((decimal_converter(dec)) * 2).split(".") 

        # Convert the decimal part 
        # to integer again 
        dec = int(dec) 

        # Keep adding the integer parts  
        # receive to the result variable 
        res += whole 

    return res 


# Function converts the value passed as 
# parameter to it's decimal representation 
def decimal_converter(num):  
  while num > 1: 
      num /= 10
  return num 

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

После некоторой консультации я нашел хороший фрагмент кода , который решает мою проблему. Мне просто нужно было применить к нему несколько небольших настроек (сделать это функцией, удалить автоматические c запросы на ввод и т. Д. c.).

Огромное спасибо @kartoon!

0 голосов
/ 23 апреля 2020

Я вижу одну проблему с str(number).split("."). До этого я добавил простой хак: number = "{:30f}".format(number), чтобы не было e в номере. Хотя я не уверен, что результат правильный.

...