Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Priorité de * et /

15 réponses
Avatar
Vincent Lascaux
Bonjour,

Il me semble que les opérateurs * et / ont la même priorité. Mais alors que
vaut 1.0*2/4 ?
Si c'est évalué comme ceci (1.0*2)/4 ca vaut 0.5, si c'est évalué comme cela
1.0*(2/4) ca vaut 0.0...

Merci

--
Vincent

10 réponses

1 2
Avatar
Michel Michaud
Dans news:3f04af35$0$11561$, Vincent
Il me semble que les opérateurs * et / ont la même priorité. Mais
alors que vaut 1.0*2/4 ?
Si c'est évalué comme ceci (1.0*2)/4 ca vaut 0.5, si c'est évalué
comme cela
1.0*(2/4) ca vaut 0.0...


Gauche à droite. Donc comme (1.0*2)/4 et ça vaut 0.5.

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
amerio
Il me semble que les opérateurs * et / ont la même priorité. Mais alors
que

vaut 1.0*2/4 ?
Si c'est évalué comme ceci (1.0*2)/4 ca vaut 0.5, si c'est évalué comme
cela

1.0*(2/4) ca vaut 0.0...



1*(2/4)=1*(0.5)=0.5 ......

* et / sont "permutable" en math : a*b/c = a/c*b = b/c*a = ....
Sinon, l'associativité de-gauche-à-droite prime si les opérateurs ont la
même priorité.
a*b/c est évalué comme (a*b)/c (mais le compilo peut changer ca, je crois,
ds certains cas)

Cela dis, même si a*b/c est équivalent en math à (a*b)/c et a*(b/c), en info
ce n'est plus forcément le cas, à cause des pb de précision. Ce sera le cas
si a, b, c n'ont pas tous les trois le même ordre de grandeur (genre 1e20,
4e19 et 5e-2 ....)

Avatar
Frederic Py
amerio wrote:

1*(2/4)=1*(0.5)=0.5 ......

* et / sont "permutable" en math : a*b/c = a/c*b = b/c*a = ....
Sinon, l'associativité de-gauche-à-droite prime si les opérateurs ont la
même priorité.
En mathemeaique il existe l'operateur de division entiere et en C/C++


(int)/(int) fait que / est interprete comme l'operateur de division entiere

donc

1.0*(2/4) ne respecte pas la regle d'associativite car la multiplication
est sur les flottants par contre la division est sur les entiers donc

1.0*(2/4) = 1.0*0 = 0.0

Il ne fautr pas confondre mathematiques "classiques" et informatique ...
Si un informaticien etait un mathematicien ca se saurait :)

--
Frederic Py

Avatar
M.B.
Oui.

Une bonne regle de programmation consiste a ne pas
melanger entiers et reels dans la meme expression.

Et le compilateur devrait sortir un 'warning'

MB

"Frederic Py" a écrit dans le message news:
be3avf$gcm$

1.0*(2/4) = 1.0*0 = 0.0



Avatar
M.B.
float, double ...

c'est pas des nombres reels ca ?

MB

a écrit dans le message news:


(Et il n'y a pas de réels en C/C++.)


Avatar
Vincent Jacques
"M.B." écrivait news:be6295$3bk$
reader3.wanadoo.fr:

float, double ...

c'est pas des nombres reels ca ?


Ben non, c'est des nombres de la forme m*b^e (à quelques détails pratiques
pret), avec b fixé, et m et e des entiers _informatiques_, donc on ne peut
pas représenter tout réel avec un double:
- le plus grand réel représentable est obtenu en donnant à m et e les plus
grandes valeurs possibles;
- le plus petit réel positif non nul représentable est obtenu en donnant à
m la valeur 1 et à e la plus petite valeur possible.
- on ne peut pas représenter un réel dont le developpement en base b est
infini.

Vincent Jacques

Avatar
Dominique Baldo
Christophe Lephay nous disait
De fait, tu n'as pas la garantie que 2.0/2.0 donne bien 1.0
je veux bien que les compilos soient parfois tordus et les

microprocesseurs buggés, mais je voudrais bien que tu me présentes le
compilo qui donne un résultat différent de 1.0 d'autant que la
réprésentation interne de 2.0 est "parfaite" en float ou double

Avatar
Vincent Jacques
"M.B." écrivait
news:be6ajs$lsv$:

Je sais, merci.

On peut jouer sur les mots.


Yep, désolé, j'ai pris au premier degré... ;-) Peut-etre ma réponse aura
servi à quelqu'un d'autre...

--
Vincent Jacques

Avatar
Christophe Lephay
"M.B." a écrit dans le message de
news:be6ajs$lsv$
float, double ...
c'est pas des nombres reels ca ?
Ben non

On peut jouer sur les mots.



C'est pas jouer sur les mots, vu que certaines propriétés des reels ne sont
pas maintenues avec les float ou double, à savoir il n'est pas garanti que
(a*b)/c soit égal à a*(b/c)...

Chris



Avatar
Christophe Lephay
"Dominique Baldo" a écrit dans le message de
news:
Christophe Lephay nous disait
De fait, tu n'as pas la garantie que 2.0/2.0 donne bien 1.0
je veux bien que les compilos soient parfois tordus et les

microprocesseurs buggés, mais je voudrais bien que tu me présentes le
compilo qui donne un résultat différent de 1.0 d'autant que la
réprésentation interne de 2.0 est "parfaite" en float ou double


J'ai mal formulé mon propos. J'aurais du dire qu'on n'a pas la garantie que
l'expression a/a soit égale à 1, avec a étant une expression de type float
ou double...

Chris


1 2