2014-09-04 100 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浮點的支持。