IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

problème entre float et int


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 4
    Par défaut problème entre float et int
    Bonjour,

    Je programme avec MPLAB un robot mobile (e-puck) avec le compilateur C30.

    J'utilise les bibliothèques de ce compilateur (math.h, stdlib.h) pour générer un nombre aléatoire.

    Voici une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int NombreAleatoire(int a, int b)
    {
    	float x;
    	x = rand()/RAND_MAX; // x dans [0,1]
    	x = x*(b-a); // x dans [0,b-a]
    	x = x + a; // x dans [a,b]
    	return floor(x);
    }
    Je n'ai hélas aucun moyen d'afficher des résultats dans une console (du moins je ne pense pas), mais quand le robot bouge tout se passe comme si cette fonction me renvoyait toujours l'entier a.

    D'où peut venir le problème?

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par F.R.E.D Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int NombreAleatoire(int a, int b)
    {
    	float x;
    	x = rand()/RAND_MAX; /* x à 0 */
    	x = x*(b-a); /* x à 0 */
    	x = x + a; /* x à a */
    	return floor(x);
    }
    Ce code pose problème :
    Est toujours égal à 0.

    Pourquoi ? rand() et RAND_MAX sont deux entiers, leur division est donc une division entière, comme 0 <= rand <= RAND_MAX, cela donne toujours zero.

    Solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int NombreAleatoire(int a, int b)
    {
    	float x = rand(); /* x dans 0 RAND_MAX*/
    	x /= RAND_MAX; /* x dans [0.f, 1.f] */
    	x *= (b-a); /* x dans [0.f,(float)(b-a)] */
    	x += a; /* x dans [(float)a, (float)b] */
    	return floor(x);
    }

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par F.R.E.D Voir le message
    Bonjour,

    Je programme avec MPLAB un robot mobile (e-puck) avec le compilateur C30.

    J'utilise les bibliothèques de ce compilateur (math.h, stdlib.h) pour générer un nombre aléatoire.

    Voici une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int NombreAleatoire(int a, int b)
    {
    	float x;
    	x = rand()/RAND_MAX; // x dans [0,1]
    	x = x*(b-a); // x dans [0,b-a]
    	x = x + a; // x dans [a,b]
    	return floor(x);
    }
    Je n'ai hélas aucun moyen d'afficher des résultats dans une console (du moins je ne pense pas), mais quand le robot bouge tout se passe comme si cette fonction me renvoyait toujours l'entier a.

    D'où peut venir le problème?
    En dehors de la correction déjà citée, la formule est fausse. Il manque un +1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include <stdlib.h>
    #include <stdio.h>
     
    int NombreAleatoire (int a, int b)
    {
       double x = rand ();
       x /= RAND_MAX;               /* x dans [0,1] */
       x *= (b - a + 1);            /* x dans [0,b-a] */
       x += a;                      /* x dans [a,b] */
       return x;
    }
     
    int main (void)
    {
       int i;
     
       for (i = 0; i < 160; i++)
       {
          int n = NombreAleatoire (1, 10);
          printf ("%4d", n);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       1   6   2   9   6   5   4   9   9   8   2   9   8   6   4   1   1   4   2   2
      10   5   2   1   1   4   6   6   7   7   2   7   5   4   1   7   8   9   6   4
       9   8  10  10   6   2   5   3   9   3   8   9  10  10   7   4   3   3   9   1
       4   1   7   1   1  10   3   3   6   7   9   8   5   3   8   5   5  10   8   2
       6   4   8   7   6   4   2   3   5   9   6  10   8   4   2   7   5   1   7   6
       2  10   2  10   7   4   5   1  10   7   2   9   9   6   2   2   9   5   2   6
       8   5   3   6   7   8   8   5   2   4   9   1   6   7   5   2  10  10   6   4
       5   4   9   4   5   3  10   3   8   6   2   8   9   4   6   9   1  10   6   1
     
    Process returned 0 (0x0)   execution time : 0.080 s
    Press any key to continue.
    On a des 10. Sans le '+1', on a pas de 10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
       1   6   2   8   6   5   4   9   8   7   2   8   7   5   3   1   1   4   2   2
       9   5   2   1   1   4   5   6   6   6   2   6   5   4   1   6   8   8   5   3
       8   7   9   9   5   2   5   3   8   2   8   8   9   9   6   4   3   3   8   1
       4   1   7   1   1   9   3   3   6   7   8   7   5   2   7   5   5   9   7   1
       6   4   7   6   6   4   2   3   4   8   5   9   7   4   2   6   5   1   7   5
       2   9   2   9   7   3   4   1   9   7   2   8   8   6   2   2   8   5   2   5
       7   4   3   6   7   7   7   5   2   4   8   1   5   6   4   1   9   9   5   4
       5   4   8   3   5   3   9   3   7   6   2   7   8   4   5   9   1   9   6   1
     
    Process returned 0 (0x0)   execution time : 0.091 s
    Press any key to continue.
    Détails et expérimentations :

    http://emmanuel-delahaye.developpez.com/notes.htm#rand

    Faut pas hésiter à faire des tests unitaires sur les fonctions. Installe Code::Blocks sur ton PC...

    Quand je développais en C pour des cartes électroniques avec 68k ou Power PC (32-bit big endian), j'écrivais et testais quasiment tout le code sur PC avec Borland C++ 3.1 (x86 16-bit little endian). Ça apprend à écrire du code portable !

Discussions similaires

  1. Problème entre IB 6.0 et Access 2000
    Par Polux63 dans le forum InterBase
    Réponses: 3
    Dernier message: 19/04/2004, 10h34
  2. Problème entre Dev-c++ et Borland c++ compiler 5.5
    Par Argonz dans le forum Dev-C++
    Réponses: 6
    Dernier message: 21/10/2003, 16h21
  3. [IB701] problème de float ??
    Par BoeufBrocoli dans le forum InterBase
    Réponses: 5
    Dernier message: 15/09/2003, 14h15
  4. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15
  5. [ODBC] Problème entre access et ODBC
    Par StephCal dans le forum Access
    Réponses: 4
    Dernier message: 09/07/2003, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo