Преобразование двоичной произвольной точности с плавающей запятой в любое основание

Предположим, у меня есть двоичная нотация с плавающей запятой (например, 1001.011101) с произвольной точностью 2 ^ (-n) после плавающей запятой, как я могу преобразовать ее в любую базу, скажем, троичную или десятичную.

Для целочисленной части существует алгоритм двойного мазка, с помощью которого можно преобразовать двоичное целое число к любой базовой системе. Но существует ли аналогичный метод (просто с использованием сдвига и добавления, без преобразования его в десятичный в качестве среды, потому что, если вы хотите сначала преобразовать его в десятичный, достаточно большая точность N вызовет переполнение) для двоичных с плавающей запятой?


person farmerzhang1    schedule 24.10.2020    source источник


Ответы (1)


Дана n битовая двоичная цифра, в которой m бит стоит после точки счисления/целого числа, преобразовать цифру в BCD, используя алгоритм двойного мазка. Включите дополнительный max(0, 4m-n бит) после (справа) исходных битов в алгоритме двойного мазка. Инициализируйте их нулем. Таким образом, после завершения алгоритма двойного мазка будет не менее 4m нулевых битов после результата BCD, что дает место для создания дробных цифр.

Затем разделите на 2m, выполнив следующие действия m раз:

  • Для каждой нечетной цифры BCD вычтите шесть из пяти битов, начиная с младшего бита этой цифры и переходя к следующей младшей цифре. Например, xxx1 0000 становится xxx0 1010, а xxx1 1001 становится xxx10011.
  • Сдвиньте все рабочее пространство на один бит вправо.

Это, по существу, переворачивает алгоритм двойного мазка: везде, где следующая старшая цифра является нечетной, 16, которые ее младший бит представляет в двоичном формате по отношению к следующей младшей цифре, корректируется до 10 по отношению к следующей младшей цифре, так что, когда битовый сдвиг выполняется, он имеет желаемый десятичный эффект.

Если 4m-n неотрицательно, результат скорректирован вправо в битах, представляя число с m двоично-десятичными цифрами после десятичная точка. Если 4mn отрицательное, результат начинается с n–4m битов справа.

person Eric Postpischil    schedule 24.10.2020