数学计算中的Bash错误

时间:2015-04-27 11:49:03

标签: bash floating-point

我试图将一个序列值放入一个等式中,在bash脚本中输出2到12的输出,增量为0.5:

for i in $(seq 2 0.5 12);
do;
    r=$((4*pi^2/$i));
    echo "$r"  
done;

我收到此错误:

4*pi^2/2.0: syntax error: invalid arithmetic operator (error token is ".0")

6 个答案:

答案 0 :(得分:3)

要对您的数字序列执行浮点计算,您可以将seq的输出传递给awk

seq 2 0.5 12 | awk 'BEGIN{ pi = atan2(0, -1) }{ print 4 * pi^2 / $1 }'

这种方法的优点是只有一次awk调用只运行一次以产生所有输出,而不是每次迭代使用循环并调用bc一次。如果您计划将问题中的值$r用作其他命令的参数,这可能不是一个很大的优势。如果您要使用该值执行其他计算,则可以将它们添加到awk脚本中。

事实上,您可以使用BEGIN块中的循环在awk中执行整个操作:

awk 'BEGIN{ pi = atan2(0, -1); for (i = 2; i <= 22; ++i)  print 4 * pi^2 / (1 + i / 2) }'

为了避免循环计数器中出现浮点不准确的问题,我对其进行了更改,以便它使用整数增量并相应地调整等式。

答案 1 :(得分:2)

使用bc进行此类计算。 #!/bin/bash pi="3.14159265359" for i in $(seq 2 0.5 12); do echo "(4*$pi^2)/$i" | bc -l done 是一个任意精度计算器,您可以阅读countries.json更多信息。

http://api.whatever.com

答案 2 :(得分:2)

补充现有的,有用的答案:

awk {Tom Fenech's answer} bc(见Tim Rijavec's answer)都是可行的选择。

选择哪种工具取决于您的精度,舍入和格式需求:

  • bc执行 任意精度算术,您可以选择所需的精度
    • 按照要求的精度,结果截断 (在乘法和除法的情况下)。
    • bc 没有明确的输出格式,但在分割的情况下(在其他情况下), scale变量的值确定小数位数; 使用-l ,其主要目的是加载具有其他数学函数的库,隐式scale设置为20 默认情况下,scale0(!),从而导致整数除法。
  • awk使用固定位数的 浮点算术(使用 double 值)是固有地受到舍入错误(但是,通常不是问题)。
    • printf格式%.6g已应用输出默认,并执行舍入;请注意.6g组合表示6个重要位,只是小数位,但包括整数部分的数字这个数字也是如此。
    • 变量OFS 设置为其他格式字符串或直接使用printf ,并使用格式字符串进行更改。

为了简单起见,让我们将上述内容应用于手头的案例,使用单个输入值(2):

  • awk解决方案:
$ awk 'BEGIN{ pi = atan2(0, -1) }{ print 4 * pi^2 / $1 }' <<<'2'
19.7392  # 6 significant digits (2 before, 4 after `.`), due to default OFMT, "%.6g"

$ awk 'BEGIN{ OFMT="%.6f"; pi = atan2(0, -1) }{ print 4 * pi^2 / $1 }' <<<'2'
19.739209  # 6 decimal places, thanks to custom OFMT, "%.6f"
  • bc解决方案:
$ bc <<< ' 4 * 3.14159265359 ^ 2 / 2 '
19 # !! *integer* division, because `scale` is not set

$ bc -l <<< ' 4 * 3.14159265359 ^ 2 / 2 '
19.73920880218131547976 # 20 decimal places: `-l` sets `scale` to 20

$ bc -l <<< ' scale=6; 4 * 3.14159265359 ^ 2 / 2 '
19.739208 # 6 decimal places, as specified in `scale`; !! note that value is *truncated*

答案 3 :(得分:1)

Bash算法不支持浮点数。

改用bc(我假设pi是变量吗?)

for i in $(seq 2 0.5 12);do r=$(bc <<< "4*$pi^2/$i");done

答案 4 :(得分:1)

使用bc和4 * a(1)来估计Pi。

for i in $(seq 2 0.5 12); do echo $(bc -l <<< "16*a(1)^2/$i"); done

答案 5 :(得分:0)

我已经能够使用此

使其工作

printf -v&#34; km&#34; &#34;。%的4f \ n&#34; $(echo | bc | awk&#34; BEGIN {print 4 * 3.14159265359 * 3.14159265359 /($ i)}&#34;)