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 :

Nombres de chiffres / Précision d'un calcul [Python 3.X]


Sujet :

Calcul scientifique Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Nombres de chiffres / Précision d'un calcul
    Bonjour,

    Je tape la série d'instructions suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    a=int(10**16+1)*123545
    b=int(a/123545)
    c=int(b-10**16)
    print(c)
    Je pensais être en droit d'obtenir 1 mais python me renvoie 0 !!! Il semble que ce soit une erreur d'arrondis mais je ne parviens pas à régler le nombre de chiffres que python doit prendre en compte dans le calcul...
    Une idée ?

    Merci à tous et bonne journée,

    HT

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Le résultat n'est pas le même entre python 2 et 3.

    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
     
    Python 2.7.3 (default, Dec 18 2014, 19:03:52) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    1235450000000000123545L
    >>> a = int(10**16+1)*123545
    >>> a
    1235450000000000123545L
    >>> b = int(a/123545)
    >>> b
    10000000000000001L
    >>> c = b-10**16
    >>> c
    1L
    >>> int(c)
    1
     
    .................
    Python 3.2.3 (default, Feb 27 2014, 21:33:50) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = int(10**16+1)*123545
    >>> a
    1235450000000000123545
    >>> b = int(a/123545)
    >>> b
    10000000000000000
    >>> c = b-10**16
    >>> c
    0
    Je pense que s'il y a imprécision ce doit être du côté de Python 2.


    Edit: Testé dans une calculatrice, le résultat est bien 1, si personne n'a une explication, ça vaut la peine de poser la question sur la ML de Python.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    Oui, il me semble que le type long a disparu dans la version 3.x de Python mais d'après ce que j'ai lu, le type int peut avoir n'importe quel nombre de chiffres. Ce qui ne semble pas être le cas sur cet exemple...
    Si quelqu'un d'autre a une idée pour contourner ce problème, je suis preneur !

    Bonne journée à tous

  4. #4
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Bonjour,
    Hum,
    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
    >>> a = int(10**16+1)*123545
    >>> type(a)
    <class 'int'>
    >>> a
    1235450000000000123545
    >>> b = a / 123545
    >>> type(b)
    <class 'float'>
    >>> b = a // 123545
    >>> type(b)
    <class 'int'>
    >>> b
    10000000000000001
    >>> 
    >>> c = b-10**16
    >>> type(c)
    <class 'int'>
    >>> c
    1
    >>>
    (Python 3)

    Clodion

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

    Il y a une différence importante entre Python 2 et Python 3:

    - avec Python 2, pour des raisons historiques, la division simple ('/') entre 2 nombres entiers est une division entière.

    - avec Python 3, la même division simple, même entre 2 nombres entiers, est une division réelle qui donne un résultat flottant. Pour avoir une division entière, il faut utiliser le double slash ('//').

    Ainsi, dans le calcul de b avec Python 3, il suffit de faire: a//123545 pour trouver exactement le même résultat qu'avec Python 2: a/123545 (le int est d'ailleurs inutile dans ce cas).

    Cette clarification ne doit pas faire oublier qu'un nombre de type float est stocké dans la machine avec un nombre fini de bits, et que dans de nombreux cas, on ne retrouve pas le nombre exact qu'on a stocké précédemment. Par exemple 1/3=0.333333333......

    Et quand on veut passer d'un nombre flottant à un entier, il convient de définir le type d'arrondi voulu. L'instruction int ne fait pas d'arrondi, c'est à dire qu'il coupe les chiffres après la virgule: donc, int(1.0-1.0e-16) donne 0. Il faudrait utiliser plutôt une instruction d'arrondi comme round. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    print(int(1.0-1.0e-16))
    0
     
    print(int(round(1.0-1.0e-16, 0)))
    1

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2013
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2013
    Messages : 35
    Points : 31
    Points
    31
    Par défaut
    OK Merci pour vos réponses !

    Bonne journée à tous,

    HT

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

Discussions similaires

  1. Comment calculer le nombre de chiffres d'un entier ?
    Par fearyourself dans le forum Télécharger
    Réponses: 23
    Dernier message: 10/01/2012, 17h29
  2. [MySQL] Précision du nombre de chiffre en php
    Par stefsas dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 03/03/2010, 19h40
  3. Simple précision et nombre de chiffres significatifs
    Par michubuntu dans le forum Fortran
    Réponses: 3
    Dernier message: 11/03/2008, 18h49
  4. Calculer le nombres de chiffres répétitif
    Par cre3000 dans le forum Langage
    Réponses: 14
    Dernier message: 03/02/2008, 20h30
  5. [MFC] Nombre de chiffres après la virgule
    Par karl3i dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 13h04

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