Problème avec les grands nombres ?
Résoluyg_be Messages postés 23535 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 avril 2025 - 30 juin 2024 à 18:37
- Alexia organise un appel vidéo avec ses grand-parents qui ne veulent pas installer de logiciel ou d’application, ni créer un compte.
- Créer un compte google - Guide
- Créer un compte instagram sur google - Guide
- Créer un compte gmail - Guide
- Logiciel montage vidéo windows - Guide
- Comment créer un groupe whatsapp - Guide
2 réponses
29 juin 2024 à 22:22
Au temps pour moi, j'avais laissé trainé un #
#A-B+C = A-(B-C) A, B, C = 225, 220, 10 print(A-B+C) print(A-(B-C)) #affiche 15 puis 15 : OK A, B, C = 50000181502235777316, 50000181500164710000, 5000009075 print(A-B+C) print(A-(B-C)) # affiche 7071076391 et 7071076391 D, E, F = 50000181502235777316, 5.000018150016471e+19, 5000009075 print('D-E+F', D-E+F) print('D-(E-F)', D-(E-F)) print('') # affiche 7071077747.0 et 7071080448.0 print('A - B', A - B) print('D- E', D - E) print('B - C', B - C) print('E - F', int(E - F))
Non seulement les résultats sont différents, mais en plus, aucun n'est correct.
C'est dû au fait que 5.000018150016471e+19 est différent de 50000181500164710000
La façon dont est codé un float est basée sur le fait qu'un nombre limité de valeurs peuvent être encodées et que pour toutes les autres, elles sont encodées au plus proche. On admet que seule la valeur significative compte.
Comme additionner ou soustraire un float et un int donne un float, celui-ci est aussi encodé au plus proche.
Et d'approximation en approximation, on arrive à deux résultats incorrects.
Bonjour Whismeril,
Merci de ta réponse, je me doutais qu'il y avait un truc de ce genre
On peut marquer comme résolu
30 juin 2024 à 16:06
bonjour,
import decimal X=1e+16 Y=1 print(str(X)+" plus " +str(Y)+" moins "+str(X)+" est égal à ",X+Y-X) X=decimal.Decimal(X) Y=1 print(str(X)+" plus " +str(Y)+" moins "+str(X)+" est égal à ",X+Y-X)
30 juin 2024 à 18:02
Salut,
c'est vrai, je n'y ai pas pensé.
J'ai répondu à la question, mais pas à la problématique finalement.
Par contre, à priori tu ne connais pas les fstring (formated string), je me permets de te montrer.
import decimal X = 1e+16 Y = 1 # construction d'une string avec les valeurs directement incorporées, sans formatage particulier print(f"{X} plus {Y} moins {X} est égal à {X+Y-X}") X = decimal.Decimal(X) Y = 1 # formatage d'un X en tant que float dans la string print(f"{X:0.0} plus {Y} moins {X} est égal à {X+Y-X}")
30 juin 2024 à 18:37
Merci pour la suggestion. Je n'apprécie guère ces formatted strings.
Surtout, ils sont spécifiques à quelques langages.
Accessoirement, et c'est très subjectif, ils ne clarifient pas beaucoup le code.