当前位置: 首页 > 知识库问答 >
问题:

如何在bash中使用浮点算法?

经骁
2023-03-14

我试图在Bash脚本中划分两个图像宽度,但是Bash给了我0,结果是:

RESULT=$(($IMG_WIDTH/$IMG2_WIDTH))

我确实研究了Bash指南,我知道我应该使用bc,在互联网上的所有示例中,他们都使用bc。在echo中,我试图将同样的东西放入量表中,但没有成功。

以下是我在教程中找到的示例:

echo "scale=2; ${userinput}" | bc 

如何让Bash给我一个类似0.5的浮点值?


共有3个答案

翟元凯
2023-03-14

正如其他人所指出的,bash不支持浮点运算,尽管您可以使用一些固定小数技巧来伪造它,例如使用两个小数:

echo $(( 100 * 1 / 3 )) | sed -e 's/..$/.&/;t' -e 's/.$/.0&/'

输出:

.33

参见Nilfred的答案,了解类似但更简洁的方法。

除了上述的bcawk备选方案外,还有以下几种:

clisp -x '(/ 1.0 3)'

已清理的输出:

clisp --quiet -x '(/ 1.0 3)'

或通过stdin

echo '(/ 1.0 3)' | clisp --quiet | tail -n1
echo 2k 1 3 /p | dc
echo 1/3.0 | genius
echo 1 3 div = | gs -dNODISPLAY -dQUIET | sed -n '1s/.*>//p' 
echo 'pr 1/3.' | gnuplot
convert xc: -format '%[fx:1/3]' info:

或通过stdin

echo 1/3 | { convert xc: -format "%[fx:$(cat)]" info:; }
jq -n 1/3

或通过stdin

echo 1/3 | jq -nf /dev/stdin
echo 'print $(( 1/3. ))' | ksh
lua -e 'print(1/3)'

或通过stdin:

echo 'print(1/3)' | lua
echo '1/3,numer;' | maxima

已清理的输出:

echo '1/3,numer;' | maxima --quiet | sed -En '2s/[^ ]+ [^ ]+ +//p'
echo 1/3 | node -p
echo 1/3 | octave
echo print 1/3 | perl
echo print 1/3. | python2
echo 'print(1/3)' | python3
echo 1/3 | R --no-save

已清理的输出:

echo 1/3 | R --vanilla --quiet | sed -n '2s/.* //p'
echo puts 1/3.0 | ruby
units 1/3

具有紧凑的输出:

units --com 1/3
echo 1/3 | wcalc

已清理的输出:

echo 1/3 | wcalc | tr -d ' ' | cut -d= -f2
print $(( 1/3. ))

或通过stdin

echo 'print $(( 1/3. ))' | zsh

Stéphane Chazelas在UL上回答了类似的问题。

滕令雪
2023-03-14

你可以这样做:

bc <<< 'scale=2; 100/3'
33.33

UPDATE20130926:您可以使用:

bc -l <<< '100/3' # saves a few hits
33.33333333333333333333
富钧
2023-03-14

不能,bash只做整数;您必须委托给工具,如bc

 类似资料:
  • 如何从bash脚本中获得正确的结果? 结果我得到!因此,我尝试使用这些,但没有成功:

  • 我阅读关于浮点和舍入在浮点算术期间发生的错误。 我读了很多关于IEEE754单精度/双精度格式的文章。我知道有符号位、8(或)11位指数和23(或)52位有效位以及隐式前导位。 我也知道分母不是质因数2的实数不能完全表示,例如二进制中的0.1是0.0001100110011...... 我知道0.1 0.1 0.1不等于0.3,因为舍入误差的累积。 同样,0.5也可以用二进制格式表示,因为它是1/

  • 问题内容: 我正在阅读Robert Love的“ Linux内核开发”,并且遇到了以下段落: 无需(轻松)使用浮点数 当用户空间进程使用浮点指令时,内核将管理从整数到浮点模式的转换。内核使用浮点指令时必须执行的操作因体系结构而异,但是内核通常会捕获陷阱,然后启动从整数模式到浮点模式的转换。 与用户空间不同,内核不具有对浮点​​的无缝支持的奢侈,因为它无法轻易地陷入陷阱。在内核内部使用浮点数需要手动

  • 有人能帮我处理bash中需要的计算吗? 目前我有以下几点: 但我在尝试执行时遇到以下错误: 我愿意使用其他替代品,比如打印、awk甚至bc,但我需要一些指导。

  • 以下是go中的示例代码: 结果线A1、B1和C1之间的差异是可以理解的。然而,从A2开始到C2魔法来了。来自B2和C2的结果都与来自A2线的结果不匹配。对于x2行(x=A、B或C)也是如此——但是x2和x4的输出是相同的。 为了确保,让我们以二进制形式打印结果。 上面代码中的一些事实(一个在bin表单中): 行A11和C11之间有差异(最后一位数字——就在指数之前)。 行A12和C12几乎相同(除

  • 问题内容: 在我的数据库中,我具有NextStatDistanceTime值作为浮点数。执行“ ”行时,出现错误 系统无效的强制转换异常 如何在此代码中从sql命令获取浮点值? 这是我的代码: 问题答案: 我想是时候放一张桌子了。 T-SQL类型名称 相当于.NET C#类型名称 `DataReader` 方法 `FLOAT` `System.Double` `double` `IDataRead