2010-04-28 54 views
2

我在Bash脚本中有两个用于GNU bc的函数。bash bcmath函数

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,而不是我得到的预期的3.0,如果我自己输入到bc -i中。似乎bash为每行echo输出调用bc,而不是将它全部回显到单个实例。有没有解决方法?

+2

我得到2.5交互。 – 2010-04-28 05:11:16

回答

2

要使0123,正常工作,该刻度需要为零。您通常应该只有一个函数返回。

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 } 

这需要一个换行符规模语句后:

echo -e "scale=2\n"$BC_CEIL$BC_FLOOR"ceil(2.5)" | bc 
+0

编辑复制粘贴的代码后,缺少缩放后的\ n错字。 在if/else块中,我发现不同的返回语句比在任意处写入并返回一次的变量更容易读取,但在这种情况下 - 因为必须重置比例 - 一次返回才有意义。 – Grod 2010-04-30 22:45:12

+1

@戈登:非常好。对我来说,'bc'没有内置或在其''-l'库中没有int()。 (或者这个问题的底限/上限。) – 2010-05-01 00:24:23

2

我相信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)     
}