CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Avoir des valeurs exactes en python

LuluDePochEnts
LuluDePochEnts
Niveau 5
06 décembre 2021 à 18:25:32

Salut,

Je débute en programmation et je m'étais lancé le défi de faire une fonction qui factorise un polynôme du second degré. J'ai réussi sans trop de difficultés mais il y a un petit problème ; les valeurs sont arrondies à une dizaine de chiffre après la virgule par exemple mes valeurs x1 et x2 peuvent être des fractions comme 1/3 ou sqrt(2) qui ne se finissent pas.
Je n'arrive pas à donner des valeurs exactes et même si je peux recopier toute l'opération dans des guillemets pour me rapprocher ça ne simplifie pas le numérateur et le dénominateur si possible.

Je sais pas si j'ai été clair, je mets mon code si ça permet de mieux comprendre, il est certainement pas du tout optimisé mais bon c'est pas mon objectif pour l'instant.

def facto(a, b, c):
    x = "x"
    x1 = 0
    x2 = 0
    delta = b ** 2 - 4 * a * c
    if delta > 0:
        x1 = (-b - sqrt(delta))/ (2 * a)
        x2 = (-b + sqrt(delta))/ (2 * a)
        if x1 < 0:
            x1 = (sqrt(x1*x1))
            if x2 < 0:
                x2 = (sqrt(x2*x2))
                fact1 = "(" + str(x) + "+" + str(x1) + ")"
                fact2 = "(" + str(x) + "+" + str(x2) + ")"
                return str(a) + fact1 + fact2
            else:
                fact1 = "(" + str(x) + "+" + str(x1) + ")"
                fact2 = "(" + str(x) + "-" + str(x2) + ")"
                return str(a) + fact1 + fact2
        else:
            if x2 < 0:
                x2 = (sqrt(x2*x2))
                fact1 = "(" + str(x) + "-" + str(x1) + ")"
                fact2 = "(" + str(x) + "+" + str(x2) + ")"
                return str(a) + fact1 + fact2
            else:
                fact1 = "(" + str(x) + "-" + str(x1) + ")"
                fact2 = "(" + str(x) + "-" + str(x2) + ")"
                return str(a) + fact1 + fact2
    elif delta == 0:
        x0 = -b/( 2 * a)
        if x0 < 0:
            x0 = (sqrt(x0*x0))
            fact0 = "(" + str(x) + "+" + str(x0) + ")"
            return str(a) + fact0 + fact0
        else:
            fact0 = "(" + str(x) + "-" + str(x0) + ")"
            return str(a) + fact0 + fact0
    else:
        print("Pas de solution dans R")
Azerban
Azerban
Niveau 16
06 décembre 2021 à 18:34:32

Si tu travailles avec des fractions utilise le module fractions : https://docs.python.org/frg/fr/3/library/fractions.html

Utilise également des f-strings pour formatter ton code : https://docs.python.org/fr/3/tutorial/inputoutput.html#formatted-string-literals

LuluDePochEnts
LuluDePochEnts
Niveau 5
06 décembre 2021 à 18:44:31

Le 06 décembre 2021 à 18:34:32 :
Si tu travailles avec des fractions utilise le module fractions : https://docs.python.org/frg/fr/3/library/fractions.html

Utilise également des f-strings pour formatter ton code : https://docs.python.org/fr/3/tutorial/inputoutput.html#formatted-string-literals

Nickel pour les fractions, quelque chose de similaire existe pour les racines ?

godrik
godrik
Niveau 30
06 décembre 2021 à 18:47:09

OP,

Le probleme que tu as est un probleme de typage. Les nombres en python sont generalement represente sous forme de nombre a virgule flotante IEEE 754. ( https://en.wikipedia.org/wiki/IEEE_754 ) Dans ce format, les nombres sont representes en notation scientifique avec une dizaine de chiffres apres la virgule.

C'est pour ca que sqrt(2) devient 1.41.... ou que 1/3 devient 0.333...

Si tu as besoin de conserver la valeure exacte, il faut utiliser une autre representation. Azerban fournit un type qui va fonctionner avec des fractions. Mais ca n'aidera pas pour sqrt(2) par exemple. il y a des lib qui fournissent des types pour representer les nombres symboliquement. SymPy par exemple.

La vraie question est "pourquoi est ce que c'est important de garder une representation symbolique?"
Je ne connais que ters peu d'application ou c'est utile.

LuluDePochEnts
LuluDePochEnts
Niveau 5
06 décembre 2021 à 18:51:44

Le 06 décembre 2021 à 18:47:09 :
OP,

Le probleme que tu as est un probleme de typage. Les nombres en python sont generalement represente sous forme de nombre a virgule flotante IEEE 754. ( https://en.wikipedia.org/wiki/IEEE_754 ) Dans ce format, les nombres sont representes en notation scientifique avec une dizaine de chiffres apres la virgule.

C'est pour ca que sqrt(2) devient 1.41.... ou que 1/3 devient 0.333...

Si tu as besoin de conserver la valeure exacte, il faut utiliser une autre representation. Azerban fournit un type qui va fonctionner avec des fractions. Mais ca n'aidera pas pour sqrt(2) par exemple. il y a des lib qui fournissent des types pour representer les nombres symboliquement. SymPy par exemple.

La vraie question est "pourquoi est ce que c'est important de garder une representation symbolique?"
Je ne connais que ters peu d'application ou c'est utile.

Pour que le résultat soit frappant au premier regard, je pourrais reconnaître la racine de 2 alors ça me dérange pas, mais des racines plus atypiques comme sqrt(7/11/21) non, alors j'ai une réponse, sans en avoir une réellement.
Le but étant d'avoir un résultat le plus précis possible. Si c'est pas possible, tant pis, c'était juste un défi personnel que je m'étais lancé.

Azerban
Azerban
Niveau 16
06 décembre 2021 à 18:57:07

J'allais conseiller SymPy également pour travailler avec les nombres irrationnels. C'est le module de référence dans le domaine en Python : https://stackoverflow.com/questions/42149087/python-how-to-retain-accuracy-of-square-of-sqrt#answer-42149252

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment