如何在bash中使用浮点数算术?

342

我正在尝试在Bash脚本中计算两个图像宽度的商,但是Bash给出了0作为结果:

RESULT=$(($IMG_WIDTH/$IMG2_WIDTH))
我已经学习了Bash指南,知道应该使用bc。在网上的所有例子中,他们都使用bc。在echo中,我尝试将相同的内容放入我的SCALE中,但它没有起作用。
这是我在教程中找到的例子:
echo "scale=2; ${userinput}" | bc 

我该如何让Bash输出一个像 0.5 这样的浮点数?


11
对于每个在脚本中尝试使用浮点数算术的人,你需要问自己一个问题:_我真的需要使用浮点数算术吗?_有时候可以完全不用。例如,请参考BashFAQ/022的最后一部分。 - gniourf_gniourf
1
可以教授bash,例如浮点结果的整数除法。 - Cyrus
24个回答

0

让我们举一个例子来理解,如果您想要找到n个数组元素的平均值(当然平均值将是浮点数/小数

declare -a arr
echo "How many numbers you want to enter?"
read n
echo "Enter the Array Elements"
for(( i=0 ; i<$n ; i++))
do
      read array_elements
      arr[$i]="$array_elements"
done
sum=0
for i in "${arr[@]}"
do
     #sum and avg
     sum=$(($sum + $i))
     #average will come in decimals
     avg=`echo $sum / $n | bc -l`
done
# Output results:
printf "Average of Array Elements %.2f:" $avg

因此,我们将使用"| bc -l"进行浮点数计算。


0
这里是awk命令:-F = 字段分隔符 == +
echo "2.1+3.1" |  awk -F "+" '{print ($1+$2)}'

0

你需要输出的精度有多高?如果对于你的使用场景,通过分箱的近似值已经足够了,那么你甚至可以更进一步利用 POSIX 退出码 [0:256)(所有其他整数都模回到该范围内)。

例如:在 gawk/nawk/mawk-1 中,它已经给我以整数级别的时间戳,但我想要扩展到接近毫秒级别的精度,但不要过于追求完美,我在 POSIX shell 中运行了这个命令。

exit $(( 10#` gdate +%5N ` * 256 / 100000 ))

将表示0.xxxxxx gnu-date输出的5位整数直接分配到256个箱子中的一个,然后在awk获取system()调用的退出代码(即所选箱号)后撤销该操作256。我发现这种方法的开销比使用完整的getline调用要低。

此方法还直接将输出捕获到POSIX退出代码中,而不需要额外的终端打印输出。

(如果以这种方式编写,shell算术自动将其向下取整为整数,而不是* 0.0256)。将其组合成awk函数,它将类似于此。 10#是为了强制使用基数10,以防止posix shell将“01733”解释为八进制数字。

function msecs() {     # n x 2**-8 = n divided by 256

    return 2^-8 * \
           system( "exit \44\50\50 "      \
                   " 10\43\140 gdate \53"  \
                   "%5N\140 \52 " \
                   "256 \57 100000 \51\51" )
}

对于我的代码,我会额外减少0.6%以考虑shell开销。

0
你可以使用Python。
RESULT=$(python -c "print($IMG_WIDTH/$IMG2_WIDTH)")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接