2014-09-04 164 views
0

我已经尝试了很多不同的方式来评估下面的混乱作为一个浮点数。我想我几乎在使用bc,但它仍然没有评估。Bash浮点计算问题

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

任何输入?

+2

BashFAQ#22是你的朋友 - http://mywiki.wooledge.org/BashFAQ/022 - 但它告诉你只使用'bc',这......呃,是的。使用'bc',不要使用'$(())'。既然你已经知道'bc'存在,并且它可以做浮点数学,那么这是一个问题呢? – 2014-09-04 20:01:22

+0

你能提供一个你正在运行的数字的例子吗?无论如何,你想要达到什么目标? – lxg 2014-09-04 20:01:52

+0

你考虑过使用awk/perl/python/ruby​​吗? – dawg 2014-09-04 20:03:28

回答

1

你能避免所有的报价和这样的事情,如果你代替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 
+0

工作正常!谢谢你们的帮助。我对这一切都比较陌生,所以我对缺乏信息表示歉意。谢谢你的耐心! – 2014-09-04 20:37:12

3

根本不要使用$(())

例如,把你计算的相关部分:

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

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

或者,其可读性比所有这些嵌套的括号,使用dc(在这里,10位精度配置):

s=$(dc <<EOF 
10 k 
${flowx[a+1]} 
${flowx[a]} 
- 
${flowy[a+1]} 
${flowy[a]} 
+ 
* 
$s + 
2/
p 
EOF 
) 

看到了吗? 很多更具可读性。

+0

我的数组是标准的整数索引。使用你写的,它给了我这个错误:(standard_in)1:语法错误 你知道这可能是从什么? – 2014-09-04 20:12:38

+0

首先,'<<<'是一种双击 - 如果你使用'/ bin/sh'而不是bash,那么就有可能出现错误。除此之外,将'bc <<<'更改为'echo'并手动检查扩展 - 这是非常规的,而不是可以测试的东西,因为您没有提供数组的样本'值&c。足以对任何提议的解决方案进行测试。 – 2014-09-04 20:14:41

+0

@CharlesDuffy在'bc'行中将'flowax'改成'flowx' ...;} – jm666 2014-09-04 20:21:44

0

如果你的系统上安装了ksh93,我建议你使用它来代替bash来完成这个任务。它内置了对64位IEEE浮点的支持。