#1 Le 23/06/2008, à 11:32
- amale
x est -il entier
Salut,
Je sollicite votre aide :
Je voudrais avoir un script en C qui me dit si un nombre x est entier ou non ?(le x est donné par une fonction)
#2 Le 23/06/2008, à 11:50
- ®om
Re : x est -il entier
(En C, ça n'est pas un script, mais un code source)
Quel est le type de retour de la fonction?
Si c'est int, facile, c'est un entier
Sinon :
int isEntier = (int)x == x; //booléen: 0 si non entier, 1 si entier
Hors ligne
#3 Le 23/06/2008, à 11:54
- DrDam
Re : x est -il entier
un tru c du style :
if ( (int)x == x )
// si la partie entriere de x est x ...
Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin
Hors ligne
#4 Le 23/06/2008, à 11:54
- JBF
Re : x est -il entier
Bonjour,
avant d'écrire quelque chose en C il faudrait d'abord décider comment tu vérifies qu'un nombre est entier sachant qu'il faut tenir compte des erreurs d'arrondi de ta fonction, une fois celle-ci codée dans le langage souhaité.
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne
#5 Le 23/06/2008, à 12:31
- telliam
Re : x est -il entier
un tru c du style :
if ( (int)x == x ) // si la partie entriere de x est x ...
avec ce genre de code le compilo va généré un warning et va faire un cast implicite en int du x ( celui a droite de l'operande) donc cela ne marchera pas.
pour ce probleme, tu px utiliser l'operateur modulo qui donne le reste d'une division :
if (x%1 !=0)
{
// c'est un nombre reel
}
note pour amale : on est pas la pour faire tes TD ou TPs !!
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#6 Le 23/06/2008, à 12:33
- Totor
Re : x est -il entier
ta variable x est-elle d'un type "numérique" ? une chaine de caractère, pointeur... ?
-- Lucid Lynx --
Hors ligne
#7 Le 23/06/2008, à 12:34
- DrDam
Re : x est -il entier
pas si le x est declaré différement avant ... (enfin normalement)
Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin
Hors ligne
#8 Le 23/06/2008, à 12:37
- telliam
Re : x est -il entier
pas si le x est declaré différement avant ... (enfin normalement)
euh tu px préciser à quoi tu réponds, j'ai pas tout pigé la
Dernière modification par telliam (Le 23/06/2008, à 12:41)
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#9 Le 23/06/2008, à 12:56
- DrDam
Re : x est -il entier
float x = 7/3 ;
if ( (int)x == x )
// si la partie entriere de x est x ...
{ //qqch }
normalement ça ne genere pas de warning lors de la compil
Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin
Hors ligne
#10 Le 23/06/2008, à 13:04
- telliam
Re : x est -il entier
effectivement pas de warning affiché par defaut mais le cast implicit a qd mm lieu et la condition est donc vrai :
#include <stdio.h>
float x = 7/3 ;
int main (void)
{
if ( (int)x == x ) printf("entier\n");
return 0;
}
~/temp> ./a.out
entier
cela vient du fait que le compilo ne peut comparer que 2 types égaux donc implicitement il transforme les 2 x en int.
Dernière modification par telliam (Le 23/06/2008, à 13:13)
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#11 Le 23/06/2008, à 13:22
- nicolas.sitbon
Re : x est -il entier
effectivement pas de warning affiché par defaut mais le cast implicit a qd mm lieu et la condition est donc vrai :
#include <stdio.h> float x = 7/3 ; int main (void) { if ( (int)x == x ) printf("entier\n"); return 0; }
~/temp> ./a.out entier
cela vient du fait que le compilo ne peut comparer que 2 types égaux donc implicitement il transforme les 2 x en int.
C'est très faux, le compilateur convertit implicitement dans le plus grand des 2 types, en l'occurrence, ici il convertit les 2 en float.
Un compilateur correctement réglé doit le signaler.
Hors ligne
#12 Le 23/06/2008, à 13:26
- telliam
Re : x est -il entier
C'est très faux, le compilateur convertit implicitement dans le plus grand des 2 types, en l'occurrence, ici il convertit les 2 en float.
meme dans le cas d'un cast implicit ??
mais oui effectivement ca parrait logique
mais bon, rassure moi, sur le principe tu es d'accord pour dire que ce genre de test ne marche pas??
Dernière modification par telliam (Le 23/06/2008, à 13:32)
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#13 Le 23/06/2008, à 13:30
- nicolas.sitbon
Re : x est -il entier
nicolas.sitbon a écrit :C'est très faux, le compilateur convertit implicitement dans le plus grand des 2 types, en l'occurrence, ici il convertit les 2 en float.
meme dans le cas d'un cast implicit ??
En fait, je te l'accorde, ce cas est vraiment tordu, pour que ça fonctionne comme tu le dis, il faut caster des 2 côtés :
#include <stdio.h>
int main (void)
{
float x = 7/3.0;
if ((int)x == (int)x)
{
puts ("entier");
}
return 0;
}
Hors ligne
#14 Le 23/06/2008, à 13:32
- nicolas.sitbon
Re : x est -il entier
mais bon, rassure moi, sur le principe tu es d'accord pour dire que ce genre de test ne marche pas??
Complètement d'accord, d'ailleurs l'exemple que je propose au dessus le démontre, on a x qui est un flottant et pourtant le test indique que c'est un entier.
Dernière modification par nicolas.sitbon (Le 23/06/2008, à 13:34)
Hors ligne
#15 Le 23/06/2008, à 13:40
- nicolas.sitbon
Re : x est -il entier
Salut,
Je sollicite votre aide :
Je voudrais avoir un script en C qui me dit si un nombre x est entier ou non ?(le x est donné par une fonction)
Il faudrait être plus précis, quelles sont les contraintes et le contexte?
Hors ligne
#16 Le 23/06/2008, à 17:02
- DrDam
Re : x est -il entier
#include <stdio.h>
int main (void)
{
float x = 7/3.0;
if ((int)x == (int)x)
{
puts ("x est entier");
}
return 0;
}
bah dans ce cas, c'est toujours vrai vue que par definition x=x alors (int)x est egale à (int)x alros le test ne sert à rien (remarque ... le langage C est suffisament bien concu pour ne pas avoir à faire ce genre de test)
Tout ce qui a été crée par l'Homme devrait être patrimoine de l'humanité
Vous etes perdu ?, là ce sera trop loin
Hors ligne
#17 Le 23/06/2008, à 17:13
- amale
Re : x est -il entier
salut,
x = f(a,b) où a,b sont réels, et f : RXR------>R (où R l'ensemble des nombres réels);
quel code me permet de savoir si x est entier naturel ?
NB : Je pense que ce code n'existe pas ! vu qu'il n'est -sur ordinateur- qu'une approximation de f(a,b)! non?
#18 Le 23/06/2008, à 18:42
- guyver2
Re : x est -il entier
j'apporte ma contribution a ce topic plein de bazar :
#include <stdio.h>
int main(int argc, char* argv[]){
double x = 7;
int estEntier = (double)((int)(x)) == (double)x;
estEntier?printf("%.3f entier\n", x):printf("%.3f n'est pas entier\n", x);
return 0;
}
code testé et qui marche correctement avec x entier ou non.
Les float ça suxx, utilisez des doubles.
et des casts partout pour etre tranquille : on compare pas des chiens et des chats.
Dernière modification par guyver2 (Le 23/06/2008, à 18:43)
Croire est le meilleur moyen de ne jamais rien savoir
Mes jeux en C/C++
Hors ligne
#19 Le 23/06/2008, à 19:11
- nicolas.sitbon
Re : x est -il entier
j'apporte ma contribution a ce topic plein de bazar :
#include <stdio.h> int main(int argc, char* argv[]){ double x = 7; int estEntier = (double)((int)(x)) == (double)x; estEntier?printf("%.3f entier\n", x):printf("%.3f n'est pas entier\n", x); return 0; }
code testé et qui marche correctement avec x entier ou non.
Les float ça suxx, utilisez des doubles.
et des casts partout pour etre tranquille : on compare pas des chiens et des chats.
La même chose que ton code SANS tout le bazar comme tu dis!
#include <stdio.h>
#include <stdbool.h>
int main (void)
{
double x = 7.0;
bool estEntier = (int)x == x;
printf ("%.3g %s entier\n", x, estEntier ? "est" : "n'est pas");
return 0;
}
Dernière modification par nicolas.sitbon (Le 23/06/2008, à 19:11)
Hors ligne
#20 Le 23/06/2008, à 20:04
- telliam
Re : x est -il entier
personnellement je préfère utiliser un modulo, mathématiquement c'est plus propre, et j'essaye d'utiliser les casts au minimum possible.
"- Un intellectuel assis va moins loin qu'un con qui marche."
Maurice Biraud - Un Taxi pour Tobrouk
Michel Audiard
Hors ligne
#21 Le 23/06/2008, à 20:06
- guyver2
Re : x est -il entier
je pense pas que les cast successifs soient à considérer comme du bazar. Ca permet de bien voir quels sont les types de données utilisés et de pas s'en remettre au cast automatique pour la comparaison de variable de type différents.
par contre ton déplacement de l'opérateur ternaire est assez élégant.
Croire est le meilleur moyen de ne jamais rien savoir
Mes jeux en C/C++
Hors ligne
#22 Le 23/06/2008, à 20:16
- nicolas.sitbon
Re : x est -il entier
et j'essaye d'utiliser les casts au minimum possible.
+1
Hors ligne
#23 Le 23/06/2008, à 20:17
- nicolas.sitbon
Re : x est -il entier
je pense pas que les cast successifs soient à considérer comme du bazar.
Dans ce cas précis, ils sont inutiles. Moins y a de code, moins y a de bug!
Hors ligne
#24 Le 23/06/2008, à 20:18
- nicolas.sitbon
Re : x est -il entier
Dans tous les cas, on a tous au moins faux sur la comparaison des nombres flottants.
Hors ligne
#25 Le 23/06/2008, à 20:54
- JBF
Re : x est -il entier
Bonsoir,
que donnent vos codes avec la fonction f(a,b) = (a+b-1)/2b ?
f est codée telle quelle dans une routine, et vous prenez a = 1 et b comme vous voulez. Que se passe-t-il quand b tend vers 0 (b= 10^-n avec n assez grand) ?
JBF
LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : Ask LibreOffice
Hors ligne