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

Calcul scientifique Python Discussion :

Le mystère 456


Sujet :

Calcul scientifique Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut Le mystère 456
    Bonjour,

    Voici un petit code (tiré d'un beaucoup plus gros projet), dont la fonction est l'optimisation de l'affichage des nombres réels.
    S'y trouve une ligne destiné à vérifier si par hasard, le nombre n'est pas entier (v_ % 1).
    Le problème, c'est qu'avec le nombre 456, j'obtiens 1.0 (au lieu de 0.0) !!!
    Chose qui ne se produit pas si je tape 456.0 % 1 depuis l'IDLE ...

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #!/usr/bin/env python
    # -*- coding: ISO-8859-1 -*-
     
    import scipy
     
    ##########################################################################################################
    def decade(n):
        """ Retourne la decade dans laquelle se trouve <n>
        """
        l = scipy.log10(abs(n))
        if l == 0.0:
            s = 0
        else:
            s = (scipy.sign(l)-1)/2
        return int(l) + s
     
    ##########################################################################################################
    def roundN(v, nc = 4):
        """ Arrondi à <nc> chiffres significatifs
        """
        if v == 0.0: return 0.0, 1
        dec = decade(v)
        mult = 10**dec
     
        vv = round(float(v)/mult, nc-1)*mult
     
        return vv, dec
     
    #############################################################################################################
    def strSc(v, decade = 0, nbChiffres = 4):
        """ Renvoie un string formaté du nombre <v>
        """
        print v,
        if v == 0.0:
            return "0"
     
        v_, decade = roundN(v)
     
        print v_, decade, type(v_)
        print "  -->", v_ % 1
     
        if v_ % 1 == 0.0:
            v_ = int(v_)
     
        return str(v_)
     
     
     
    for n in [454, 455, 456, 457, 458]:
        print strSc(n)
    Voila plusieurs heures que je tourne tout ça dans tous les sens et ça commence à me chauffer.

    C'est surement un truc tout bête, mais la rage m'aveugle !

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je ne sais pas ce que tu entends par "optimisation de l'affichage des nombres réels", mais ça me parait bien compliqué.

    Avant de chercher le bug de ton code, tu es sûr qu'un simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    print "%.4f" % 456
    456.0000
    ne suffirait pas?

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Je ne sais pas ce que tu entends par "optimisation de l'affichage des nombres réels"
    J'en conviens, l'appellation est un peu fourre tout ...

    roundN est une fonction qui arrondi un réel avec un nombre de chiffres de précision donné (pas le nombre de chiffres derrière la virgule !)
    0.00372624975 devient 0.003726 pour 4 chiffres de précision ...
    et 97365222674.73 devient 97360000000.0

    Ensuite strSc (code très partiel ici) est sensé choisir la notation la plus "courte", ou en tout cas la forme la plus facile à lire du nombre, et renvoyer un string.

    Donc NON : "%.4f" qui donne "456.0000" ne me suffit pas.

    Moi je veux "456" !! et je ne compte pas me laisser faire par ce maudit nombre 456 () qui refuse de faire comme ses voisins 455 et 457 !!

    Ceci étant dit, si tu n'arrives pas à reproduire ce phénomène, si je suis le seul chez qui ça se produit (un peu comme dans ce post : http://www.developpez.net/forums/d86...alcul-racines/) je vais commencer à croire que c'est mon PC qui a un problème .....

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Voilà un petit code qui semble répondre à tes contraintes. Il utilise les fonctions d'affichage de Python. Cette fonction te retourne un nombre, mais il pourrait aussi retourner ce nombre sous forme de chaine de caractère pour l'affichage:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def form(x, n=4):
        f =  '%.' + ('%d' % (n-1)) + 'e'
        z = float(f % (x))
        if z%1 == 0:
            return int(z)
        else:
            return z
     
    print form(0.00372624975)
    print form(97365222674.73)
    print form(456.000)
    Ce qui affiche:

    0.003726
    97370000000
    456
    Je l'ai paramétré avec n=nb de chiffres significatifs voulus (4 par défaut).

    Avec n=5, on trouve:

    0.0037262
    97365000000
    456
    On voit avec cet exemple que le dernier chiffre significatif à droite est arrondi en fonction des chiffres suivants qui ont été éliminés.

    Tyrtamos

    [edit]: Et si tu acceptes que 456 puisse être restitué comme 456.0, tu peux supprimer le test z%1 == 0.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup

    Voila un code redoutablement efficace.
    Bon ! Je dois garder la fonction "decade" qui sert à autre chose, mais j'adopte 'form" !!

    Le "mystère 456" n'est pas résolu, mais voila une bonne façon de le contourner.


    Merci encore !

    PS : pour info, le projet en question est ici : http://home.gna.org/pysylic/

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/09/2006, 23h35
  2. [VB] Appli Winsock | mystère du code
    Par ouar dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 15/04/2006, 10h21
  3. Réponses: 22
    Dernier message: 14/04/2006, 17h01
  4. [ActionListener] mystère et boule de gomme
    Par jcodeunpeu dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 23/12/2005, 22h09
  5. [C#] [WinForms] GDI et ses mystères
    Par stailer dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/10/2004, 18h27

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