web-dev-qa-db-ja.com

BCでのフロート操作?

Bcはfloat演算をサポートしていないようです。_echo 1/8 | bc_を実行すると、ゼロが取得されます。

私はbc (1)をチェックしましたが、floatについてさえ言及していないので、サポートされているのでしょうか?

44
daisy

bcは浮動小数点を実行しませんが、固定精度の10進数を実行します。 Haukeが言及する-lフラグは、たとえば、数学ライブラリをロードします。関数をトリガーしますが、それはまた意味します

[...]デフォルトscaleは20です

scaleは、manページに記載されている「特殊変数」の1つです。あなたはそれを設定することができます:

scale=4

いつでも(-lを使用したかどうかにかかわらず)。 10進数で使用される有効桁数を指します。つまり、後続のソリューションは、小数点以下の桁数に丸められます(==固定精度)。

デフォルトのスケールsans -lは0で、整数に丸められます。

57
goldilocks

マニュアルページは言う:

-lオプションを指定してbcを呼び出すと、数学ライブラリがプリロードされます[...]

それの理解可能性は確かに改善される可能性があります...

30
Hauke Laging

私がする時 echo 1/8 | bcゼロになります。

はい、デフォルトでは、スケールの値(小数点以下の桁数)はゼロ(0)です。その場合、bcは任意の精度の計算を実行しますが、ドットの後に数値はありません。

$ echo 234^34 | bc
35755195084527581333820034812187200823956346053610939764649481375776\
5274080116736

つまり、整数の任意精度演算です。

変数scaleの値を変更することにより、小数点以下の桁数を変更できます。

$ echo 'scale=3; 1/8' | bc 
.125

$ echo 'scale=27; 1/8' | bc 
.125000000000000000000000000

Bcはfloat演算をサポートしていないようです

いいえ、bcには浮動小数点の概念がありません( IEEE-754で定義されているように 少なくとも)。

Bcが行うのは、10進分数(小数点以下の桁数が有限)の任意精度の計算です。

小数点記号の後の桁数は、変数scaleによって設定されます。

$ echo 'scale=5; sqrt(2)' | bc
1.41421

$ echo 'scale=35; sqrt(2)' | bc
1.41421356237309504880168872420969807

関数sqrtは基本であり、デフォルトのbcの一部です。
他のいくつかの関数(log、sen、cos、atanなど)はbc -l

   s (x)    The sine of x, x is in radians.
   c (x)    The cosine of x, x is in radians.
   a (x)    The arctangent of x, arctangent returns radians.
   l (x)    The natural logarithm of x.
   e (x)    The exponential function of raising e to the value x.
   j (n,x)  The Bessel function of integer order n of x.

また、スケールを20に設定します(開始後に変更できます)。

そう:

$ echo '1/8' | /bin/bc -l
.12500000000000000000
1
Isaac

1)bcの数値にはスケールがあります。数値のスケールとスケール係数を混同しないでください。同じ世界の「スケール」は、数値のスケールを照会する関数として、またはスケール係数を設定するパラメーターとして使用されます。

echo "scale=scale(1.1);11/10" | bc will return 1.1

2)スケール係数は、操作を行うときに小数点の右側に何桁を保持するかを決定します。 sが現在のスケールファクター、saが最初のオペランドaのスケール、sbが2番目のオペランドbのスケールである場合、結果は次のように切り捨てられます。

    scale of result
a+b     max(sa,sb)
a-b     max(sa,sb)
a*b     min(sa+sb , max(s,sa,sb))
a/b     s
a%b     so that a = b*quotient + remainder; remainder has sign of a
a^b     min(sa×|b|, max(s,sa)); b must be integer
sqrt(a) max(s,sa)

3)元々、bcはdcのプリプロセッサでした。現在、多くのシステムでは、bcはスタンドアロンプ​​ログラムです。

ソース: https://plan9.io/magic/man2html/1/dc

0
cd9