bc及其ibase/obase选项:

use*_*own 4 base bc

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

我尝试将"512"作为基数6读取,并将其输出为基数16:

echo "ibase=6;obase=16;512" | bc
161
Run Code Online (Sandbox Code Playgroud)

如您所见,输出为161,但它应该是bc(原文如此!).我尝试使用基数10:

echo "ibase=6;obase=10;512" | bc
512
Run Code Online (Sandbox Code Playgroud)

该值保持不变.好奇!默认obase是10.如果我省略它:

echo "ibase=6;512" | bc
188
Run Code Online (Sandbox Code Playgroud)

好吧,这似乎是正确的.在两步过程中,它有效:

echo "obase=16;"$(echo "ibase=6;512" | bc) | bc
BC
Run Code Online (Sandbox Code Playgroud)

所以我为不同的基础制作了一个剧本,但它让我感到困惑:

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
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*Mat 25

不是错误.

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

从手册页:

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

所以16被解释为15个基数6,即十进制 11 .转换是正确的.

设置obase之前ibase,或确保在基础中指定您的obase ibase.

$ echo "obase=16;ibase=6;512" | bc
BC
Run Code Online (Sandbox Code Playgroud)


Chr*_*röm 5

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

当您设置ibase或 时obase,它以 的当前基数表示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=6, the6变成了 a 5,它等价于 decimal 的输出基数6 * 1 + 1 * 5 == 11,因此:

$ echo "obase=11;ibase=6;512" | bc
161
Run Code Online (Sandbox Code Playgroud)