1
votes

obtenir la valeur des déchets tout en trouvant la zone d'un cercle

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

c

0 commentaires

3 Réponses :


1
votes

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>


0 commentaires

1
votes

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


0 commentaires

1
votes

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 float sur le côté gauche de votre opérateur d'affectation, le calcul sur le côté droit de votre opérateur d'affectation devrait être un calcul flottant.

Cependant, le langage de programmation C ne promouvra pas implicitement les variables en float . 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.0000 car selon la division entière, 22/7 est 3 (partie fractionnaire rejetée) et après avoir multiplié par a deux fois, vous obtiendrez un entier de valeur 3 . Pour affecter la valeur calculée de l'expression à votre variable c , la langue effectue la conversion implicite en float ayant une valeur de 3.000 .

Pour résoudre votre problème, vous devez utiliser explicitement des variables ou des constantes de type float sur 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.0 et 7 code>) est une constante flottante. Ensuite, le résultat de l'expression sera calculé et l'opérande integer sera promu en type de données float . Enfin, votre résultat (qui est float) sera attribué à votre variable c.

Voir ce lien pour en savoir plus sur la différence entre 22.0 et 22.0f .


0 commentaires