我已經嘗試了很多不同的方式來評估下面的混亂作爲一個浮點數。我想我幾乎在使用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