OVH Cloud OVH Cloud

Arithmétique

9 réponses
Avatar
melmansouri
Bonjour,

J'ai rencontré un autre petit souci sous Perl, en fait j'ai un arbre
de décision qui se présente comme ceci :

if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

Etc…

Est ce que serait possible de me dire comment je pourrais m'arranger
pour que j'obtienne uniquement 2 chiffres après la virgule et arrondir
les valeurs en même temps ? Pour obtenir quelque chose de l'ordre de :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) ) {
LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

J'ai essayé par exemple de mettre dans mon programme des lignes de
commande comme :

$Atttt = sprintf( "%.2f", $Atttt) ; mais çà n'a pas marché vous pensez
que çà devrais suffir ou bien j'ai commis une erreur de syntaxe?

Merci

9 réponses

Avatar
Ronan Le Hy
Marouane a écrit:
Est ce que serait possible de me dire comment je pourrais m'arranger
pour que j'obtienne uniquement 2 chiffres après la virgule et arrondir
les valeurs en même temps ? Pour obtenir quelque chose de l'ordre de :

J'ai essayé par exemple de mettre dans mon programme des lignes de
commande comme :
$Atttt = sprintf( "%.2f", $Atttt) ; mais çà n'a pas marché vous pensez
que çà devrais suffir ou bien j'ai commis une erreur de syntaxe?


Qu'est-ce qui vous fait dire que ça ne marche pas ?

% perl -nwe 'printf "%f =~ %.2fn",$_,$_'
0.14321354
0.143214 =~ 0.14
0.1456511
0.145651 =~ 0.15
0.1468751
0.146875 =~ 0.15
0.145
0.145000 =~ 0.14
0.155
0.155000 =~ 0.15
0.165
0.165000 =~ 0.17

Si vous voulez plus de réponses à vos questions, lisez:
http://www.gnurou.org/documents/smart-questions-fr.html
("Soyez précis et explicite sur votre problème")
http://perl.plover.com/Questions4.html
("Never, never, never, never, never say `doesn't work'.")

Et montrez-nous du code qui tourne qui met en valeur votre problème
précisément.

--
Ronan

You know what would be cool? A One Ring looseleaf binder. It would have
one ring, and you could use it in the darkness. To, you know, bind things.
Alter S. Reiss

Avatar
root
On Thu, 02 Oct 2003 01:41:48 -0700, Marouane wrote:

Bonjour,

J'ai rencontré un autre petit souci sous Perl, en fait j'ai un arbre
de décision qui se présente comme ceci :

if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

Etc

Est ce que serait possible de me dire comment je pourrais m'arranger
pour que j'obtienne uniquement 2 chiffres après la virgule et arrondir
les valeurs en même temps ? Pour obtenir quelque chose de l'ordre de :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) ) {
LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

J'ai essayé par exemple de mettre dans mon programme des lignes de
commande comme :

$Atttt = sprintf( "%.2f", $Atttt) ; mais çà n'a pas marché vous pensez
que çà devrais suffir ou bien j'ai commis une erreur de syntaxe?



Qu'est ce qui n'a pas marché ?

$ perl -e 'print sprintf("%.2f", 0.121),"n"'
0.12
$ perl -e 'print sprintf("%.2f", 0.125),"n"'
0.13

Pour arrondir toutes les occurrences des formes `Atttt <= 0.399' :

--8<--

use strict;
use warnings;

while(<DATA>) {
s/
(At+s*[<>=]=?s*) # on capture la partie `Atttt <= '
(d+.?d*) # et la valeur `0.399'
/
"$1".sprintf("%.2f",$2) # on remet la partie Atttt et
# l'arrondi de la valeur
/gex;
print $_;
}
__DATA__
if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

-->8--

Et on obtient bien :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

Avatar
melmansouri
Eh bien, merci bcp root, le programme fonctionne à merveille.
j'ai obtenu effectivement ce que je voulais.

Encore merci.

root wrote in message news:...
On Thu, 02 Oct 2003 01:41:48 -0700, Marouane wrote:

Bonjour,

J'ai rencontré un autre petit souci sous Perl, en fait j'ai un arbre
de décision qui se présente comme ceci :

if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

Etc

Est ce que serait possible de me dire comment je pourrais m'arranger
pour que j'obtienne uniquement 2 chiffres après la virgule et arrondir
les valeurs en même temps ? Pour obtenir quelque chose de l'ordre de :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) ) {
LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

J'ai essayé par exemple de mettre dans mon programme des lignes de
commande comme :

$Atttt = sprintf( "%.2f", $Atttt) ; mais çà n'a pas marché vous pensez
que çà devrais suffir ou bien j'ai commis une erreur de syntaxe?



Qu'est ce qui n'a pas marché ?

$ perl -e 'print sprintf("%.2f", 0.121),"n"'
0.12
$ perl -e 'print sprintf("%.2f", 0.125),"n"'
0.13

Pour arrondir toutes les occurrences des formes `Atttt <= 0.399' :

--8<--

use strict;
use warnings;

while(<DATA>) {
s/
(At+s*[<>=]=?s*) # on capture la partie `Atttt <= '
(d+.?d*) # et la valeur `0.399'
/
"$1".sprintf("%.2f",$2) # on remet la partie Atttt et
# l'arrondi de la valeur
/gex;
print $_;
}
__DATA__
if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

-->8--

Et on obtient bien :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}



Avatar
melmansouri
Dans le precedent message, j'ai affirmé que le programme fonctionnait
à merveille. ce n'est plus le cas. il m'affiche quelque erreurs de
compilation par rapport à mon écriture:
est ce que le fait d'ecrire la solution que tu m'avais proposé en une
seule ligne pose un probleme ?

while($ligne){

$ligne =~ s/(At+s*[<>=]=?s*)(d+.?d*)/$1 .sprintf("%.2f",$2)/gex;

et le compilateur m'affiche maintenant l'erreur suivante:

perl -c -w CreerFichierC7pixlel.pl
Unrecognized escape d passed through at CreerFichierC7pixlel.pl line

146.
Unrecognized escape d passed through at CreerFichierC7pixlel.pl line
146.
Unquoted string "gex" may clash with future reserved word at
CreerFichierC7pixlel.pl line 146.
syntax error at CreerFichierC7pixlel.pl line 146, near "$ligne =~ s/("
(Might be a runaway multi-line // string starting on line 129)
syntax error at CreerFichierC7pixlel.pl line 177, near "$ligne("
syntax error at CreerFichierC7pixlel.pl line 182, near ""@lig;n";"
CreerFichierC7pixlel.pl had compilation errors.
Exit code: 255


Qu'est ce que çà pourrais bien dire avec ce message d'erreur?

Merci.

root wrote in message news:...
On Thu, 02 Oct 2003 01:41:48 -0700, Marouane wrote:

Bonjour,

J'ai rencontré un autre petit souci sous Perl, en fait j'ai un arbre
de décision qui se présente comme ceci :

if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

Etc

Est ce que serait possible de me dire comment je pourrais m'arranger
pour que j'obtienne uniquement 2 chiffres après la virgule et arrondir
les valeurs en même temps ? Pour obtenir quelque chose de l'ordre de :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) ) {
LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

J'ai essayé par exemple de mettre dans mon programme des lignes de
commande comme :

$Atttt = sprintf( "%.2f", $Atttt) ; mais çà n'a pas marché vous pensez
que çà devrais suffir ou bien j'ai commis une erreur de syntaxe?



Qu'est ce qui n'a pas marché ?

$ perl -e 'print sprintf("%.2f", 0.121),"n"'
0.12
$ perl -e 'print sprintf("%.2f", 0.125),"n"'
0.13

Pour arrondir toutes les occurrences des formes `Atttt <= 0.399' :

--8<--

use strict;
use warnings;

while(<DATA>) {
s/
(At+s*[<>=]=?s*) # on capture la partie `Atttt <= '
(d+.?d*) # et la valeur `0.399'
/
"$1".sprintf("%.2f",$2) # on remet la partie Atttt et
# l'arrondi de la valeur
/gex;
print $_;
}
__DATA__
if ( (Atttt <= 0.393 ) && ( Attttt <= 0.0475 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.393 ) && ( Attttt > 0.0475 ) && ( Attt <= 0.0755 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

-->8--

Et on obtient bien :

if ( (Atttt <= 0.39 ) && ( Attttt <= 0.05 ) ) {
LM1(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}

if ( (Atttt <= 0.39 ) && ( Attttt > 0.05 ) && ( Attt <= 0.08 ) )
{ LM2(At,Att,Attt,Atttt,Attttt,Atttttt,Attttttt,Tension) ;}



Avatar
root
On Tue, 07 Oct 2003 08:34:21 -0700, Marouane wrote:

Dans le precedent message, j'ai affirmé que le programme fonctionnait
à merveille. ce n'est plus le cas. il m'affiche quelque erreurs de
compilation par rapport à mon écriture:
est ce que le fait d'ecrire la solution que tu m'avais proposé en une
seule ligne pose un probleme ?

while($ligne){

$ligne =~ s/(At+s*[<>=]=?s*)(d+.?d*)/$1 .sprintf("%.2f",$2)/gex;

et le compilateur m'affiche maintenant l'erreur suivante:

perl -c -w CreerFichierC7pixlel.pl
Unrecognized escape d passed through at CreerFichierC7pixlel.pl line

146.
Unrecognized escape d passed through at CreerFichierC7pixlel.pl line
146.
Unquoted string "gex" may clash with future reserved word at
CreerFichierC7pixlel.pl line 146.
syntax error at CreerFichierC7pixlel.pl line 146, near "$ligne =~ s/("
(Might be a runaway multi-line // string starting on line 129)
syntax error at CreerFichierC7pixlel.pl line 177, near "$ligne("
syntax error at CreerFichierC7pixlel.pl line 182, near ""@lig;n";"
CreerFichierC7pixlel.pl had compilation errors.
Exit code: 255


Qu'est ce que çà pourrais bien dire avec ce message d'erreur?



Je ne sais pas, je n'arrive pas a reproduire ton message d'erreur...

Deux petites chose cependant à noter :
- c'est (d+.?d*) et non (d+.?d*)
Il faut échapper le '.' et pas le '+' qui nous sert de quantifier.
- ensuite pour les « modificateurs » 'gex', si tu écris la « regexp » sur
une seule ligne tu peux effectivement supprimer le 'x' et ne garder que
'ge'. (Voir `perldoc perlre')


Avatar
melmansouri
j'ai su la provenance du probleme. çà vient uniquement de l'editeur
(freeware) que j'utilisait, maintenant j'utilise un autre SciTE avec
lequel le programme marche bien.
par contre si je veux multiplier ce que je voulais afficher sous forme
de 2 chiffres par 100 histoire que je puisse obtenir un entier. je me
suis rendu compte que sprintf("%2.0f",$2) ne suffit pas.
est ce que tu sais stp comment s'en sortir ?

Merci

root wrote in message news:...
On Tue, 07 Oct 2003 08:34:21 -0700, Marouane wrote:

Dans le precedent message, j'ai affirmé que le programme fonctionnait
à merveille. ce n'est plus le cas. il m'affiche quelque erreurs de
compilation par rapport à mon écriture:
est ce que le fait d'ecrire la solution que tu m'avais proposé en une
seule ligne pose un probleme ?

while($ligne){

$ligne =~ s/(At+s*[<>=]=?s*)(d+.?d*)/$1 .sprintf("%.2f",$2)/gex;

et le compilateur m'affiche maintenant l'erreur suivante:

perl -c -w CreerFichierC7pixlel.pl
Unrecognized escape d passed through at CreerFichierC7pixlel.pl line

146.
Unrecognized escape d passed through at CreerFichierC7pixlel.pl line
146.
Unquoted string "gex" may clash with future reserved word at
CreerFichierC7pixlel.pl line 146.
syntax error at CreerFichierC7pixlel.pl line 146, near "$ligne =~ s/("
(Might be a runaway multi-line // string starting on line 129)
syntax error at CreerFichierC7pixlel.pl line 177, near "$ligne("
syntax error at CreerFichierC7pixlel.pl line 182, near ""@lig;n";"
CreerFichierC7pixlel.pl had compilation errors.
Exit code: 255


Qu'est ce que çà pourrais bien dire avec ce message d'erreur?



Je ne sais pas, je n'arrive pas a reproduire ton message d'erreur...

Deux petites chose cependant à noter :
- c'est (d+.?d*) et non (d+.?d*)
Il faut échapper le '.' et pas le '+' qui nous sert de quantifier.
- ensuite pour les « modificateurs » 'gex', si tu écris la « regexp » sur
une seule ligne tu peux effectivement supprimer le 'x' et ne garder que
'ge'. (Voir `perldoc perlre')




Avatar
root
On Wed, 08 Oct 2003 08:21:30 -0700, Marouane wrote:

j'ai su la provenance du probleme. çà vient uniquement de l'editeur
(freeware) que j'utilisait, maintenant j'utilise un autre SciTE avec
lequel le programme marche bien.
par contre si je veux multiplier ce que je voulais afficher sous forme
de 2 chiffres par 100 histoire que je puisse obtenir un entier. je me
suis rendu compte que sprintf("%2.0f",$2) ne suffit pas.
est ce que tu sais stp comment s'en sortir ?



sprintf("%.2f",$2)*100 ?

Avatar
melmansouri
oui effectivement, t'as raison, c'est bien sprintf("%.2f",$2)*100.

Encore Merci Root.


root wrote in message news:...
On Wed, 08 Oct 2003 08:21:30 -0700, Marouane wrote:

j'ai su la provenance du probleme. çà vient uniquement de l'editeur
(freeware) que j'utilisait, maintenant j'utilise un autre SciTE avec
lequel le programme marche bien.
par contre si je veux multiplier ce que je voulais afficher sous forme
de 2 chiffres par 100 histoire que je puisse obtenir un entier. je me
suis rendu compte que sprintf("%2.0f",$2) ne suffit pas.
est ce que tu sais stp comment s'en sortir ?



sprintf("%.2f",$2)*100 ?



Avatar
melmansouri
oui effectivement, t'as raison, c'est bien sprintf("%.2f",$2)*100.

Encore Merci Root.


root wrote in message news:...
On Wed, 08 Oct 2003 08:21:30 -0700, Marouane wrote:

j'ai su la provenance du probleme. çà vient uniquement de l'editeur
(freeware) que j'utilisait, maintenant j'utilise un autre SciTE avec
lequel le programme marche bien.
par contre si je veux multiplier ce que je voulais afficher sous forme
de 2 chiffres par 100 histoire que je puisse obtenir un entier. je me
suis rendu compte que sprintf("%2.0f",$2) ne suffit pas.
est ce que tu sais stp comment s'en sortir ?



sprintf("%.2f",$2)*100 ?