[20190929]bash使用bc計算的相關問題.txt

lfree發表於2019-10-04

[20190929]bash使用bc計算的相關問題.txt

--//快放假沒什麼事情,使用bash寫一些小程式,轉化number到oracle number編碼,使用bc計算功能,發現一些小問題
--//做一些記錄:

1.bc顯示小數點前的0:

$ echo "scale=3; 1/3" | bc
.333

--//很明顯如果結果是0.xxxxx,bc的計算結果前面的0不顯示。
--//可以在網上找到一些方法:
res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`)

--//另外bc是高精度的計算器,可能小數點位數很多,上面的printf不行。
--//可以採用連線的方式,僅僅先判斷第一個字元是否是"."就ok了(當然時正數的情況下)。

2.四捨五入問題:
# echo "scale=3; 2/3" | bc
.666

--//運算不做四捨五入。

3.scale設定無效的問題:

# echo  "scale=0 ; (0.01+193)" | bc
193.01

--//我想取整,結果輸出193.01.導致設定scale=0無效,似乎+,-,*運算都不起作用,僅僅/可以控制這種行為。
# echo  "scale=0 ; (0.01+193)*1" | bc
193.01

# echo  "scale=0 ; (0.01+193)/1" | bc
193

4.輸出折行問題。
# echo 2^250 | bc
18092513943330655534932966407607485602073435104006338131165247501236\
42650624

--//如果計算超過68個字元,會出現折行情況,當然這是正常的,加入tr過濾ok。
# echo 2^250 | bc | tr -d '\n\\\r'

--//另外我在window下使用cygwin ,輸出裡面有"\r"字元.透過例子說明:
$ cat aa.sh
#! /bin/bash
set -x
a=$(echo 5+4 | bc )
echo "$a"
echo $a
set +x

$ ./aa.sh
++ echo 5+4
++ bc
+ a=$'9\r'
+ echo $'9\r'
9
+ echo $'9\r'
9
+ set +x

--//你可以發現在windows下bc的輸出多了1個\r字元.必須過濾掉.估計linux下沒有這個問題.
--//另外注意一個小問題,就是要儲存檔案格式為unix的檔案格式.

5.計算精度問題:
# echo "l(.99999999999999999999)/l(100)" | bc -l
0

--//bc -l 預設的scale=12,必須改變scale設定。
# echo "scale=66;l(.99999999999999999999)/l(100)" | bc -l
-.000000000000000000002171472409516259138266501956630606707163335634

--//有一些情況即使設定很高精度反而出現問題,例子:
> bc -l
scale=180
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(100)
-65.0000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
000000000000000000000248123508996454719162468354

--//這個正常輸出-65.

l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
0000000000000000000000496247017992909438324936737

scale=20
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.00000000000000000044
scale=10
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.0000000052
scale=4
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.0047

--//當你限制scale過小時,反而誤差更大。

scale=400
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000171086395582297672322451960

6.bc不支援科學計數法(科學計數法):
# echo "1e2" | bc
(standard_in) 1: parse error

7.另外我發現bash程式設計能不用bc儘量不用,能不載入math庫,儘量不要載入。
--//最後我發現我寫出來的轉化程式number到oracle number編碼執行不是很快,我是在windows下使用cygwin除錯的。基本上轉化1個大
--//約接近2秒,我只能考慮別的方式儘可能減少bc使用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2658886/,如需轉載,請註明出處,否則將追究法律責任。

相關文章