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

  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
    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.

  5. #5
    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.

  6. #6
    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

  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
    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..

  8. #8
    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.

  9. #9
    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...

  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
    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...

  11. #11
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Par défaut
    La plus correcte est un concept variable car cela peux prendre différents critères
    Correcte en terme de maintenance de code et de compréhension : La première
    Correcte en terme de codage simple : La deuxième

    Je fais beaucoup de maintenance de code et de corrections de bug donc je prend la première car pas besoin de prendre la place du compilo pour savoir ce qu'il se passe même si le code est pas optimisé pour la compil.

    Bref ça me donne pas mon arbre de recherche tout ça

  12. #12
    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
    la norme C99 dit :

    1 When a float is promoted to double or long double, or a double is promoted
    to long double, its value is unchanged.
    2 When a double is demoted to float, a long double is demoted to double or
    float, or a value being represented in greater precision and range than required by its semantic type (see 6.3.1.8) is explicitly converted to its semantic type, if the value being converted can be represented exactly in the new type, it is unchanged. If the value being converted is in the range of values that can be represented
    et aussi :

    1 Many operators that expect operands of arithmetic type cause conversions and yield result types in a similar way. The purpose is to determine a common real type for the operands and result. For the specified operands, each operand is converted, without change of type domain, to a type whose corresponding real type is the common real type. Unless explicitly stated otherwise, the common real type is also the corresponding real type of
    the result
    , whose type domain is the type domain of the operands if they are the same, and complex otherwise. This pattern is called the usual arithmetic conversions: First, if the corresponding real type of either operand is long double, the other operand is converted, without change of type domain, to a type whose corresponding real type is long double.

    Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose
    corresponding real type is double. Otherwise, if the corresponding real type of either operand is float, the other operand is converted, without change of type domain, to a type whose corresponding real type is float.

    ...
    The values of floating operands and of the results of floating expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.52)

    52) The cast and assignment operators are still required to perform their specified conversions as described in 6.3.1.4 and 6.3.1.5.
    Donc oui le signe '=' pourrait éventuellement générer un warning, qui est idiot dans ce cas puisqu'avec 2 constantes et une varaible float et un résultat float.. Mais si on suit ce que dit la norme, dans le cas de figure présenté ci-dessus, cela ne devrait pas générer de warning..

  13. #13
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 40
    Par défaut
    Il est évident que la norme donne le bon procédé mais tout dépend du compilo comme je l'ai marqué ... puis quand on a utilisé Visual on doute de tout lol.

    Bref j'arrête là car tout a été dit.

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