我已经尝试了很多不同的方式来评估下面的混乱作为一个浮点数。我想我几乎在使用bc,但它仍然没有评估。Bash浮点计算问题
s=$((($s+((${flowx[$(($a+1))]}-(${flowx[$a]}))*(${flowy[$(($a+1))]}+${flowy[$a]}))/2) | bc))
任何输入?
我已经尝试了很多不同的方式来评估下面的混乱作为一个浮点数。我想我几乎在使用bc,但它仍然没有评估。Bash浮点计算问题
s=$((($s+((${flowx[$(($a+1))]}-(${flowx[$a]}))*(${flowy[$(($a+1))]}+${flowy[$a]}))/2) | bc))
任何输入?
你能避免所有的报价和这样的事情,如果你代替hereline
(如@CharlesDuffy在反之则大答案建议)将使用heredoc
像:
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
工作正常!谢谢你们的帮助。我对这一切都比较陌生,所以我对缺乏信息表示歉意。谢谢你的耐心! – 2014-09-04 20:37:12
根本不要使用$(())
。
例如,把你计算的相关部分:
s=$(bc <<<"$s + ((${flowx[a+1]} - ${flowx[a]}) * (${flowy[a+1]} + ${flowy[a]}))/2")
只要flowx
和flowy
是标准的整数索引的数组而非关联数组,你甚至不需要使用$(())
索引时(或这些索引中的$
运算符),因为默认情况下,bash中的非关联数组的索引是数学上下文。
或者,其可读性比所有这些嵌套的括号,使用dc
(在这里,10位精度配置):
s=$(dc <<EOF
10 k
${flowx[a+1]}
${flowx[a]}
-
${flowy[a+1]}
${flowy[a]}
+
*
$s +
2/
p
EOF
)
看到了吗? 很多更具可读性。
我的数组是标准的整数索引。使用你写的,它给了我这个错误:(standard_in)1:语法错误 你知道这可能是从什么? – 2014-09-04 20:12:38
首先,'<<<'是一种双击 - 如果你使用'/ bin/sh'而不是bash,那么就有可能出现错误。除此之外,将'bc <<<'更改为'echo'并手动检查扩展 - 这是非常规的,而不是可以测试的东西,因为您没有提供数组的样本'值&c。足以对任何提议的解决方案进行测试。 – 2014-09-04 20:14:41
@CharlesDuffy在'bc'行中将'flowax'改成'flowx' ...;} – jm666 2014-09-04 20:21:44
如果你的系统上安装了ksh93,我建议你使用它来代替bash来完成这个任务。它内置了对64位IEEE浮点的支持。
BashFAQ#22是你的朋友 - http://mywiki.wooledge.org/BashFAQ/022 - 但它告诉你只使用'bc',这......呃,是的。使用'bc',不要使用'$(())'。既然你已经知道'bc'存在,并且它可以做浮点数学,那么这是一个问题呢? – 2014-09-04 20:01:22
你能提供一个你正在运行的数字的例子吗?无论如何,你想要达到什么目标? – lxg 2014-09-04 20:01:52
你考虑过使用awk/perl/python/ruby吗? – dawg 2014-09-04 20:03:28