Script bash operations de réel

Fermé
endefu Messages postés 21 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 7 septembre 2010 - 26 sept. 2009 à 11:35
endefu Messages postés 21 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 7 septembre 2010 - 26 sept. 2009 à 14:20
Bonjour,

Je fais un script dans lequel j'appelle un programme fortran. Je voulais utiliser un algorithme de dicotomie pour ajuster un paramètre. Mon problème c'est que je manipule que des réels et les operations ou test que je fais me donne des erreurs. Je pense que mes erreurs viennent de mon ignorance sur la manipulation des reel dans un script bash.

Je vous montre une partie de mon script

dichotomie ()
{

    force=$1
    pairing=$2
    type=$3
    min=$4
    max=$5
    err=$6  #warning err = 2* err 


    tem=0
    tem2=0
    tem3=0
    left=$min
    gap_lenteur $force $pairing $left $type
    fleft=$(echo "scale=2; $out_pairing - $exp_pairing" | bc)
    
    right=$max
    gap_lenteur $force $pairing $right $type
    fright=$(echo "scale=2; $out_pairing - $exp_pairing" | bc)
    

    sign=0
    
    tem2=$(echo "scale=2; $fleft*$fright" | bc)
    
    if (($tem2 > 0.0)) 
    then
	echo "error1 dichotomie"
	exit
    fi

    if (($fleft < 0.0)) 
    then
	sign=-1
    else
	sign=1
    fi
    
    while [ $tem == 0.0 ]
    do
	tem2=$(echo "scale=2; $left+$right" | bc)
	middle=$(echo "scale=2; $tem2/2" | bc)
	
	gap_lenteur $force $pairing $middle $type
	fmiddle=$(echo "scale=2; $out_pairing - $exp_pairing" | bc)
	if (( $sign == -1 )) 
	then
	    if (( $fmiddle < 0.0 )) 
	    then
		left=$middle
		fleft=$fmiddle
	    else
		right=$middle
		fright=$fmiddle
	    fi
	else
	    if (( $fmiddle < 0.0 )) 
	    then
		right=$middle
		fright=$fmiddle
	    else
		left=$middle
		fleft=$fmiddle
	    fi
	fi
	
	tem2=$(echo "scale=2; $fright-$fleft" | bc)
	tem2=${tem2#-}
	if (( $tem2 < $err )) 
	then
	    tem3=$(echo "scale=2; $right+$left" | bc)
	    tem=$(echo "scale=2; $tem3/2" | bc)
	fi
	    
    done

    echo $tem
}



(cette fonction appelle une autre fonction gap_lenteur qui rempli la variable $out_pairing)
Bon tout n'est pas interessant mais en gros mes problème viennent des comparaison dans les if. à la toute première opération je fais quelque chose comme 1.026945 - 1.31, ce qui me donne -.283055 et qui ne peut pas être comparé à 0.0. je sais pas si ca vient du test ou de l'operation.

Si vous avez une idée, Merci
A voir également:

2 réponses

endefu Messages postés 21 Date d'inscription lundi 11 mai 2009 Statut Membre Dernière intervention 7 septembre 2010 1
26 sept. 2009 à 14:20
J'ai trouvé quelque part quelqu'un faire ca:

if test `expr $tem2 \> 0` -eq 1
 


par exemple pour le premier test de mon code. Ca a l'air de marcher meme si je sais pas du tout d'ou cela vient.
faut encore que je vérifie par contre.

Merci pour la reponse jipicy j'irai voir awk qd je m'appercevrais que ca marche pas du tout, dans pas longtemps j'imagine.
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
26 sept. 2009 à 13:12
Salut,

Le shell ne gère que les entiers.
Il te faut soit continuer le traitement avec "bc", soit voir du côté de "awk" peut être...
0