bash - nombres - virgule flottant ieee 754




Division en script et en virgule flottante (4)

Bash ne fait pas de calcul en virgule flottante. Vous pouvez utiliser awk ou bc pour gérer cela. Voici un exemple awk:

$ m=34; awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }'
0.588235

Pour affecter la sortie à une variable:

var=$(awk -v m=$m 'BEGIN { print 1 - ((m - 20) / 34) }')

Je voudrais faire l'opération suivante dans mon script:

1 - ((m - 20) / 34)

Je voudrais assigner le résultat de cette opération à une autre variable. Je veux que mon script utilise des maths en virgule flottante. Par exemple, pour m = 34:

results = 1 - ((34 - 20) / 34) == 0.588

Enseigner bash par exemple la division entière avec des résultats en virgule flottante:

#!/bin/bash

div ()  # Arguments: dividend and divisor
{
        if [ $2 -eq 0 ]; then echo division by 0; exit; fi
        local p=12                            # precision
        local c=${c:-0}                       # precision counter
        local d=.                             # decimal separator
        local r=$(($1/$2)); echo -n $r        # result of division
        local m=$(($r*$2))
        [ $c -eq 0 ] && [ $m -ne $1 ] && echo -n $d
        [ $1 -eq $m ] || [ $c -eq $p ] && return
        local e=$(($1-$m))
        let c=c+1
        div $(($e*10)) $2
}  

    result=$(div 1080 633)                  # write to variable
    echo $result

    result=$(div 7 34)
    echo $result

    result=$(div 8 32)
    echo $result

    result=$(div 246891510 2)
    echo $result

    result=$(div 5000000 177)
    echo $result

Sortie:

    1.706161137440
    0.205882352941
    0.25
    123445755
    28248.587570621468

Utilisez ce script pour ouvrir ce fichier avec l'éditeur favori comme:

$ sudo vim /usr/bin/div

Puis collez ce code:

#!/bin/bash
# Author: Danial Rikhteh Garan ([email protected])

if [[ -z "$1" ]] || [[ -z "$2" ]]; then
    echo "Please input two number"
    echo "for 100/50 use: div 10 50"
    exit 1;
fi

div=$(echo "$1/$2" | bc -l);
echo 0$div | sed 's/[0]*$//g'

Maintenant, chmod à 755:

$ sudo chmod 755 /usr/bin/div

Maintenant, utilisez-le:

$ div 5 100
0.05

Dans votre script, vous pouvez utiliser ceci:

var=$(div 5 100);
echo "$var"

Vous pouvez utiliser la calculatrice bc . Il fera des maths de précision arbitraires en utilisant des décimales (pas des virgules flottantes binaires) si vous définissez l' scale increease de sa valeur par défaut de 0:

$ m=34
$ bc <<< "scale = 10; 1 - (($m - 20) / 34)"
.5882352942

L'option -l chargera la bibliothèque mathématique standard et par défaut l'échelle à 20:

$ bc -l <<< "1 - (($m - 20) / 34)"
.58823529411764705883

Vous pouvez ensuite utiliser printf pour formater la sortie, si vous le souhaitez:

printf "%.3f\n" "$(bc -l ...)"




shell