使用 bc 进行浮点运算?

dai*_*isy 52 bc

看起来 bc 不支持浮点运算,当我这样做时,echo 1/8 | bc它会得到零。

我查过bc (1),但它甚至没有提到float,所以我想知道它是否受支持?

gol*_*cks 72

bc不做浮点,但它做固定精度的十进制数。-lHauke 提到的标志加载了一个数学库,例如。触发功能,但它也意味着

[...] 默认比例为 20

scale是手册页中提到的许多“特殊变量”之一。你可以设置它:

scale=4
Run Code Online (Sandbox Code Playgroud)

随时随地(无论是否-l使用)。它指的是十进制中使用的有效数字的位数。换句话说,后续解决方案将四舍五入到小数点后的位数(== 固定精度)。

默认比例 sans-l为 0,表示四舍五入为整数。


Hau*_*ing 35

手册页说:

如果使用 -l 选项调用 bc,则会预加载数学库 [...]

可以提高可理解性,确实......

  • 将其作为错误向上游报告... (14认同)

ImH*_*ere 5

当我这样做时,我echo 1/8 | bc得到一个零。

是的,默认情况下,scale 的值(小数位数)为零 (0),在这种情况下,bc仍然进行任意精度数学运算,但点后没有数字。

$ echo 234^34 | bc
35755195084527581333820034812187200823956346053610939764649481375776\
5274080116736
Run Code Online (Sandbox Code Playgroud)

即:整数任意精度数学。

通过更改变量scale的值,可以更改小数位数:

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

$ echo 'scale=27; 1/8' | bc 
.125000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

看起来 bc 不支持浮点运算

不, bc 没有浮点数的概念(至少在 IEEE-754定义)。

bc 所做的是小数部分的任意精度数学运算(有限的小数位数,小数点分隔符后的位数)。

小数点分隔符后的位数由变量设置scale

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

$ echo 'scale=35; sqrt(2)' | bc
1.41421356237309504880168872420969807
Run Code Online (Sandbox Code Playgroud)

该功能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.
Run Code Online (Sandbox Code Playgroud)

这也将比例设置为 20(可以在启动后更改)。

所以:

$ echo '1/8' | /bin/bc -l
.12500000000000000000
Run Code Online (Sandbox Code Playgroud)