所以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
...
答案 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"