J'ai essayé de trouver la zone du cercle et j'ai trouvé une valeur de déchets. J'utilise un compilateur gcc
zone d'un cercle
#include<stdio.h>
void main()
{
int a=1;
float c;
c = 22/7 * a * a;
printf("%f is the area" , c);
}
3.142857 est la zone qui doit être la sortie. mais ça montre 3.000000 est la zone
3 Réponses :
22/7 est une division en entier donc sera tronqué à 3 . Vous avez besoin de quelque chose comme:
#define M_PI 3.14159265358979323846264338327950288
Et, en passant, 22/7 n'est pas que une bonne représentation de PI. 355/133 serait mieux mais beaucoup mieux que cela (sur les systèmes où il est disponible):
#include <math.h> // Now use M_PI
ou (sur les systèmes où ce n'est pas le cas):
float c = 22.0 / 7 * a * a;
Il y a aussi très peu de raisons d'utiliser les types float quand double Les variables ont plus de plage et de précision. Les variables float à simple précision peuvent être utiles si vous en avez beaucoup et que vous souhaitez réduire l'espace de stockage mais, dans la plupart des autres cas, cela vaut la peine d'utiliser simplement la double précision. p>
Ce n'est pas une valeur de garbage, l'opération que vous effectuez sur tous les entiers, regardez
22/7.0 * a * a
ici la variable a est un entier, ainsi que 22 et 7, donc l'opération complète est le résultat final est int et il est converti en variable float c qui donne 3.0000.
pour résoudre ce problème, écrivez:
22/7 * a * a
3.142857 est la zone devrait être la sortie. mais il montre 3.000000 est la zone
Vous pensez peut-être parce que vous avez un type de données
floatsur le côté gauche de votre opérateur d'affectation, le calcul sur lecôté droitde votre opérateur d'affectation devrait être un calcul flottant.Cependant, le langage de programmation
Cne promouvra pas implicitement les variables enfloat. Il effectuera une division et une multiplication d'entiers et après avoir calculé le résultat, le résultat (qui sera un entier) sera implicitement converti en type de données sur la LHS de votre opérateur d'affectation (c'est-à-dire, float).Pour en savoir plus sur la division des nombres entiers, consultez ce lien . Il dit:
6.5.5 Opérateurs multiplicatifs
6 Lorsque les entiers sont divisés, le résultat de l'opérateur / est le quotient algébrique avec toute partie fractionnaire ignorée.88) Si le quotient a / b est re-présentable, l'expression (a / b) * b + a% b est égal à a.
Donc, vous obteniez
3.0000car selon la division entière,22/7est3(partie fractionnaire rejetée) et après avoir multiplié paradeux fois, vous obtiendrez un entier de valeur3. Pour affecter la valeur calculée de l'expression à votre variablec, la langue effectue la conversion implicite en float ayant une valeur de3.000.Pour résoudre votre problème, vous devez utiliser explicitement des variables ou des constantes de type
floatsur RHS de votre opérateur d'affectation ou vous pouvez utiliser un opérateur de conversion explicite.float c = 22.0f / 7 * a * a;Parce que d'associativité supérieure de l'opérateur de division,
(22.0 / 7)sera calculé en premier et leur résultat sera un flottant comme l'un des opérandes (22.0et7 code>) est une constante flottante. Ensuite, le résultat de l'expression sera calculé et l'opérandeintegersera promu en type de donnéesfloat. Enfin, votre résultat (qui est float) sera attribué à votre variablec.Voir ce lien pour en savoir plus sur la différence entre
22.0et22.0f.