Le Wed, Jul 09, 2025 at 09:40:16AM -0400, Chet Ramey a écrit :
> On 7/8/25 8:32 PM, Isabella Bosia wrote:
> > bash: fltexpr: 1e10000: number out of range (error token is "1e10000")
> 
> What do you propose? Catch HUGE_VAL/ERANGE and convert to Inf?

Far before HUGE numbers, speaking about TERA, there seem to be some issue:

  for i in 1{,0,00,000,0000,00000,000000}.0;do
      printf '99999999999999 / %s : ' $i
      fltexpr -p " 99999999999999.9 / i"
  done
  99999999999999 / 1.0 : 99999999999899.90625
  99999999999999 / 10.0 : 9999999999989.990234375
  99999999999999 / 100.0 : 999999999998.9990234375
  99999999999999 / 1000.0 : 99999999999.999908
  99999999999999 / 10000.0 : 9999999999.99999
  99999999999999 / 100000.0 : 999999999
  99999999999999 / 1000000.0 : 99999999

Note: I was trying to build an ``humanizeVar'' function:

  humanizeVar() { 
    local -i pos fact=${humanizeVarFactor:-1024}
    local ar=(b K M G T P E Z Y R Q) res i
    case $1 in
        -K ) ar=("${ar[@]:1}"); shift ;;
        -M ) ar=("${ar[@]:2}"); shift ;;
        -G ) ar=("${ar[@]:3}"); shift ;;
        -T ) ar=("${ar[@]:4}"); shift ;;
    esac
    for i; do
        if [[ ${!i} == *[!0-9.]* ]] || ! (( $i )); then
            printf -v "$i" '0.00%s' ${ar[0]}
            continue
        fi
        fltexpr "pos= floor( log($i) / log(fact) ), res= $i / fact ** pos"
        printf -v "$i" '%.2f%s' $res ${ar[pos]:-x1K^$pos}
    done
  }
Then
  var=99999999999999;humanizeVar var;echo $var
  90.95T
looks good, but
  var=99999999999999;humanizeVarFactor=1000 humanizeVar var;echo $var
  99.00T
should sow '100.00T' instead!

-- 
 Félix Hauri  -  <fe...@f-hauri.ch>  -  http://www.f-hauri.ch

Reply via email to