как преобразовать дробные десятичные числа в дробные двоичные числа с помощью постоянного тока - PullRequest
0 голосов
/ 28 августа 2010

Таким образом, dc - отличный инструмент для конвертации между базами, который удобен для тех задач, где нужно немного переворачивать код. например, чтобы преобразовать 1078 в двоичный файл, я могу сделать это:

bash> echo "2o1078p" | dc
10000110110

Однако я не могу заставить его правильно печатать дроби от 0 до 1. Попытка преобразовать 0.3 в двоичный файл:

bash> echo "2o10k 0.3p" | dc
.0100

Но 0,0100 (корзина) = 0,25, а не 0,3.

Однако, если я создаю значение вручную, я получаю правильный ответ

bash> echo "2o10k 3 10 / p" | dc
.0100110011001100110011001100110011

Ну, похоже, это дает мне больше, чем 10 значащих цифр, которые я прошу, но это нормально

Я что-то не так делаю? Или я пытаюсь заставить dc делать то, чего не умеет?

bash> dc --version
dc (GNU bc 1.06) 1.3
...

Ответы [ 2 ]

1 голос
/ 30 сентября 2014

Похоже, что dc получает количество значащих цифр из входных данных.

Теперь 1/log10(2)=3.32, поэтому каждая десятичная значащая цифра равна 3,3 двоичных цифр.Глядя на выходной сигнал постоянного тока для переменных длин входного SF, вы увидите:

`dc -e "2o10k 0.3 p"` => .0100
`dc -e "2o10k 0.30 p"` => .0100110
`dc -e "2o10k 0.300 p"` => .0100110011
`dc -e "2o10k 0.3000 p"` => .01001100110011

Таблица этих значений и ожидаемого значения ceil(log10(2)*SFinput) выглядит следующим образом:

input : output : expected output
1     : 4      : 4
2     : 7      : 7 
3     : 10     : 10 
4     : 14     : 14

И постоянный ток равенведет себя точно так, как ожидалось.

Таким образом, решение состоит в том, чтобы либо использовать правильное количество значащих цифр во входных данных, либо в форме деления dc -e "2o10k 3 10 / p"

1 голос
/ 29 августа 2010

Странно.Моей первой мыслью было, что, возможно, точность относится только к вычислениям, а не к преобразованиям.Но тогда это работает только для деления, а не сложения, вычитания или умножения:

echo "2o10k 0.3 1 / p" |dc

.0100110011001100110011001100110011

echo "2o10k 0.3 0 + p" |dc

.0100

эхо "2o10k 0,3 0 - p" |dc

.0100

эхо "2o10k 0.3 1 * p" |dc

.0100

Что касается точности, на странице руководства написано: «Точность всегда измеряется десятичными цифрами, независимо от текущего значения входного или выходного радиуса».Это объясняет, почему вывод (когда вы его получаете) составляет 33 значащих бита.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...