代码之家  ›  专栏  ›  技术社区  ›  Gordon

bash bcmath函数

  •  2
  • Gordon  · 技术社区  · 15 年前

    在bash脚本中,我有两个GNUBC函数。

    BC_CEIL="define ceil(x) { if (x>0) { if (x%1>0) return x+(1-(x%1)) else return x } else return -1*floor(-1*x) }\n"
    BC_FLOOR="define floor(x) { if (x>0) return x-(x%1) else return -1*ceil(-1*x) }\n"
    echo -e "scale=2"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc
    

    这两个功能在交互式BC中都可以正常工作。bc似乎不允许在一行上使用多个函数,但是,我必须在每个函数的末尾用换行符来回送-n_bc。上面的输出是2.5,不是我自己输入bc-i得到的预期的3.0。似乎bash为每一行echo输出调用bc,而不是将其全部回送到一个实例中。有什么解决办法吗?

    2 回复  |  直到 12 年前
        1
  •  2
  •   Dennis Williamson    15 年前

    刻度必须为零 x%1 工作。通常一个函数只能有一个返回。

    define ceil(x) { auto savescale; savescale = scale; scale = 0; if (x>0) { if (x%1>0) result = x+(1-(x%1)) else result = x } else result = -1*floor(-1*x);  scale = savescale; return result }
    define floor(x) { auto savescale; savescale = scale; scale = 0; if (x>0) result = x-(x%1) else result = -1*ceil(-1*x);  scale = savescale; return result }
    

    在scale语句后需要换行:

    echo -e "scale=2\n"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc
    
        2
  •  2
  •   Emil    12 年前

    我相信 1. 是不正确的。 这个 if() 比较需要 X >= 0 .

    我发现这个作品

    define ceil(x) {                         
        if (x >= 0) { if (x%1>0) return x+(1-(x%1)) else return x } 
        else return -1*floor(-1*x)               
    }
    define floor(x) {                        
        if (x >= 0) return x-(x%1)               
        else return -1*ceil(-1*x)                
    }