如何使用dc将小数十进制数转换为小数二进制数

时间:2010-08-28 04:04:32

标签: binary dc

所以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 个答案:

答案 0 :(得分:1)

奇怪。我的第一个想法是,精度可能仅适用于计算,而不适用于转换。但它只适用于除法,而不是加法,减法或乘法:

回声“2o10k 0.3 1 / p”|直流

.0100110011001100110011001100110011

echo“2o10k 0.3 0 + p”|直流

0.0100

echo“2o10k 0.3 0 - p”|直流

0.0100

echo“2o10k 0.3 1 * p”|直流

0.0100

对于精度,手册页说“无论当前输入或输出基数如何,精度始终以十进制数字表示。”这就解释了为什么输出(当你得到它)是33位有效位。

答案 1 :(得分:1)

似乎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的行为完全符合预期。

所以解决方案是在输入中使用正确数量的有效数字,或者使用除法形式dc -e "2o10k 3 10 / p"