linux命令行计算器bc的一个“坑”

【转载自】http://blog.chinaunix.net/uid-174325-id-3518953.html

结论:ibase,obase可以使用在不同的计算公式里,但是尽量把obase放ibase前,不然obase的设置值也会以ibase来计算,会导致一些理解上和使用上的偏差

想计算一个数值,使用bc 可以使用 echo " xxx+yyy"|bc 这样来用
$echo "111+222"|bc
333

$

如果输入的是16进制数字的话可以使用ibase参数来设置:
$echo "ibase=16;111+222"|bc
819
$

如果想让输出也显示16进制怎么办哪,一般人会想当然的设置obase参数,如下:
$echo "ibase=16; obase=16; 111+222"|bc
怎么样?!!如果你也是这样想的话,你也我和一样掉坑里面了。看下输出是啥
$echo "ibase=16; obase=16; 111+222"|bc
 01 15 05
$

kao, so tmd why???? 应该显示333啊

后来在测试中发现如果把 obase放在ibase前面的话就正常了:
$echo "obase=16; ibase=16; 111+222"|bc
333
$

这又是so tmd why? 难道是bug,我当时也是这么想的.

但在google之 之后,发现我们现在有时还是 too young,too simple, sometimes naive.
bc 在gnu世界这么多年如果还存在这种bug的话也太那个啦!

http://stackoverflow.com还是个神圣的地方,啥问题都有人回答。
http://stackoverflow.com/questions/9889839/bc-and-its-ibase-obase-options 参看这个链接。

原来ibase如果放在最前面的话,后面所有的输入都回被认为是16进制的,包括obase,所以上面ibase=16;
obase=16 中的obase其实被设置为了10 进制中的22,而bc在obase大于16以后就会用多字节表示:
1*22*22+15*22+5 = 819 一点错都没有。

总之,一句话先设置obase,在设置ibase就没错。


好吧,我承认自己naive!

(另外stackoverflow.com上面提到的是另外一个坑:
         For multi-digit numbers, bc changes all input digits greater or equal to ibase to the value of ibase-1.


发篇博文,提醒同道, “坑贫道不坑道友” !!!!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。