0

所以 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
...
4

2 回答 2

1

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

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

.0100110011001100110011001100110011

回声“2o10k 0.3 0 + p”| 直流

.0100

回声“2o10k 0.3 0 - p”| 直流

.0100

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

.0100

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

于 2010-08-28T20:01:57.737 回答
1

似乎 dc 正在从输入中获取有效数字的数量。

现在1/log10(2)=3.32,每个十进制有效数字是 3.3 个二进制数字。查看不同输入 SF 长度的 dc 输出显示:

`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"

于 2014-09-30T07:46:03.587 回答