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 :

Cast de float


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut Cast de float
    Bonjour,

    Voici ce que je code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unsigned int C4;
    float UT1;
    ..
    	UT1 = (float) (8.0 * (float)C5 + 10000.0);	
    //ou bien
    	UT1 =  8 * (float)C5 + 10000;	
    ...
    Laquelle de ces écriture est la plus correcte?
    Merci

    Pegase.90

  2. #2
    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
    lol aucune précisément...


    ce serait :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int C4;
    float UT1;
     
    	UT1 =  8.0 * (float)C4 + 10000.0;
    ...
    mais par défaut la norme indique la promotion automatique d'un int en float ou double lors d'une telle opération. Donc on peut s'en passer (dans ce cas, car là c'est une multiplication). Dans le cas d'une division, il faudrait le préciser pour ne pas avoir une division entière.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int C4;
    float UT1;
     
    	UT1 =  8.0 * (float)C4 + 10000.0;
    ...
    Dans ce cas j'ai un warning"Warning 1 : implicit narrowing cast: '='

    Pegase.90

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Par défaut
    Citation Envoyé par pegase.90
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unsigned int C4;
    float UT1;
     
    	UT1 =  8.0 * (float)C4 + 10000.0;
    ...
    Dans ce cas j'ai un warning"Warning 1 : implicit narrowing cast: '='

    Pegase.90
    A vérifier mais les réels sont des double (long double?) qui sont plus gros que les float donc tu as un risque de pertes de données .... donc warning.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 37
    Par défaut
    Citation Envoyé par Darwiz
    A vérifier mais les réels sont des double (long double?) qui sont plus gros que les float donc tu as un risque de pertes de données .... donc warning.
    Dans mon système:

    char: 8-bit integer;
    short int: 16-bit integer;
    int: 16-bit integer;
    long int: 32-bit integer;
    float: 32-bit IEEE floating point number;
    double: 64-bit IEEE floating point number;
    long double: 64-bit IEEE floating point number;
    int *pointer: 16-bit word address in data space,
    char *pointer: 17-bit byte address in data space (size=32 bits),
    int (*pointer)(): 24-bit address in code space (size=32 bits).

    Pegase.90

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Par défaut
    float 32 bits (4 octets)
    double 64 bits (8 octets)

    quand tu fais 8.0 * (float)C5

    D'après mes souvenirs chaque compilateur a sa manière de gérer les réels mais si le compilo considère par défaut que c'est un double on a donc :

    8.0 est considéré comme un double
    C5 avec le cast est donc un float

    double * float = double

    et tu fais
    UT1 = double

    or UT1 est un float donc tu veux mettre un double dans un float
    le compilo fait un cast implicite de double en float ... donc Warning, rien de grave ça fait pas joli donc on met un cast comme tu l'as fait dans ton premier code.

  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
    Citation Envoyé par Darwiz
    A vérifier mais les réels sont des double (long double?) qui sont plus gros que les float donc tu as un risque de pertes de données .... donc warning.
    bah...

    Sa variable est un float, il caste avec un float, donc ton raisonnment est totalement faux.

    voir ci-dessous...

  8. #8
    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
    et le warning est certainment un mauvais réglage de compilateur ou un compilateur non conforme à la norme, pusique par défaut cela doit être PROMU au cours de l'opération en fonction du résultat...

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Par défaut
    Pourquoi aucune ????

    UT1 = (float) (8.0 * (float)C5 + 10000.0);
    celle ci fonctionnera même si il y'a des cast inutiles

    Inutile de caster le C5 en float il y'a conversion du fait que tu multiplies par un nombre à virgule (8.0) le cast global assure la converion mais est facultatif.

    UT1 = 8 * (float)C5 + 10000;
    Celle-ci devrait également fonctionner car du fait de ton cast tu as une multiplication par un float donc résultat en float

    En terme de compréhension la première est peut être plus parlante mais certains coder se demanderont pourquoi tu fais tout ces casts.
    Le plus rapide est de faire
    UT1 = 8.0 * C5 + 10000;


    Pour répondre à ta question je dirais que la plus correcte est la première ... juste pour une histoire de compréhension.

  10. #10
    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 Darwiz
    Pourquoi aucune ????
    Parce que le PO demande "quelle est la plus correcte"..

    Citation Envoyé par Darwiz
    UT1 = (float) (8.0 * (float)C5 + 10000.0);
    celle ci fonctionnera même si il y'a des cast inutiles

    Inutile de caster le C5 en float il y'a conversion du fait que tu multiplies par un nombre à virgule (8.0) le cast global assure la converion mais est facultatif.

    UT1 = 8 * (float)C5 + 10000;
    Celle-ci devrait également fonctionner car du fait de ton cast tu as une multiplication par un float donc résultat en float

    En terme de compréhension la première est peut être plus parlante mais certains coder se demanderont pourquoi tu fais tout ces casts.
    Le plus rapide est de faire
    UT1 = 8.0 * C5 + 10000;


    Pour répondre à ta question je dirais que la plus correcte est la première ... juste pour une histoire de compréhension.
    eh bé NON.. Voir plus haut... La plus correcte est la 2 parmi celle proposée, puisqu'elle n'a qu'un cast..

Discussions similaires

  1. CAST de float en Varchar
    Par olibara dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/05/2011, 12h39
  2. Cast de float en long
    Par LDPDC dans le forum Général Java
    Réponses: 3
    Dernier message: 06/05/2009, 15h51
  3. [C] cast float *
    Par vince3320 dans le forum C
    Réponses: 14
    Dernier message: 26/02/2008, 16h12
  4. Réponses: 9
    Dernier message: 01/08/2007, 12h20
  5. cast float vers int
    Par planeur2007 dans le forum C
    Réponses: 5
    Dernier message: 13/03/2007, 18h39

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