BC及其ibase/obase选项:

7

我发现了一个奇怪的错误:

我试图将“512”作为6进制数读取,并将其输出为16进制数:

echo "ibase=6;obase=16;512" | bc
161

如您所见,输出结果为161,但应该是bc(错别字!)。我尝试使用十进制:

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

我应该提交一个错误报告吗,还是我错过了显而易见的事情?我真的不敢相信这样一个基本的工具是坏的。

3个回答

26

并非bug。

一旦解释ibase=6,数字将以六进制读取。因此ibase=6;obase=16使得obase的值为16base 6,这是无效的,并被解释为11十进制

从手册中可以看到:

对于多位数,bc会将所有大于或等于ibase的输入数字改为值ibase-1。

因此,16被解释为15base 6,它是11decimal。转换是正确的。

在设置ibase之前设置obase,或者确保以基于ibase的底数指定obase

$ echo "obase=16;ibase=6;512" | bc
BC

5
请查看http://docstore.mik.ua/orelly/unix/upt/ch49_03.htm
当你设置ibaseobase时,它是基于当前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始终是输入基数下最大的三位数。
因此,在ibase=6中使用obase=16,则6变为5,相当于输出基数为十进制6 * 1 + 1 * 5 == 11,因此:
$ echo "obase=11;ibase=6;512" | bc
161

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;

在Bash沙盒中执行

两种方式的结果如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接