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 :

Résultat mathématique étonnant


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut Résultat mathématique étonnant
    Bonjour étant en apprentissage de python, je fais quelques exercices très basique.

    Je voulais par exemple trouver le résultat de 2A² = C² tel que A et C soit des entiers.

    Le programme m'a trouvé le couple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A= 93222358
    C= 131836323
    Mais pour contrôler je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(2*(93222358*93222358))
    17380816062160328
    mais si je fais (131836323)² j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(131836323 * 131836323)
    17380816062160329


    donc j'ai bien un de différence de 1.

    Là je me dis c'est mon code qui déraille mais par acquis de conscience je fais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(sqrt(17380816062160328))
    131836323.0
    donc c'est quand même bien juste

    et si je fais par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(sqrt(17380816062190328))
    131836323.00011377
    Je trouve cela étonnant.

    car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> print(sqrt(173))
    13.152946437965905


    Il y aurait donc une limite au nombre utilisable pour sqrt() ?

    Merci de vous être penché sur mon problème

  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
    En Python, la précision des entiers n'est pas limitée, mais la fonction sqrt opère sur des flottants, qui eux ont une précision limitée. Lors de l'appel de sqrt, l'entier est converti en flottant et une perte de précision a lieu si l'entier est trop grand.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> float(17380816062160329)
    17380816062160328.0
    L'idéal serait de trouver la solution sans passer par une conversion en flottant, c'est à dire sans passer par sqrt.

  3. #3
    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,

    On peut utiliser la méthode de Heron d'Alexandrie (2000 ans!) qui est très efficace pour calculer la racine entière d'un nombre entier sans jamais convertir en flottant: http://fr.wikipedia.org/wiki/M%C3%A9thode_de_H%C3%A9ron.

    Voilà la version que j'utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def lrac2(x):
        """Racine carrée entière d'un nombre entier x (méth. de Héron d'Alexandrie)"""
        r1 = 1
        while True:
            r2 = (r1+x//r1)>>1
            if abs(r1-r2) < 2:
                if r1*r1 <= x and (r1+1)*(r1+1) > x:
                    return r1
            r1 = r2
    Mais, bien sûr, si x n'est pas un carré parfait, la racine n'est que la partie entière de la vraie racine.

    On peut cependant faire des choses étonnantes avec de grands entiers:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    x = 4112508058167862726684138187739243495869080430700517 
    print lcar2(x)
    64128839519890446296697044
    On peut aussi faire le calcul de la racine entière avec une méthode par dichotomie. C'est en plus généralisable à la racine nième (http://python.jpvweb.com/mesrecettes...racine_entiere)

    On peut aussi travailler avec le module decimal qui permet de faire des calculs en flottant avec une précision arbitraire.

  4. #4
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par JiPhi75 Voir le message
    Bonjour étant en apprentissage de python, je fais quelques exercices très basique.

    Je voulais par exemple trouver le résultat de 2A² = C² tel que A et C soit des entiers.


    (...)
    Hello,
    si tu réussis, ça sera effectivement un résultat mathématique étonnant

    tu cherches à trouver deux entiers A et C tels que a/c = sqrt(2) ... tu prouverais que sqrt(2) est un rationnel ...

    Tout va dépendre de ton code ... les flottants ne sont pas assez précis pour calculer avec de grands entiers, en général.

  5. #5
    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
    Ce serait pas plutôt c/a = sqrt(2)*?

    Mais effectivement, c’est bien vu, la recherche risque de durer… ad vitam æternam*!

  6. #6
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par mont29 Voir le message
    Ce serait pas plutôt c/a = sqrt(2)*?

    Mais effectivement, c’est bien vu, la recherche risque de durer… ad vitam æternam*!
    ooops effectivement

    Wheeler disait «ne jamais faire un calcul avant d'en connaître le résultat», mais bon là ce n'est pas de la physique.

  7. #7
    Membre éprouvé

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Par défaut
    Bonsoir,
    au passage un petit programme tout bête pour montrer les problèmes inhérents aux nombres flottants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /usr/bin/env python
    #coding=utf-8
     
    i = 1
     
    A = 1.0
    while ((A + 1.0) - A == 1.0):
        i += 1
        A *= 2
     
    print(i)

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par rambc Voir le message
    Bonsoir,
    au passage un petit programme tout bête pour montrer les problèmes inhérents aux nombres flottants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /usr/bin/env python
    #coding=utf-8
     
    i = 1
     
    A = 1.0
    while ((A + 1.0) - A == 1.0):
        i += 1
        A *= 2
     
    print(i)
    Plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #! /usr/bin/env python
    #coding=utf-8
    print "%.15f" % 9.95
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    désolé de répondre si tard...

    Merci pour toutes les précisions

    et effectivement, plutôt obnubilé par la création d'une boucle et l'obtention d'un résultat "bizarre" (que je comprends maintenant). J'ai oublié de faire une simple analyse du problème et de voir qu'effectivement il ne pouvait y avoir de résultat.

    Nbre rationnel/Nbre rationnel = donnera toujours un nombre rationnel
    et sqrt(2) est un nombre irrationnel

  10. #10
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Attention, comme la question est posée il y a une solution le couple (0,0) ...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut
    effectivement 2*(0²) = 0² semble juste car donne 2 *(0*0) = (0*0) donc 2*0 = 0

    mais puisque 2A² = C² est égale C/A = sqrt(2) si on remplace C par 0 et A par zéro

    donc est-ce vrai aussi pour (0/0) = sqrt(2) ?



    PS : je sors du sujet sur lequel j'ai déjà eu ma réponse.

  12. #12
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par JiPhi75 Voir le message
    effectivement 2*(0²) = 0² semble juste car donne 2 *(0*0) = (0*0) donc 2*0 = 0

    mais puisque 2A² = C² est égale C/A = sqrt(2) si on remplace C par 0 et A par zéro

    donc est-ce vrai aussi pour (0/0) = sqrt(2) ?



    PS : je sors du sujet sur lequel j'ai déjà eu ma réponse.
    si tu as deux réels qui vérifient 2A²=C² tu peux diviser par A ssi A est non nul ... donc non

  13. #13
    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 ferais probablement mieux de laisser un prof de math répondre, mais il me semble que la division par zéro est «*interdite*»…

    Je me rappelle d’ailleurs un S&V Junior dans lequel ils s’amusaient à démontrer que 1+1 = 3 (ou un truc de ce goût là), justement grâce à une division par zéro dans une des étapes de leurs démonstration…

Discussions similaires

  1. Problème de résultat d'une opération mathématique
    Par Porkipic dans le forum Débuter
    Réponses: 12
    Dernier message: 03/03/2014, 15h37
  2. Afficher les résultats exacts mathématiques GTK
    Par ampholyte dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 09/01/2013, 09h16
  3. [PHP 5.2] preg_replace et accent : Résultat étonnant
    Par neojick dans le forum Langage
    Réponses: 9
    Dernier message: 27/04/2010, 12h32
  4. rewriting / Erreur d'URL.. un résultat étonnant
    Par Joe Le Mort dans le forum Dépannage et Assistance
    Réponses: 2
    Dernier message: 10/08/2006, 09h09

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