我试图将一个序列值放入一个等式中,在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")
答案 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
。 默认情况下,scale
为0
(!),从而导致整数除法。 awk
使用固定位数的 浮点算术(使用 double
值)是固有地受到舍入错误(但是,通常不是问题)。
printf
格式%.6g
已应用输出默认,并执行舍入;请注意.6
与g
组合表示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;)