bc及其ibase / obase选项:

时间:2012-03-27 12:50:09

标签: base bc

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

我尝试将“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

我应该提交错误报告,还是我会错过明显的错误报告?我真的不相信这样一个基本工具被打破了。

3 个答案:

答案 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

当您设置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始终是最大的3位数字输入库。

因此对于obase=16中的ibase=66变为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;

execute in bash sandbox

两种方式的结果是:

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