2009-10-08 7 views
4

Pourquoi la sortie du code suivant est-elle égale à 0 ou serven?Pourquoi la sortie de cout << 7/9 * 9; est zéro?

cout << 7/9*9; //output 0 (zero) why? 

float nine = 9; 
float seven = 7; 
float i = seven/nine*nine; 
cout << i  //output 7 Why? 

Merci pour l'aide.

+1

Votre extrait ne compile pas avec mon compilateur C, mais je suppose que la balise est ok – pmg

+0

presque identique à:.. http://stackoverflow.com/questions/1205490/pourquoi-faire-ces-équations-division-résultat-en-zéro – tvanfosson

Répondre

31

7/9 * 9 évalue ces chiffres comme des entiers, donc 7/9 à 0 évalue et 0 * 9 = 0.

Lorsque vous avez fait les flotteurs, vous effectuez le calcul prévu.

Essayez 7,0/9 * 9 pour obtenir 7, puis effectuez une opération en virgule flottante.

+1

Haha! C'est génial comment les questions super simples deviennent un concours de sniping.Bien expliqué cependant – Kai

+0

wow, 11 upvotes en 1 min – Matt

+0

Je sais .. haha, paie pour vérifier SO lorsque vous luttez avec un bug: D – Jacob

6

En C, lorsque vous divisez des entiers, le reste est ignoré. Ici, vous faites 7/9, en prenant alors le résultat de cela et multiplier par 9. Dans les étapes, voici ce que pense C:

7/9 = 0 
0 * 9 = 0 

Lorsque vous utilisez flotteurs il fonctionne correctement parce que le reste ne soit plus mis au rebut .

+1

Strictement, avec des flotteurs, il y a encore un reste mis au rebut. IOW il y a une erreur d'arrondi.Pédantiquement, la division est l'inverse de la multiplication, ce qui n'est pas possible pour tous les entiers ou tous les flottants. Par définition, approx-quotient + (reste * diviseur) = dividende, où approx-quotient signifie le résultat de l'algorithme de division. Il y a un reste avec division en virgule flottante et en virgule fixe ainsi que des entiers - bien que presque personne ne se soucie de sa valeur exacte, alors ne vous attendez pas à un opérateur pour cela. – Steve314

+1

Merci d'avoir mentionné que Steve! Les petites réponses rapides ont tendance à manquer des détails subtils mais importants comme ça. – Kai

3

7/9*9 est égal à (7/9) * 9, mais comme 7 et 9 sont des nombres entiers et non nombres à virgule flottante, 7/9 est égal à 0 (le quotient de la division).

5

Dans:

cout << 7/9 * 9; 

vous font arithmétique entier. Donc 7/9 est 0 et 0 * 9 est 0.

Pour utiliser l'arithmétique en virgule flottante (qui est ce que vous utilisez dans votre deuxième exemple), vous voulez faire:

cout << 7.0/9 * 9; 
2

Je pense qu'il est un problème de précision. Les opérateurs/et * ont la même priorité, donc 7/9 * 9 est évalué de gauche à droite à as (7/9) * 9. Le hic est que (7/9) est 0 en arithmétique entière. Quand vous explicite les stocker comme des flottants, cette opération/est faite en virgule flottante, qui peut stocker 7/9 avec une plus grande précision qu'un int.

Si vous voulez faire le calcul dans une ligne sans la question de précision, essayez:

Cout < < 7.0f/9.0F * 9.0F;

1

Plusieurs réponses correctes déjà. Une note additionnelle: si vous voulez laisser ceci comme une opération entière et ne pas utiliser de virgule flottante, vous voulez l'ordonner de sorte que vous multipliez avant de diviser pour obtenir la plus grande précision (tant que le dépassement ne se produit pas pendant la multiplication. que (7.0/9)*9 qui convertira à flotteurs, vous pouvez faire (9*7)/9

Questions connexes