Back
Close

Quelques problèmes avec les nombres décimaux

PasKalou
2,111 views

Quelques problèmes avec les nombres décimaux

Les nombres entiers

Un ordinateur est très fort pour calculer avec des nombres entiers. Par exemple, aucun problème pour afficher 2**10000.

print("2**10000 =", 2**10000)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Même si ce nombre comporte 3011 chiffres…

longueur = len(str(2**10000))
print("Nombre de chiffres dans 2**10000 :", longueur)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Les décimaux

En revanche, un ordinateur a quelques soucis avec les nombres décimaux : les flottants.

a = 0.1
b = 0.2
print(a+b)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Ce qui engendre quelques problèmes…

Exemple de problème : la réciproque du théorème de Pythagore

Le problème

La réciproque du théorème de Pythagore fonctionne très bien avec les nombres entiers

# Premier triangle rectangle
a = 3
b = 4
c = 5
print(a**2 + b**2 == c**2)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Mais avec les nombres flottans, il peut y avoir quelques surprises…

# Premier triangle rectangle
a = 3
b = 4
c = 5
print(a**2 + b**2 == c**2)
# Deuxième triangle rectangle
a = 1
b = 2.4
c = 2.6
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

En effet, les valeurs sont vraiments différentes et le test est donc faux… (domage)

# Premier triangle rectangle
a = 3
b = 4
c = 5
print(a**2 + b**2)
print(c**2)
# Deuxième triangle rectangle
a = 1
b = 2.4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Une solution possible

Une solution est de remplacer le test d'égalité entre flottant par une un test d'inégalité.

# Premier triangle rectangle
a = 3
b = 4
c = 5
print( abs(a**2 + b**2 - c**2) < 1e-10 )
# Deuxième triangle rectangle
a = 1
b = 2.4
c = 2.6
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Une autre solution consiste à arrondir les nombres flottant. Cette solution est moins pratique et moins lisible que la précédente.

# Premier triangle rectangle
a = 3
b = 4
c = 5
print( round(a**2 + b**2,10) == round(c**2,10) )
# Deuxième triangle rectangle
a = 1
b = 2.4
c = 2.6
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Exemple de problème 2 - Les arrondis

Le problème des décimaux apparaît aussi lorsque l'on cherche à arrondir des nombres flottants.

# Arrondis correct
a = 10.675
print ( round(a,2) )
# Arrondis incorrect
a = 2.675
print ( round(a,2) )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

L'origine du problème est dans la valeur exacte utilisée par l'ordinateur

from decimal import Decimal
# Arrondis correct
a = 10.675
print ( Decimal(a) )
# Arrondis incorrect
a = 2.675
print ( Decimal(a) )
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Create your playground on Tech.io
This playground was created on Tech.io, our hands-on, knowledge-sharing platform for developers.
Go to tech.io
codingame x discord
Join the CodinGame community on Discord to chat about puzzle contributions, challenges, streams, blog articles - all that good stuff!
JOIN US ON DISCORD
Online Participants