• 【转载】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.


    发篇博文,提醒同道, “坑贫道不坑道友” !!!!
  • 相关阅读:
    aps.net 图形验证码(转)
    js浮点数计算问题 + 金额大写转换
    meta标签总结
    Asp.net Session 保存到MySql中
    css3实现边框圆角样式
    iOS开发之NSOperation & NSOperationQueue
    iOS开发之多线程
    iOS开发之Block
    iOS开发之核心动画(Core Animation)
    iOS开发之CALayer
  • 原文地址:https://www.cnblogs.com/vanishfan/p/4359120.html
Copyright © 2020-2023  润新知