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

Python Discussion :

Problème division de nombres réels


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de Pandapi
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 38
    Par défaut Problème division de nombres réels
    Bonjour,

    J'ai un soucis actuellement en Python et je n'arrive pas à comprendre d'où ça vient, si quelqu'un pouvait m'aider...

    Je fais une division renvoyant un nombre entre 0 et 1, mais le résultat est toujours 0.
    Evidemment j'ai essayer toutes les façon possible d'assigner float au résultat (cast, ajout de .0)

    Voici mon code actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        x = denom_i*denom_k
        y = numerateur
        z = (numerateur + 0.0)/(denom_i*denom_k)
     
        print(type(z))
     
        print("%i / %i = %i" % (y,x,z))
    Et le résultat en console :

    <type 'float'>
    340 / 1012 = 0
    <type 'float'>
    281 / 1187 = 0
    <type 'float'>
    6 / 875 = 0
    <type 'float'>
    172 / 903 = 0
    <type 'float'>
    -156 / 1104 = 0
    <type 'float'>
    -336 / 1457 = 0
    Merci d'avance pour l'aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Le problème n'est pas la division mais l'affichage du résultat: "%i" convertit la valeur en nombre entier avant de l'afficher, utilise plutôt "%f" ou "%g"...

  3. #3
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    pas mieux que dividee, mais juste un petit conseil concernant la lisibilité. Dans l'exemple ci dessous, numerateur et denominateur sont des entiers. Quand tu veux explicitement travailler avec des flottants, autant l'écrire dans le code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    numerateur = 4
    denominateur = 3
    resultat = float(numerateur)/float(denominateur)
    print("%f / %f = %f"%(numerateur, denominateur, resultat))
    A+

    Pfeuh

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Je ne suis pas vraiment d’accord… À tout le moins en py3, l’opérateur / retourne toujours un float, même si ses opérandes sont des int –*il faut utiliser l’opérateur // pour récupérer un entier (si les deux opérandes sont des int, sinon, c’est aussi un float qui est retourné*!)…

  5. #5
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par mont29 Voir le message
    Je ne suis pas vraiment d’accord… À tout le moins en py3
    Je bosse en 2.7, c'est donc une subtilité qui m'a échappé. La division en C n'a pas elle non plus le comportement du python 3, loin de là. Je ne connais pas plus que ça php, java et autres langages inspirés du C mais je pense qu'ils ont le même comportement. Donc de mon point de vue, mon raisonnement se tient en programmation généraliste. Maintenant si en dehors de python 3 il n'y a rien... Pour la raison évoquée plus haut, je pense même que ce changement de comportement (que j'ignorais) entre py2 et py3 n'est pas des plus heureux.

    A+

    Pfeuh

    Code python 2.7 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    numerateur = 4
    denominateur = 3
    print type(numerateur), type(denominateur)
    resultat = numerateur/denominateur
    print("%f / %f = %f"%(numerateur, denominateur, resultat))
    resultat = float(numerateur)/float(denominateur)
    print("%f / %f = %f"%(numerateur, denominateur, resultat))
    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <type 'int'> <type 'int'>
    4.000000 / 3.000000 = 1.000000
    4.000000 / 3.000000 = 1.333333

    Code C de base : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void)
    {
        int numerateur = 4;
        int denominateur = 3;
        float fresult1 = numerateur / denominateur;
        float fresult2 = (float)numerateur / (float)denominateur;
        printf("%f\n%f\n", fresult1, fresult2);
        return 0;
    }
    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1.000000
    1.333333

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    En Python v2.x, à partir de la v2.2, la bonne pratique est de démarrer tout code par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from __future__ import division
    Cela permet d'avoir le même comportement qu'avec Python v3: la division '/' entre 2 entiers donne un flottant.

    Voir PEP 238.

  7. #7
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    @pfeuh*: Je sais bien que ce n’est pas le cas en C ni dans la plupart des autres langages… C’est bien pour ça que j’adore Python, il est terriblement “futé”*!

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

Discussions similaires

  1. Problème de calcul et d'affichage de nombres réels
    Par Luke spywoker dans le forum Débuter
    Réponses: 19
    Dernier message: 28/02/2013, 11h27
  2. Problème avec INSERT INTO et nombre réel
    Par minooo dans le forum JDBC
    Réponses: 4
    Dernier message: 09/09/2011, 14h10
  3. Problème du nombre réel
    Par haorua1983 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 17/03/2007, 10h53
  4. Problème lecture de nombre dans un fichier en c++
    Par knecmotet dans le forum C++
    Réponses: 1
    Dernier message: 28/10/2004, 15h48
  5. Stocker un nombre réel
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/04/2004, 08h59

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