我偶然发现了一个奇怪的错误:
我尝试将“512”读作基数为6的数字,并将其输出为基数16:
echo "ibase=6;obase=16;512" | bc
161
如您所见,输出为161,但应为bc
(原文如此!)。我试过基地10:
echo "ibase=6;obase=10;512" | bc
512
该值不变。好奇!默认obase是10.如果我省略它:
echo "ibase=6;512" | bc
188
嗯,这似乎是正确的。它分两步完成:
echo "obase=16;"$(echo "ibase=6;512" | bc) | bc
BC
所以我为不同的基础制作了一个剧本,但它让我感到困惑:
for ib in {6,8,10,16}; do echo $ib; for ob in {10,16}; do echo -en $ib $ob" \t => " ; echo "ibase=$ib;obase=$ob;333" | bc ; done; done;
6
6 10 => 333
6 16 => 108
8
8 10 => 333
8 16 => 119
10
10 10 => 333
10 16 => 14D
16
16 10 => 333
16 16 => 01 15 05
我应该提交错误报告,还是我会错过明显的错误报告?我真的不相信这样一个基本工具被打破了。
答案 0 :(得分:25)
不是错误。
只要解释ibase=6
,就会在基数6中读取数字。因此ibase=6;obase=16
使obase的值为16 base 6 ,这是无效的,并被解释为11 <子>小数子>
从手册页:
对于多位数字,bc将大于或等于ibase的所有输入数字更改为ibase-1的值。
因此16被解释为15 base 6 ,即11 decimal 。转换是正确的。
在obase
之前设置ibase
,或确保在基础ibase
中指定您的obase。
$ echo "obase=16;ibase=6;512" | bc
BC
答案 1 :(得分:3)
请参阅http://docstore.mik.ua/orelly/unix/upt/ch49_03.htm
当您设置ibase
或obase
时,它会以ibase
的当前基数表示。因此,如果您想以十进制表示obase
,请在设置ibase
之前设置obase
。
另见http://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC9
输入数字可能包含字符0-9和A-F。 (注意:它们必须是大写字母。小写字母是变量名。)无论ibase的值如何,单个数字的数字始终具有数字的值。 (即A = 10.)对于多位数字,bc将大于或等于ibase的所有输入数字更改为ibase-1的值。这使得数字FFF始终是最大的3位数字输入库。
因此对于obase=16
中的ibase=6
,6
变为5
,它相当于十进制6 * 1 + 1 * 5 == 11
的输出基数,因此:< / p>
$ echo "obase=11;ibase=6;512" | bc
161
答案 2 :(得分:0)
略微修改代码(两种方式)并显示您的预期结果:
for ib in {6,8,10,16}; do
echo $ib; for ob in {10,16}; do
echo -en $ib $ob" \t => " ;
ob=`echo "obase=$ib;$ob" | bc`
echo "ibase=$ib;obase=$ob;333" | bc ;
done;
done;
for ib in {6,8,10,16}; do
echo $ib; for ob in {10,16}; do
echo -en $ib $ob" \t => " ;
echo "obase=$ob;ibase=$ib;333" | bc ;
done;
done;
两种方式的结果是:
6
6 10 => 129
6 16 => 81
8
8 10 => 219
8 16 => DB
10
10 10 => 333
10 16 => 14D
16
16 10 => 819
16 16 => 333