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 :

Probleme de division de grands entiers.


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Par défaut Probleme de division de grands entiers.
    Bonjour,

    J'ai fait un programme pour factoriser les grands entiers, il fonctionne jusqu'a des nombres d'environs 20 decimales mais avec des nombres plus grands il tourne en boucle. Au debut je pensais que c'etait mon code qui avait un probleme, mais en debogan mon code je me suis appercu que Python fesait des erreurs lors de division de certains grands nombres. J'ai installe Python 3.6.1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n=18157405041894350
    m=n/2
    print("m=", m)
    Normalement en executant le code ci-dessus le resultat devrait etre : 9078702520947175
    Mais Python m'affiche 9078702520947176.

    Est-ce que vous pouvez verifier si vous avez le meme probleme en executant mon code sur vos pc ? Et sinon savez-vous d'ou peut venir le probleme ?

    Je vous remercie.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Citation Envoyé par fred61 Voir le message
    Et sinon savez-vous d'ou peut venir le probleme ?
    n / 2 retourne le nombre flottant le plus proche du résultat.
    n // 2 retourne l'entier inférieur (équivaut à floor).

    Python fait ce que vous lui demandez (mais peut être pas ce que vous pensiez qu'il ferait).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par fred61 Voir le message
    Est-ce que vous pouvez verifier si vous avez le meme probleme en executant mon code sur vos pc ?
    Salut fred61,

    Pour ma part voilà ce que j'obtiens sous Python 2.7.3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> n=18157405041894350
    >>> m=n/2
    >>> print("m=", m)
    ('m=', 9078702520947175L)
    >>>>>> print m
    9078702520947175
    Par contre je ne comprend pas ce que veux dire le L à la ligne 5.

  4. #4
    Membre confirmé Avatar de memento80
    Homme Profil pro
    Boulot : ne rentre pas dans une case
    Inscrit en
    Novembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Boulot : ne rentre pas dans une case
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2004
    Messages : 163
    Par défaut
    Bonjour,

    Citation Envoyé par nekcorp
    Par contre je ne comprend pas ce que veux dire le L à la ligne 5.
    De mémoire, c'est le type "long" (qui ne serait pas en Python3).

    Citation Envoyé par fred61
    Est-ce que vous pouvez verifier si vous avez le meme probleme en executant mon code sur vos pc ? Et sinon savez-vous d'ou peut venir le probleme ?
    J'utilisais le module Decimal pour gérer ce genre de problème. Inconvénient : il est très lent. Il y a probablement une meilleure solution... (?)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from decimal import Decimal
    n=Decimal(18157405041894350)
    m=n/2
    print("m=", m)
    m= 9078702520947175

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Par défaut
    Je vous remercie pour vos reponses mais je trouve quand meme ca etonnant, wiztricks tu me dis

    "n / 2 retourne le nombre flottant le plus proche du résultat"

    Le resultat de l'operation 18157405041894350/2 est 9078702520947175, et non 9078702520947176.0 comme le resultat obtenu avec Python, que ca soit un flottant ou non le resultat est faux, ce qui m'etonne pour un language utilise par des scientifiques.

    memento80, meme en utilisant le module Decimal j'obtient le meme resultat. Ce qui est etonnant c'est que le calcul est jusque quand je divise d'autres nombres, ca bug que pour certains nombres.

    (desole pour les accents, je suis a l'etranger avec un pc en qwerty).

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 172
    Par défaut
    J'ai essaye le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(18157405041894350, 18157405041894400, 2):
    	print(i, "/2=", i/2)
    Et j'obtient ca :
    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
    18157405041894350 /2= 9078702520947176.0
    18157405041894352 /2= 9078702520947176.0
    18157405041894354 /2= 9078702520947176.0
    18157405041894356 /2= 9078702520947178.0
    18157405041894358 /2= 9078702520947180.0
    18157405041894360 /2= 9078702520947180.0
    18157405041894362 /2= 9078702520947180.0
    18157405041894364 /2= 9078702520947182.0
    18157405041894366 /2= 9078702520947184.0
    18157405041894368 /2= 9078702520947184.0
    18157405041894370 /2= 9078702520947184.0
    18157405041894372 /2= 9078702520947186.0
    18157405041894374 /2= 9078702520947188.0
    18157405041894376 /2= 9078702520947188.0
    18157405041894378 /2= 9078702520947188.0
    18157405041894380 /2= 9078702520947190.0
    18157405041894382 /2= 9078702520947192.0
    18157405041894384 /2= 9078702520947192.0
    18157405041894386 /2= 9078702520947192.0
    18157405041894388 /2= 9078702520947194.0
    18157405041894390 /2= 9078702520947196.0
    18157405041894392 /2= 9078702520947196.0
    18157405041894394 /2= 9078702520947196.0
    18157405041894396 /2= 9078702520947198.0
    18157405041894398 /2= 9078702520947200.0
    C'est problematique, comment obtenir les bons resultats ?
    Merci.

  7. #7
    Membre éclairé Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Par défaut
    Citation Envoyé par fred61 Voir le message
    J'ai essaye le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(18157405041894350, 18157405041894400, 2):
    	print(i, "/2=", i/2)
    Et j'obtient ca :
    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
    18157405041894350 /2= 9078702520947176.0
    18157405041894352 /2= 9078702520947176.0
    18157405041894354 /2= 9078702520947176.0
    18157405041894356 /2= 9078702520947178.0
    18157405041894358 /2= 9078702520947180.0
    18157405041894360 /2= 9078702520947180.0
    18157405041894362 /2= 9078702520947180.0
    18157405041894364 /2= 9078702520947182.0
    18157405041894366 /2= 9078702520947184.0
    18157405041894368 /2= 9078702520947184.0
    18157405041894370 /2= 9078702520947184.0
    18157405041894372 /2= 9078702520947186.0
    18157405041894374 /2= 9078702520947188.0
    18157405041894376 /2= 9078702520947188.0
    18157405041894378 /2= 9078702520947188.0
    18157405041894380 /2= 9078702520947190.0
    18157405041894382 /2= 9078702520947192.0
    18157405041894384 /2= 9078702520947192.0
    18157405041894386 /2= 9078702520947192.0
    18157405041894388 /2= 9078702520947194.0
    18157405041894390 /2= 9078702520947196.0
    18157405041894392 /2= 9078702520947196.0
    18157405041894394 /2= 9078702520947196.0
    18157405041894396 /2= 9078702520947198.0
    18157405041894398 /2= 9078702520947200.0
    C'est problematique, comment obtenir les bons resultats ?
    Merci.
    J'ai testé sur Python 2.7.3 (désolé je n'ai pas de version 3 d'installé sur ma machine).

    voilà ce que j'obtiens :

    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
     
    >>> for i in range(18157405041894350, 18157405041894400, 2):
    	print(i, "/2=", i/2)
     
     
    (18157405041894350L, '/2=', 9078702520947175L)
    (18157405041894352L, '/2=', 9078702520947176L)
    (18157405041894354L, '/2=', 9078702520947177L)
    (18157405041894356L, '/2=', 9078702520947178L)
    (18157405041894358L, '/2=', 9078702520947179L)
    (18157405041894360L, '/2=', 9078702520947180L)
    (18157405041894362L, '/2=', 9078702520947181L)
    (18157405041894364L, '/2=', 9078702520947182L)
    (18157405041894366L, '/2=', 9078702520947183L)
    (18157405041894368L, '/2=', 9078702520947184L)
    (18157405041894370L, '/2=', 9078702520947185L)
    (18157405041894372L, '/2=', 9078702520947186L)
    (18157405041894374L, '/2=', 9078702520947187L)
    (18157405041894376L, '/2=', 9078702520947188L)
    (18157405041894378L, '/2=', 9078702520947189L)
    (18157405041894380L, '/2=', 9078702520947190L)
    (18157405041894382L, '/2=', 9078702520947191L)
    (18157405041894384L, '/2=', 9078702520947192L)
    (18157405041894386L, '/2=', 9078702520947193L)
    (18157405041894388L, '/2=', 9078702520947194L)
    (18157405041894390L, '/2=', 9078702520947195L)
    (18157405041894392L, '/2=', 9078702520947196L)
    (18157405041894394L, '/2=', 9078702520947197L)
    (18157405041894396L, '/2=', 9078702520947198L)
    (18157405041894398L, '/2=', 9078702520947199L)
    J'imagine que ce sont les résultats souhaités ?

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Citation Envoyé par fred61 Voir le message
    Le resultat de l'operation 18157405041894350/2 est 9078702520947175, et non 9078702520947176.0 comme le resultat obtenu avec Python, que ca soit un flottant ou non le resultat est faux, ce qui m'etonne pour un language utilise par des scientifiques.
    Si vous n'avez aucune notion de la représentation des nombres flottants en binaire, je comprends tout à fait votre surprise. Mais il y a une différence entre "je ne comprends pas trop comment çà fonctionne et comment je vais bien pouvoir faire pour obtenir ce que je cherche" - si vous expliquiez ce que vous cherchez à faire on pourrait vous aider à construire la solution - et l'arrogance de dire droit dans ses bottes "ce résultat est faux" - qui ne mérite que "aller troller ailleurs..." - d'autant que vous ne comprenez même pas les solutions qu'on vous indique ('//' ou module Decimal).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Division grand entier
    Par cliclik97160 dans le forum x86 16-bits
    Réponses: 1
    Dernier message: 17/06/2014, 19h39
  2. Division de grands entiers par un flottant
    Par Ijatsu dans le forum C
    Réponses: 10
    Dernier message: 03/05/2012, 18h53
  3. Division sur de Grands entiers
    Par mawguai dans le forum Mathématiques
    Réponses: 4
    Dernier message: 06/06/2008, 21h08
  4. [TP]Division de longs entiers
    Par Pebg dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 14/12/2003, 12h10
  5. Obtenir le plus grand entier !
    Par Gogoye dans le forum C
    Réponses: 3
    Dernier message: 09/12/2003, 09h40

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