7

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

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

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

4

3 回答 3

26

不是错误。

一旦ibase=6被解释,数字就会以 6 为基数读取。因此ibase=6;obase=16使 obase 的值为 16 base 6这是无效的,并被解释为 11 decimal

从手册页:

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

所以 16 被解释为 15 base 6即 11 decimal。并且转换是正确的。

obase之前设置ibase,或者确保在 base 中指定你的 obase ibase

$ echo "obase=16;ibase=6;512" | bc
BC
于 2012-03-27T13:08:26.337 回答
5

请参阅http://docstore.mik.ua/orelly/unix/upt/ch49_03.htm

设置ibaseorobase时,以 的当前基数表示ibase。如果要以十进制表示,请在设置obase之前设置。ibaseobase

另见http://www.gnu.org/software/bc/manual/html_mono/bc.html#SEC9

输入数字可能包含字符 0-9 和 AF。(注意:它们必须是大写字母。小写字母是变量名。)无论 ibase 的值如何,单个数字始终具有该数字的值。(即 A = 10。)对于多位数字,bc 将所有大于或等于 ibase 的输入数字更改为 ibase-1 的值。这使得数字 FFF 始终是输入基数的最大 3 位数字。

所以对于obase=16in ibase=66变成 a 5,它等价于 decimal 的输出基数6 * 1 + 1 * 5 == 11,因此:

$ echo "obase=11;ibase=6;512" | bc
161
于 2012-03-27T13:07:37.997 回答
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
于 2018-05-12T05:58:58.857 回答