我尝试了许多不同的方法来评估下面的混乱作为浮动。我想我几乎都在使用bc,但它还没有评估。
s=$((($s+((${flowx[$(($a+1))]}-(${flowx[$a]}))*(${flowy[$(($a+1))]}+${flowy[$a]}))/2) | bc))
任何输入?
答案 0 :(得分:3)
根本不使用$(( ))
。
例如,参与计算的相关部分:
s=$(bc <<<"$s + ( ( ${flowx[a+1]} - ${flowx[a]} ) * ( ${flowy[a+1]} + ${flowy[a]} ) ) / 2")
只要flowx
和flowy
是标准的整数索引数组而不是关联数组,您甚至不需要在索引它们时使用$(( ))
(或{ {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浮点。