2010-08-28 7 views
0

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

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 
... 
+0

Быстрый взгляд на источник показывает, что нет ни одного Radix испытания в составе 1.06 и что он пытается выполнить определение POSIX dc, которое, вероятно, является пессимистичным. Учитывая, что неправильный 1t получает '3/10', я бы не стал ему доверять вообще для этих вычислений. – msw

+0

Вместо того, чтобы отражать выражение в трубе, предпочтительным способом является просто использовать параметр выражения dc, например. 'dc -e" 2o10k 3 10/p "' – FloHimself

ответ

0

Кажется, что 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

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

echo "2o10k 0.3 1/p" | постоянного тока

.0100110011001100110011001100110011

эхо "2o10k 0,3 0 + р" | постоянного тока

.0100

эхо "2o10k 0,3 0 - р" | постоянного тока

.0100

эхо "2o10k 0,3 1 * р" | постоянный ток

.0100

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

+0

Интересно, что «2o10k 0.3000 p» работает нормально тоже .. так что что-то смешное происходит с номером s.f. когда в базе, отличной от 10. –

 Смежные вопросы

  • Нет связанных вопросов^_^