【问题标题】:Using a logarithmic (floating point) increment in a bash loop在 bash 循环中使用对数(浮点)增量
【发布时间】:2014-07-15 12:54:20
【问题描述】:

我有这个基本上运行 c 模拟的 bash 脚本./infosimul mu num

其中参数线性增加,它们只取整数。

mu=1
num=0
while test $num -le 6;do
    mkdir $num
    cd $num
    while test $mu -le 200; do
            ../infosimul "$num" "$mu" 
            mu=$((mu+3))
        done
    mu=1
    cd ../
    num=$((num+1))
done

我希望 mu 参数在 0.01, 0.03, 0.09, 0.1, 0.3, 0.9, 1, 3, 9 ,10 或不纯粹是整数序列的集合中增加。

谢谢!

【问题讨论】:

  • 在 bash 内部基本上不支持,但是你可以使用 bc 来比较浮点数。

标签: bash loops floating-point


【解决方案1】:

使用这个技巧:循环序列1 3 9

使用bc计算mu

mu=$(echo "scale=2; $val*$factor" | bc)

factor=0.01 开始,循环上面的序列后乘以 10:

factor=$(echo "scale=2; $factor*10" | bc)

【讨论】:

    【解决方案2】:

    这是一个相当简单的方法:

    #!/bin/bash
    j=1
    k=-2       # We are going to raise 10 to this power
    num=1
    while : 
    do
       mu=$(echo "scale=2;$j*10^$k"|bc)
       echo ../infosimul "$num" "$mu" 
       [[ j -eq 1 ]] && j=2
       [[ j -eq 3 ]] && j=8
       [[ j -eq 9 ]] && j=0 && ((k++))
       ((j++))
       ((num++))
    done
    

    输出

    ../infosimul 1 .01
    ../infosimul 2 .03
    ../infosimul 3 .09
    ../infosimul 4 .10
    ../infosimul 5 .30
    ../infosimul 6 .90
    ../infosimul 7 1
    ../infosimul 8 3
    ../infosimul 9 9
    ../infosimul 10 10
    ../infosimul 11 30
    ../infosimul 12 90
    ../infosimul 13 100
    ../infosimul 14 300
    ../infosimul 15 900
    

    【讨论】:

      【解决方案3】:

      这只是 bash:

      #!/bin/bash
      
      mu=$1 num=$2
      
      function is_le {
          local A1 A2 B1 B2
      
          if [[ $1 == *.* ]]; then
              A1=${1%%.*}
              A2=${1##*.}
          else
              A1=$1
              A2=0
          fi
      
          if [[ $2 == *.* ]]; then
              B1=${2%%.*}
              B2=${2##*.}
          else
              B1=$2
              B2=0
          fi
      
          (( L = ${#A2} > ${#B2} ? ${#A2} : ${#B2} ))
      
          A2=$A2'00000000000000000000'; A2=1${A2:0:L}
          B2=$B2'00000000000000000000'; B2=1${B2:0:L}
      
          (( A1 == B1 ? A2 <= B2 : A1 < B1 ))
      }
      
      for (( ; num <= 6; ++num )); do
          mkdir "$num" && pushd "$num" >/dev/null || continue
          while is_le "$mu" 200; do
              ../infosimul "$num" "$mu" 
              mu=$(( ${mu%.*} + 3 )).${mu#*.}
          done
          popd > /dev/null
      done
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 2012-05-17
        • 2017-06-15
        • 2020-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多