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 :

de float à int : partie entière automatique ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut de float à int : partie entière automatique ?
    Bonjour,

    Il me semble qu'avec ce code, n est la partie entière de x :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     float x=2.11;
     int n;
     n=x;
    c'est bien vrai ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Je me permets de poser la même question avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     float x=2.73;
     int n;
     n=x;

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Médinoc
    Je me permets de poser la même question avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     float x=2.73;
     int n;
     n=x;
    When a finite value of real floating type is converted to an integer type other than _Bool,
    the fractional part is discarded (i.e., the value is truncated toward zero). If the value of
    the integral part cannot be represented by the integer type, the behavior is undefined.50)
    selon la norme Draft 9899 chapitre 6.3.1.4 point 1

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Oui pour ces deux cas on récupère la valeur 2, on arrondit donc toujours au nombre entier inférieur.

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    ça ne devrait pas compiler, avec les options de compilations nécessaires, mais qu'est ce qui vous empêche de faire le teste ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    1. La flemme.
    2. La peur du "dépendant de l'implémentation" : Il fallait la norme.
    3. L'effet "Il a osé, alors j'ose aussi".

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par gege2061
    ça ne devrait pas compiler, avec les options de compilations nécessaires, mais qu'est ce qui vous empêche de faire le test ?
    Pourquoi cela ne devrait-il pas compiler ? Affecter un flottant a un entier est tout a fait prevu par le langage, comme la citation de la norme par seriousme a montre.

    Et effectivement, un test prend environ 3 sec. Mais c'est plus fun de faire bosser les autres, j'imagine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
     
    int main(void)
    {
      float x = 2.11;
      int n;
     
      n = x;
      printf("%d\n", n);
     
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ gcc -W -Wall -ansi -pedantic toto.c -o toto
    $ ./toto
    2

  8. #8
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par DaZumba
    Pourquoi cela ne devrait-il pas compiler ?
    Je n'ai pas d'erreur non plus Normalement le compilateur devrai t'avertir qu'il y a une perte de donnée possible Mais c'était juste histoire de leur faire sortir le compilateur

  9. #9
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par gege2061
    Je n'ai pas d'erreur non plus Normalement le compilateur devrai t'avertir qu'il y a une perte de donnée possible
    Oui car c'est un comportement indéfini si le "float" est trop grand:
    If the value of the integral part cannot be represented by the integer type, the behavior is undefined.

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par homeostasie
    Oui pour ces deux cas on récupère la valeur 2, on arrondit donc toujours au nombre entier inférieur.

    Non, vers 0. Il y a une différence pour les nombres négatifs. Si on veut l'entier inférieur, il faut utiliser floor et ceil pour l'entier supérieur; ces deux fonctions retournent des doubles, mais tu peux après utiliser la conversion implicite d'entier en double

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Au fait: Est-ce que floor(2.5) est garanti par la norme retourner une valeur qui ne soit pas inférieure à 2 (il faut que ce soit 2.00000000000001 plutôt que 1.99999999999999) ?
    (Est-ce que la norme garantit que (int)floor(2.5) rendra toujours 2 sur toutes les plate-formes et jamais 1 ?)

    man floor ne me dit rien du tout à ce sujet...

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par gege2061
    Je n'ai pas d'erreur non plus Normalement le compilateur devrai t'avertir qu'il y a une perte de donnée possible Mais c'était juste histoire de leur faire sortir le compilateur
    Héhé... Les avertissements, s'il y en a, n'empechent nullement la compilation...

    Ils sont "juste là" pour attirer ton attention sur le fait que tu adoptes un comportement "qui pourrait éventuellement poser problème" ou "dont il ne voit pas l'utilité"
    (exemples:
    warning variable is defined but never used "pourquoi donc s'em...-t-il à déclarer une variable sans l'utiliser"
    warning comparaison between signed and unsigned "a-t-il pensé au fait qu'il y a un bit en moins pour le signed int que pour le unsigned (il sert au signe et n'entre pas dans l'évaluation de la valeur absolue du int)"
    warning comparaison between real and integer is never true "du fait de la différence de format et de la représentation en mémoire des entier et des reels, il y a bien plus de chances que la comparaison soit fausse que de chances qu'elle soit juste"
    et tous ceux qui ont trait à la mauvaise utilisation des pointeurs (risque de plantage aléatoires))

    On peut "estimer" (à tord ou à raison) que le compilateur pourrait suivre un raisonnement du genre de "les gens savent bien que, si s'ils transforment un réel en entier, ils perdront la partie decimale"

    Le but des avertissements n'est que de signaler qu'il y a un risque potentiel de comportement aléatoire

    J'ai meme eu un prof qui, quand il demandait un travail en C, allait en priorité voir les lignes sur lesquelles apparaissaient les avertissements...

    Comme, bien souvent, il s'agissait de lignes où des pointeurs étaient mis en oeuvre, il se doutait que la ligne risquait réellement de poser un probleme à un moment ou un autre

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Au fait: Est-ce que floor(2.5) est garanti par la norme retourner une valeur qui ne soit pas inférieure à 2
    "floor" se contente de prendre la partie entière et de la renvoyer convertie en "double" donc à priori pas de problème.

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Médinoc
    Au fait: Est-ce que floor(2.5) est garanti par la norme retourner une valeur qui ne soit pas inférieure à 2 (il faut que ce soit 2.00000000000001 plutôt que 1.99999999999999) ?
    (Est-ce que la norme garantit que (int)floor(2.5) rendra toujours 2 sur toutes les plate-formes et jamais 1 ?)
    J'ai pas envie de me lancer dans une exégèse de la norme pour voir ce qu'elle garanti à ce sujet. Mais en pratique je ne vois pas de raisons pour laquelle une implémentation ne le ferait pas: aucun format de flottant que je connais permet de représenter un nombre sans pouvoir représenter l'entier immédiatement inférieur ou égal. La plupart des surprises qu'on a avec les flottants sont dues à l'impossibilité de représenter exactement le nombre exact qui est le bon résultat d'un calcul.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 578
    Points
    41 578
    Par défaut
    Ah, suis-je bête: La partie entière est exacte, en effet...

  16. #16
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	float t_f = (float)10000003.0 + (-(float)10000000.0 + (float)7.501);
    	printf("%f\n",t_f);
     
    	t_f = ((float)10000003.0 -(float)10000000.0) + (float)7.501;
    	printf("%f\n",t_f);
    Dans les trucs qui peuvent surprendre...

    source

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    ça ne devrait pas compiler, avec les options de compilations nécessaires, mais qu'est ce qui vous empêche de faire le test ?
    Je l'ai fait! (et avec plusieurs valeurs...) je me demandais en fait si c'était correct de faire ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Erreur de calcul de la fonction Int() partie entiére d'un Nb en VB
    Par GOLDINGMAROC dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 01/03/2012, 17h31
  2. Utilisation de la Fonction Int() (partie entière)
    Par petiteabeille64 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/04/2009, 14h40
  3. Parties entière et décimale d'un float
    Par amateurc dans le forum Ada
    Réponses: 15
    Dernier message: 31/07/2008, 20h42
  4. Garder uniquement la partie entière d'un float
    Par The Molo dans le forum ASP
    Réponses: 16
    Dernier message: 07/02/2008, 15h11
  5. Garder la partie entière d'un float ??
    Par tintin72 dans le forum C++
    Réponses: 2
    Dernier message: 09/11/2005, 11h03

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