[linux C]
natalie
-
dubcek Messages postés 19030 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 19030 Date d'inscription Statut Contributeur Dernière intervention -
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);
}
}
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:
- [linux C]
- Linux reader - Télécharger - Stockage
- R-linux - Télécharger - Sauvegarde
- Toutou linux - Télécharger - Systèmes d'exploitation
- Backtrack linux - Télécharger - Sécurité
- Linux mint 22.1 - Accueil - Linux
7 réponses
inf pour infini, une probable division par 0
à certain printf, il manque le % du format: printf("\nle coefficient Id est égal à :\n",Id);
à certain printf, il manque le % du format: printf("\nle coefficient Id est égal à :\n",Id);
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.
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.
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
-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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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+
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+
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)));
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)));