Shell
bc 的浮點運算不精確?
當我使用 bc 在 shell 中執行浮點運算時,如果我使用正常計算器,結果是不一樣的。難道我做錯了什麼?
例如,我需要找到一個球體的體積。使用者輸入半徑值。
pi = 3.14 volume=$(echo "scale = 2; (4 / 3) * $pi * ($r ^ 3)" | bc) echo "Volume is $volume"
如果半徑 = 3,unix 返回 112.59,計算器返回 113.1。
您需要了解 中表達式的刻度的含義
bc
。bc
可以做任意精度(這不一定意味著無限精度),而您的計算器可能具有處理器的float
或數據類型的精度。double
在
bc
. 刻度是點後的小數位數,因此與精度有關。表達式的比例是根據規則確定的,這些規則取決於涉及的運算符和scale
變數(該變數是給出精度的任意維度的變數,即可以使其精度盡可能大)。bc
例如,除法結果的比例是
scale
。所以4/3
當scale
是 2時1.33
,是一個非常粗略的近似值4/3
。的規模x * y
將是min(a+b,max(scale,a,b))
(哪裡a
是規模x
和b
規模y
),所以在這裡2
。1.33 * 3.14
也會如此4.17
。對於規則,您可以檢查POSIX 規範
bc
。如果您想要更高的精度,請增加
scale
. 你可以無限增加它。使用bc -l
,scale
自動設置為20
。$ pi='(a(1)*4)' r=3 $ $ echo "(4 / 3) * $pi * ($r ^ 3)" | bc -l 113.09733552923255658339 $ echo "scale=1000; (4 / 3) * $pi * ($r ^ 3)" | bc -l 113.0973355292325565846551617980621038310980983775038095550980053230\ 81390626303523950609253712316214447357331114478163039295378405943820\ 96034211293869262532022821022769726978675980014720642616237749375071\ 94371951239736040606251233364163241939497632687292433484092445725499\ 76355759335682169861368969085854085132237827361174295734753154661853\ 14730175311724413325296040789909975753679476982929026989441793959006\ 17331673453103113187002257495740245517842677306806456786589844246678\ 87098096084205774588430168674012241047863639151096770218070228090538\ 86527847499397329973941181834655436308584829346483609858475202045257\ 72294881898002877683392804259302509384339728638724440983234852757850\ 73357828522068813321247512718420036644790591105239053753290671891767\ 15857867345960859999994142720979823815034238137946746942088054039248\ 86988951308030971204086612694295227741563601129621951039171511955017\ 31142218396089302929537125655435196874321744263099764736353375070480\ 1468800991581641650380680694035580030527317911271523 $ echo "scale=1; (4 / 3) * $pi * ($r ^ 3)" | bc -l 97.2
您還可以使用 high 進行所有計算
scale
,並最終將其減少以進行顯示:$ echo "scale=10; (4 / 3) * $pi * ($r ^ 3)" | bc -l 113.0973355107 $ echo "scale=100; x = (4 / 3) * $pi * ($r ^ 3); scale = 10; x / 1" | bc -l 113.0973355292