Как преобразовать дробные десятичные числа в дробные двоичные числа с помощью постоянного тока
Таким образом, dc - отличный инструмент для конвертации между базами, который удобен для тех задач, в которых используется битовое кодирование. Например, чтобы преобразовать 1078 в двоичный файл, я могу сделать это:
bash> echo "2o1078p" | dc
10000110110
Однако я не могу заставить его печатать дроби между 0 и 1 правильно. Попытка преобразовать 0.3 в двоичный файл:
bash> echo "2o10k 0.3p" | dc
.0100
Но 0,0100(bin) = 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 ответа
Кажется, что dc получает количество значащих цифр из входных данных.
Сейчас 1/log10(2)=3.32
поэтому каждая десятичная значащая цифра составляет 3,3 двоичные цифры. Глядя на вывод dc для переменной длины входного 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 ведет себя точно так, как ожидалось.
Таким образом, решение состоит в том, чтобы использовать правильное количество значащих цифр в форме ввода или в форме деления dc -e "2o10k 3 10 / p"
Странный. Моей первой мыслью было, что, возможно, точность применима только к вычислениям, а не к преобразованиям. Но тогда это работает только для деления, а не сложения, вычитания или умножения:
эхо "2o10k 0,3 1 / р" | Округ Колумбия
.0100110011001100110011001100110011
эхо "2о10к 0,3 0 + р" | Округ Колумбия
0,0100
эхо "2o10k 0,3 0 - р" | Округ Колумбия
0,0100
эхо "2o10k 0.3 1 * p" | Округ Колумбия
0,0100
Что касается точности, на странице руководства написано: "Точность всегда измеряется десятичными цифрами, независимо от текущего значения входного или выходного радиуса". Это объясняет, почему вывод (когда вы его получаете) составляет 33 значащих бита.