我发现我偶然发现了一个奇怪的错误:
我尝试将"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)
见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)