Question

Dans le cas suivant le code ANSI C, je me demande sur les résultats:

main() {
  int a = 19.4 / 9.7;               // result = 2
  float b = (int) 19.4 / (int) 9.7  // result = 2.000000, why?
  float c = (int) 9.7;              // result = 9
}

Je compris que C coupera toutes les décimales sur la conversion en int, mais ma logique a un défaut si je vois la deuxième ligne. Si les décimales sont coupées, le résultat doit être 2,11111.

Comment est la conversion de virgule flottante fait dans la norme ANSI C?

Était-ce utile?

La solution

Dans la norme C, littéraux tels que 19.4 et 9.7 sont supposés être le double, sauf indication contraire (par exemple. 19.4F, 9.7F).

Le compilateur utiliser la fonction de division entière pour calculer x / y (si les deux x et y sont des int (compatible) Type) ou la fonction de division en virgule flottante pour ordinateur x / y si atleast un des x et y sont un type à virgule flottante.

float b = (int) 19,4 / (int) 9.7 // result = 2,000000, pourquoi?

Vous demandez 19,4 à couler à int, et 9,7 à couler à int, demandant effectivement le compilateur de calculer la division entière de 19/9 = 2, qui est ensuite promu flotter pour le stockage en b. 2 devient 2.0.

.PMCD.

Autres conseils

Dans la ligne 2, vous êtes en train de convertir des valeurs d'entrée en nombres entiers, et ensuite faire une division entière (parce que les deux opérandes pour la fracture sont ints, la fracture se fait dans l'espace entier - ce qui signifie que tout resiult fractionnaire sera tronqué).

Alors, 19/9 = 2

Ensuite, pour obtenir cet entier en un flotteur, il convertit implicitement 2 revenir à 2,000000

Non, il doit être 2. Lorsque vous divisez un int par un int, vous obtenez un int. Ainsi 2. Vous pouvez faire le hokey-Pokey il convertir ensuite à ce que vous voulez, mais les décimales sont déjà partis.

Diviser deux entiers et vous obtiendrez un entier. Diviser un flotteur et un entier et vous obtiendrez un flotteur.

(int) 19.4 / (int) 9.7 est équivalente à 19 / 9, qui obtient d'abord décomposée en deux (un int). Seulement après le 2 est calculé est-il transformé en un flotteur par le type de variable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top