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 de types ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut Problème de types ?
    Bonsoir tout le monde, dans la continuité du problème que j'avais posé plus tôt, je me retrouve avec un code qui m'oblige à convertir des entiers en réels et vice-versa.
    Voyez plutôt :
    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
    25
    26
    27
    28
    29
    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    
    int main(){
    unsigned int n;
    double a,b,c,d;
    unsigned int e;
    double or,m;
    double result;
    while((scanf("%u",&n))==1){
    if(n==0){
    return(0);
    }if(n==1){
    printf("%d\n",1);
    }else{
    m=(double) n;
    or=(1+sqrt(5))/2;
    a=3-sqrt(5);
    b=sqrt(5)-1;
    c=sqrt(pow(or,a));
    d=sqrt(pow(m,b));
    result=c*d;
    e=(unsigned int) result;
    printf("%u\n",e);
    }
    }
    return(0);
    }
    Le problème qui se pose, est que pour certaines valeurs de n que je rentre, j'obtiens le résultat attendu, tandis que pour d'autres, le résultat n'est pas le bon à quelquechose près (+1, -1, plus une centaine, ou moins une centaine ...).
    D'après vous, est-ce que les conversions entre doubles et non-signés sont faites de la bonne manière ?
    Merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    quelles sont les valeurs que tu entres? fait attention au dépassement de capacité... si ton double vaut 10000000 il y aura un souci lors de la conversion en unsigned int je pense....

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Citation Envoyé par Elstak
    quelles sont les valeurs que tu entres? fait attention au dépassement de capacité... si ton double vaut 10000000 il y aura un souci lors de la conversion en unsigned int je pense....
    Par exemple, en entrant 10, je devrais obtenir 5, tandis que là j'ai 4 (c'est une certitude).
    Alors qu'en entrant 123456 ou 9999, j'obtiens exactement les valeurs attendues.
    Le problème se pose donc aussi sur les "petits" nombres.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Superne0
    Par exemple, en entrant 10, je devrais obtenir 5, tandis que là j'ai 4 (c'est une certitude).
    .
    t'es sûr ?

    j'ai pas de calculatrice sous la main, mais en ordre de grandeur :

    sqrt(5) = 2.1


    or = (2.1 + 1.0)/2.0 = 1.6
    a = 3 - 2.1 = 0.9
    b = 2.1 - 1 = 1.1

    Donc

    c = sqrt ( 1.6 ^ 0.9 ) = sqrt ( 1.4 ) = 1.15
    d = sqrt ( 10 ^ 1.1 ) = sqrt ( 11 ) = 3.4

    result = 3.4 * 1.15 = 3.9


  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Citation Envoyé par souviron34
    t'es sûr ?

    j'ai pas de calculatrice sous la main, mais en ordre de grandeur :

    sqrt(5) = 2.1


    or = (2.1 + 1.0)/2.0 = 1.6
    a = 3 - 2.1 = 0.9
    b = 2.1 - 1 = 1.1

    Donc

    c = sqrt ( 1.6 ^ 0.9 ) = sqrt ( 1.4 ) = 1.15
    d = sqrt ( 10 ^ 1.1 ) = sqrt ( 11 ) = 3.4

    result = 3.4 * 1.15 = 3.9

    J'obtiens 4 pour 10 comme entrée (ce qui semble bon), mais la valeur qui devrait être renvoyée est 5.
    Je sais pas trop ce qui cloche dans le code, mais ce qui est bizarre c'est que comme je l'ai dit, il va te renvoyer une valeur à côté pour une valeur comme 10, alors que pour 123456 il va te renvoyer celle attendue.
    J'avoue que la conversion réel/entier (et vice-versa), c'est pas le top pour la machine ...

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Superne0
    J'obtiens 4 pour 10 comme entrée (ce qui semble bon), mais la valeur qui devrait être renvoyée est 5.
    Je re..

    comment expliques-tu :

    ce qui semble bon
    et

    la valeur qui devrait être renvoyée est 5.
    dans la même phrase ???????

    Soit tu exprimes mal ton problème, soit ta logique me dépasse...

    Je vais aller faire un petit tour sur Linux pour vérifier les valeurs (comme j'ai dit j'ai pas de calculatrice, là), mais je suis quasi sûr que mon ordre de grandeur est correct, et que tu devrais bien obtenir 4 pour 10...

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    D'abord :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    or=(1.0+sqrt(5.0))/2.0;
    a=3.0-sqrt(5.0);
    b=sqrt(5.0)-1.0;
    c=sqrt(pow(or,a));
    d=sqrt(pow(m,b));
    Ensuite, pour avoir la meilleure valeur, (et il y a eu plusieurs posts dans les dernières semaines sur ce problème), il faut prévoir l'arrondi , puisque int va tronquer.

    Donc normalement , si tu veux l'entier le plus proche du double calculé, il faudrait faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e=(unsigned int) (result+0.5);
    Enfin, comme on l'a dit, c'est très dangereux de faire ça, car tu fais des multiplications de puissances, ça monte vite, ces bêtes-là...

Discussions similaires

  1. [ tinyint et char ] problème de type
    Par shirya dans le forum Installation
    Réponses: 3
    Dernier message: 05/11/2005, 07h08
  2. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  3. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 20h23
  4. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  5. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 11h04

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