[linux C]

Fermé
natalie - 16 avril 2007 à 12:22
dubcek Messages postés 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 - 19 avril 2007 à 14:02
Bonjour,
je suis une débutante en programmation sous linux avec le langage C. je viens de programmer un programme dans le quel j'utilise les opérations mathématiques log10,exp et pow.
ben, aprés 1 mois d'essayage je termine mon prog et je le compile avec gcc -lm -o Model Model.c, il existe alors des instructions qui marchent déja mais il existe d'autres qui retourne "inf" aprés l'affichage avec printf. tout bref je ne sais plus la source d'erreur.
SVP, veuillez m'aider à resoudre ce problème parceque je suis vraiment bloquée.Merci d'avance.
le code est le suivant
#include<stdio.h>

#include<math.h>


int main(int argc,char*argv[])

{

#define SLR 8

#define RLR 2

#define STMR 15

#define Ds 3

#define Dr 3

#define TELR 65
#
define WEPL 110
#
define T 200
#
define Bp 4.3
#
define Pp 0

#define Nc -70

#define Nfor -64

#define Pr 35

#define Ps 35

#define A 0

#define qdu 1

float Ie,OLR,LSTR,Ta,Tr;

double Nos;

double Pre,Nor,No,Ro;

int Nfo;

double Id;

double Xolr,Iolr,STMRo;

double p,pp,ppp,pppp;

double Ist;

double Q;

double G;

double Y;

double Z;

double Iq;

double Is;

double TERV;

double Re,Roe,Idte;

double Rle,Idle;

double XX;

double Idd;

double e, ex;

double Ie_eff;

double R,MOS;

printf("\n Entrez le coefficient Ie :");

scanf("%f",&Ie);


OLR=SLR+RLR;

LSTR=STMR+Dr;

Ta=T;

Tr=2*T;

printf("\n%f OLR ",OLR);

printf("\n%f LSTR",LSTR);

printf("\n%f Ta",Ta);

printf("\n%f Tr",Tr);


Nos= pow((Ps-SLR-Ds-100+0.004)*(Ps-OLR-Ds-14),2);

printf("\n%lf Nos",Nos);

Pre = Pr+10*log10(pow(11,(10-LSTR/10)));

printf("\n%lf Pre",Pre);
Nor=pow(RLR-121+Pre+0.008*(Pre-35),2);

printf("\n%lf Nor",Nor);

Nfo = Nfor+RLR;

printf("\n%lf Nfo",Nfo);

No=10*log10(pow(10,(Nc/10))+pow(10,(Nos/10))+pow(10,(Nfo/10)));

printf("\n%lf No",No);
Ro=15-1.5*(SLR+No);
printf("\n%lf Ro",Ro);


// Calcul du facteur Is

Xolr = OLR+0.2*(64+No-RLR);

p=pow((Xolr/10),8);

Iolr = 20*((1+pow(p,0.125)-Xolr/8));

STMRo = -10*log10(pow(10,(-STMR/10))+exp(-T/4)*pow(10,(-TELR/10)));

pp=pow((STMRo-13)/6,8);

ppp=pow((STMRo+1)/19.4,35);

pppp=pow((STMRo-3)/33,13);

Ist = 12*(1+pow(pp,(1/8)))-28*(1+pow(ppp,(1/35)))-13*(1+pow(pppp,(1/13))+29);


Q = 37-15*log10(qdu);

G = 1.07+0.258*Q+0.0602*pow(Q,2);

Y = (Ro-100)/15+46/8.4-G/9;

Z = 46/30-G/40;

Iq = 15*log10(pow(11,Y)+pow(10,Z));


Is = Iolr+Ist+Iq;
printf("\n%lf le coefficient Is est egal a :",Is);

// Calcul du facteur Id
TERV = TELR-40*log10((1+T/10)/(1+T/150))+6*exp(pow(-0.3*T,2));

if (STMR<9)
{
TERV = TERV+0.5*Ist;

Re = 80+2.5*(TERV-14);

Roe = -1.5*(No-RLR);

Idte = ((Roe-Re)/2+sqrt(pow((Roe-Re),2/4+100))-1)*(1-exp(-T));


}

if (STMR>20)

{
Idte = sqrt(pow(Idte,2)+pow(Ist,2));


Rle = 10.5*(WEPL+7)*pow((Tr+1),(-0.25));

Idle = (Ro-Rle)/2+sqrt(pow((Ro-Rle),2)/4+169);
}
if(Ta<=100)

{

Idd=0;

}

else if(Ta>100)

{

XX=log10(Ta/100)/log10(2);

e=pow(1+XX,6);

ex=pow((XX/3),6);

Idd= 25*(pow(e,(1/6))-3*(1+pow(ex,(1/6))+2));

Id = Idte+Idle+Idd;

printf("\nle coefficient Id est égal à :\n",Id);

}

Ie_eff = Ie+(95-Ie)*(Pp/5)/((Pp/5)+Bp);


// Calcul du facteur R


R = Ro-Is-Id-Ie_eff+A;

printf ("\n%lf la valeur du facteur R est egale a :",R);


// Conversion du facteur R en Score Mos


MOS = (1+0.035)*R+R*(R-60)*(100-R)*0.000007;

if(R<0)

{

MOS=1;

printf("\n%lf le score Mos",MOS);

}

else if(R>100)

{

MOS=4.5;

printf("\n%lf le score Mos",MOS);

}

}
A voir également:

7 réponses

dubcek Messages postés 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
16 avril 2007 à 14:24
inf pour infini, une probable division par 0

à certain printf, il manque le % du format: printf("\nle coefficient Id est égal à :\n",Id);
0
bonjour,
merci dubcek pour votre explication mais je n'arrive pas à resoudre le problème. Encore je rencontre l'instruction inf et -inf au niveau du calcul de Ro et No.SVP, Est ce que vous pouvez m'aider à trouver une solution. je suis perdue.Merci d'avance.
0
dubcek Messages postés 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
17 avril 2007 à 12:28
Je n'ai pas de compilateur sous la main, mais:
-vérifier que tout les scanf et prinf qui manipulent des double ont bien %lf ou %le
- vérifier ce calcul, si No = inf, alors Ro aussi
No=10*log10(pow(10,(Nc/10))+pow(10,(Nos/10))+pow(10,(Nfo/10)));

printf("\n%lf No",No);
Ro=15-1.5*(SLR+No);
printf("\n%lf Ro",Ro);
- afficher ici une exécution
0
salut,
ben je fais une petite modification dans le code au niveau
Nor=pow(RLR-121+Pre+0.008*(Pre-35),2);
j'ai ajouté une parenthèse.l'instruction devient
Nor=pow((RLR-121+Pre+0.008)*(Pre-35),2); .Alors la valeur de Nor est modifiée mais encore le meme problème.
l'exécution nous donne inf No et -inf Ro et encore nan le coefficient Is est egal a: (vide) et meme chose pour le coefficient Id et le facteur R.SVP aidez moi,c trés urgent.Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
18 avril 2007 à 14:15
La man page de pow précise bien les cas qui retournent inf, il faut afficher toutes les valeurs avant le pow.

pow(+-0, y) returns +-infinity and raises the "divide-by-zero" floating-
point exception for y an odd integer < 0.

pow(+-0, y) returns +infinity and raises the "divide-by-zero" floating-
point exception for y < 0 and not an odd integer.

pow(+-0, y) returns +-0 for y an odd integer > 0.

pow(+-0, y) returns +0 for y > 0 and not an odd integer.

pow(-1, +-infinity) returns 1.

pow(1, y) returns 1 for any y, even a NaN.

pow(x, +-0) returns 1 for any x, even a NaN.

pow(x, y) returns a NaN and raises the "invalid" floating-point exception
for finite x < 0 and finite non-integer y.

pow(x, -infinity) returns +infinity for |x| < 1.

pow(x, -infinity) returns +0 for |x| > 1.

pow(x, +infinity) returns +0 for |x| < 1.

pow(x, +infinity) returns +infinity for |x| > 1.
0
bonjour
Hier et lorsque j'essaye de trouver la faute, il m'apparait que j'ai oublié une instruction dans l'equation de No.
l'equation devient No=10*log10(pow(10,(Nc/10))+pow(10,(Nos/10))+pow(10,(Nor/10))+pow(10,(Nfo/10)));
j'ai ajouté pow(10,(Nor/10)) et encore le meme cas.
SVP,est ce que vous pouvez m'expliquez les instructions envoyées dans ton dernier msg parcque je ne comprend rien :((
SVP aidez moi et je suis désolée pour le dérangement.A+
0
dubcek Messages postés 18757 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 19 décembre 2024 5 623
19 avril 2007 à 14:02
C'est pow qui retourne +-inf en fonction des valeurs passées.
Il faut imprimer toutes les valeurs AVANT le pow pour voir si il n'y a pas une division par 0, ou 0 puissance negative, etc
Placer un printf juste avant le pow.
C'est aussi vrai pour log10 : log10(0) = inf

printf("Nc=%d,Nos=%lf,Nor=%lf,Nfo=%lf\n", Nc, Nos, Nor, Nfo) ;
No=10*log10(pow(10,(Nc/10))+pow(10,(Nos/10))+pow(10,(Nor/10))+pow(10,(Nfo/10)));
0