Borne inf/sup

goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008 - 17 nov. 2007 à 22:36
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 - 5 déc. 2007 à 18:56
Salut,

Je voudrais calculer la borne inférieur et la borne supérieur d'un nombre décimal.
Bien sur je veux le faire sans utiliser des fonctions comme trunc()

Si vous avez une idée, elle sera bienvenue puisque je n'ai rien trouvé sur le net.
@++++
A voir également:

6 réponses

titof3812 Messages postés 18 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 12 décembre 2007
18 nov. 2007 à 10:38
Salut

essaie les fonctions ceil(x)  et floor(x) : plafond et plancher .

si tu veut borner a n point apres la virgule  (avant avec n negatif)

ceil( x*10^n)/10^n pour valeur sup
floor(x*10^n)/10^n) pour la valeur inf

example borne inf a 2 chiffre apres la virgule de 2,3568:

floor(2,3568*10^2)/10^2
floor(235,68)/100
235/100
2,35

j'ai pas teste mais y-a pas de raison que ca ne marche pas
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
18 nov. 2007 à 10:44
Salut,
en effet ta solution est bonne mais je cherche à faire ça sans utiliser de fonctions spécifiques.
0
titof3812 Messages postés 18 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 12 décembre 2007
18 nov. 2007 à 11:38
tu peut alors essayer le casting en int pour reecrir floor et ceil

essaye ca
int myfl(float val)
{
if (val<0)
    return (int)( val-1);
else
    return (int) (val);
}
int myceil(float val)
{
if (val<0)
    return (int)( val);
else
    return (int) (val+1);
   
}
main()
{
float f=2.35;
printf("val =%f  myfl=%i myceil=%i\n",f,myfl(f),myceil(f));
 f=-2.35;
printf("val =%f  myfl=%i myceil=%i\n",f,myfl(f),myceil(f));

}
compil en gcc sur un mac ca a l'air de tourner

resultat:
val =2.350000  myfl=2 myceil=3
val =-2.350000  myfl=-3 myceil=-2
0
titof3812 Messages postés 18 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 12 décembre 2007
18 nov. 2007 à 12:17
Si tu veux etre plux efficace ( mais surement moins lisible) tu peux utiliser les define

example
main()
{
#define C1(x) ( (x) < (0) ? ((int)x) : ((int)(x+1)) )
#define F1(x) ( (x) < (0) ? ((int)(x-1)) : ((int)(x)) )

float f=2.35;
printf("val =%f  F1=%i C1=%i\n",f,F1(f),C1(f));

 f=-2.35;
printf("val =%f  F1=%i C1=%i\n",f,F1(f),C1(f));

 f=0;
printf("val =%f  F1=%i C1=%i\n",f,F1(f),C1(f));

}

resultat :
val =2.350000  F1=2 C1=3
val =-2.350000  F1=-3 C1=-2
val =0.000000  F1=0 C1=1
0

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

Posez votre question
titof3812 Messages postés 18 Date d'inscription lundi 12 novembre 2007 Statut Membre Dernière intervention 12 décembre 2007
18 nov. 2007 à 16:43
attention avec #define le parametre passe est evalue a chaque fois:
ce qui veut dire que si on appele C1 ou F1 avec f++ on incremente 2 fois la valeur f donc dans un appel define pas de calcul sur le parametre.

La meilleure solution me semble etre l'inline:
petit code d'example ( mieux qu'un long discourt)

main()
{
inline int C1(float x) { return (x) < (0) ? ((int)x) : ((int)(x+1)); }
inline int F1(float x) { return (x) < (0) ? ((int)(x-1)) : ((int)(x)); }

#define C2(x) ( (x) < (0) ? ((int)x) : ((int)(x+1)))
#define F2(x) ( (x) < (0) ? ((int)(x-1)) : ((int)(x)))

float f1=-2.35;
float f2=-2.35;
printf("val1 =%f  F1=%i C1=%i\n",f1,F1(++f1),C1(f1));   // correct 1 seul ++f
printf("val2 =%f  F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));  // bad 2 ++f

printf("val1 =%f  F1=%i C1=%i\n",f1,F1(++f1),C1(f1));
printf("val2 =%f  F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));

printf("val1 =%f  F1=%i C1=%i\n",f1,F1(++f1),C1(f1));
printf("val2 =%f  F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));

printf("val1 =%f  F1=%i C1=%i\n",f1,F1(++f1),C1(f1));
printf("val2 =%f  F2=%i C2=%i\n\n",f2,F2(++f2),C2(f2));

}

Resultat du code
val1 =-1.350000  F1=-2 C1=-1
val2 =-2.350000  F2=-1 C2=0

val1 =-0.350000  F1=-1 C1=0
val2 =-0.350000  F2=1 C2=2

val1 =0.650000  F1=0 C1=1
val2 =1.650000  F2=3 C2=4

val1 =1.650000  F1=1 C1=2
val2 =3.650000  F2=5 C2=6

voila vaoila 
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
5 déc. 2007 à 18:56
Salut,
une autre solution vite fait;

double x  = (valeur choisie);
int borneInf= (int)x - !!((int)x&80000000);
int borneSup = borneInf+1;

J'espere avoir aide, Salut
je suis heureux de faire partie d'une grande famille ...!
0
Rejoignez-nous