Shell

bc 的浮點運算不精確?

  • May 3, 2016

當我使用 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。

您需要了解 中表達式的刻度的含義bcbc可以做任意精度(這不一定意味著無限精度),而您的計算器可能具有處理器的float或數據類型的精度。double

bc. 刻度是點後的小數位數,因此與精度有關。表達式的比例是根據規則確定的,這些規則取決於涉及的運算符和scale變數(該變數是給出精度任意維度的變數,即可以使其精度盡可能大)。bc

例如,除法結果的比例是scale。所以4/3scale是 2時1.33,是一個非常粗略的近似值4/3。的規模x * y將是min(a+b,max(scale,a,b))(哪裡a是規模xb規模y),所以在這裡21.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

引用自:https://unix.stackexchange.com/questions/280580