Bash浮点计算问题

时间:2014-09-04 19:58:36

标签: bash unix decimal

我尝试了许多不同的方法来评估下面的混乱作为浮动。我想我几乎都在使用bc,但它还没有评估。

s=$((($s+((${flowx[$(($a+1))]}-(${flowx[$a]}))*(${flowy[$(($a+1))]}+${flowy[$a]}))/2) | bc))

任何输入?

3 个答案:

答案 0 :(得分:3)

根本不使用$(( ))

例如,参与计算的相关部分:

s=$(bc <<<"$s + ( ( ${flowx[a+1]} - ${flowx[a]} ) * ( ${flowy[a+1]} + ${flowy[a]} ) ) / 2")

只要flowxflowy是标准的整数索引数组而不是关联数组,您甚至不需要在索引它们时使用$(( ))(或{ {1}}这些索引中的运算符),因为bash中非关联数组的索引是默认的数学上下文。

或者,比所有这些嵌套的parens更可读,使用$(这里配置了10位精度):

dc

请参阅? 很多更具可读性。

答案 1 :(得分:1)

如果您使用hereline而不是heredoc(因为@CharlesDuffy在其他很好的答案推荐中),您可以避免使用所有引号和类似内容:

flowx=(0.124852 -0.0156593 -0.0932662 -0.0464323 0.0305706 0.00833429 0.0245359 0.0292034 -0.0564935)
flowy=(0.197532 0.120311 0.0864692 -0.0071995 0.097294 0.0624036 0.0825287 0 0.0340206)
a=1
s=0.1

res=$(bc -l <<EOF
$s + ( ( ${flowx[a+1]} - ${flowx[a]} ) * ( ${flowy[a+1]} + ${flowy[a]} ) ) / 2
EOF
)
echo "$res"

打印

.09197621484831000000

答案 2 :(得分:0)

如果您的系统上安装了ksh93,我建议您使用它代替bash执行此任务。它内置支持64位IEEE浮点。