BC —自动全精度乘法


10

高,我需要测试我的任意精度计算器,并且bc看起来像是一个不错的准绳,但是,bc它确实将每个乘法的结果截断为似乎每个所涉及的操作数的最大标度。

有没有一种快速的方法可以将其关闭,或将每个乘法的小数位数自动设置为因子的小数位数之和,以免损失任何精度?

如果您对此解决方案有一个更优雅的解决方案,而不是bc,请与我分享。

例:

$ bc <<< '1.5 * 1.5'
2.2

真正的答案是2.25。


使用bc进行浮动操作密切相关吗?
manatwork 2013年

Answers:


12

您可以bc使用scale=<#>参数控制输出的比例。

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

使用您的示例:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

您还可以使用-l开关(感谢@manatwork),它将把比例尺初始化为20,而不是默认的0。例如:

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

您可以scalebc手册页中了解更多信息。


5
或更短:bc -l。“ -l (字母ell。)定义数学函数并将小数bc
位数

@manatwork-谢谢,没有注意到该切换。
slm

谢谢。我想我可以将小数位设置为2147483647(恰好等于INT_MAX),bc告诉我是我可以设置的最大小数位值(我在测试中就这么远了),但是我猜我只会用整数测试它,并为bc提供使用动态长度数字带来的性能优势。
PSkocik

1
对于BC相乘,结果的规模正是min(max(sx,sy,scale),sx+sy)在那里sxsy是的尺度xyx*y。设置scale=scale(x)+scale(y)将提供所需的最大精度。将小数位数设置为更高的数字(例如1000)不会增加结果的小数位数。scale变量仅直接影响s,scale=1000; a/1无论a之前的小数位数是多少,除法的结果都会创建一个带有1000个十进制数字(点后)的结果。
艾萨克

1

尝试这个 :

$ bc
scale=10
1.5 * 1.5
2.25

在BC的男人中搜索比例变量


0

我创建了此bash函数,该函数将不显示尾随零

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

示例:calc 1.25^3= 1.953125

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.