Dans un
article précédent, nous avions vu que
math.pi
pour le module
TI-Python de la
TI-83 Premium CE c'était
3.14159, et non
3.141592653589793 comme sur toutes les solutions
Python concurrentes.
Aujourd'hui nous allons creuser cette anomalie en testant la précision des nombres en virgule flottante en
Python.
Rappelons que les nombres flottants s'écrivent sous la forme
$mathjax$M\times 10^E$mathjax$
avec
M la mantisse et
E l'exposant.
Voici un script
Python conçu pour déterminer la précision de ces flottants, c'est-à-dire la taille maximale de la mantisse :
- Code: Tout sélectionner
def prec(b):
k=0
try:
while 1+b**-k-1:
k=k+1
except:
pass
return k
Il suffit d'appeler
prec(b)
où
b est la base. Les valeurs de
b usuelles sont :
- 2 si l'on souhaite déterminer le nombre maximum de bits utilisables pour la mantisse
- 10 si l'on souhaite déterminer le nombre maximum de chiffres significatifs utilisables pour la mantisse
Selon la représentation interne choisie sur la machine concernée, la valeur retournée sera soit une limite exacte soit une estimation.
Par la suite, nous nous en référerons au nombre de bits.
Pour référence, voici les limites déterminées selon le même algorithme avec le moteur de calcul historique des calculatrices :
- HP Prime : 38 bits en mode numérique, 8598 bits en mode CAS
- TI-82/83/84 : 40 bits
- Casio Graph : 40 bits
- TI-Nspire : 46 bits en mode numérique, 3297 bits en mode CAS si disponible
- NumWorks : 1025 bits
- Casio fx-CP400 : 2032 bits
A part sur
HP Prime, le
Python utilise son propre moteur de calcul et il nous faut donc refaire les tests dans le contexte
Python.
Effectivement, nous trouvons :
- Casio Graph 35/75+E : 53 bits
- Casio Graph 90+E : 53 bits
- TI-Nspire : 53 bits
- NumWorks : 53 bits
53 bits soit environ 16 chiffres significatifs, ce qui est cohérent par rapport au
math.pi==3.141592653589793
.
Et du côté du module
TI-Python pour
TI-83 Premium CE, nous trouvons un résultat ridicule de 22 bits.
TI-83 Premium CE a écrit:>>>from prec import *
>>>prec(2)
22
>>>prec(10)
7
>>>
(scripts exécutés pris en photo légèrement différents, mais les résultats restent valides)22 bits soit environ 7 chiffres significatifs, ce qui est cohérent avec le
math.pi==3.14159
, très insuffisant pour des applications scientifiques.
Visiblement, le module
TI-Python implémente des flottants en simple précision
(32 bits dont 22 bits de mantisse), et non en double précision comme la concurrence
(64 bits dont 53 bits de mantisse), les bits restants dans les deux cas étant utilisés pour l'exposant ainsi que le signe de la mantisse.
Mais ce qui est décrit ici, c'est ce qui a été constaté en octobre sur le stand de
Texas Instruments aux
journées APMEP 2018 puis
congrès UdPPC 2018 avec un prototype DVT en version .0006. Le problème a bien évidemment été signalé, et peut-être a-t-il déjà été corrigé depuis ou le sera-t-il d'ici la livraison début 2019, nous l'espérons en tous cas.