Page 1 of 1

Module TI-Python: précision virgule flottante + comparaisons

Unread postPosted: 10 Dec 2018, 18:29
by critor
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: Select all
def prec(b):
  k=0
  try:
    while 1+b**-k-1:
      k=k+1
  except:
    pass
  return k

Il suffit d'appeler prec(b)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
Image

53 bits soit environ 16 chiffres significatifs, ce qui est cohérent par rapport au math.pi==3.141592653589793. :bj:

Et du côté du module TI-Python pour TI-83 Premium CE, nous trouvons un résultat ridicule de 22 bits. :o
TI-83 Premium CE wrote:>>>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)
9987100061000710002

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. :mj:

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.

9902Mais 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.

Re: Module TI-Python: précision virgule flottante + comparai

Unread postPosted: 10 Dec 2018, 19:16
by Lephe
Est-ce un port de MicroPython qui tourne sur le périphérique externe ?

Re: Module TI-Python: précision virgule flottante + comparai

Unread postPosted: 10 Dec 2018, 19:32
by critor
Probablement du CircuitPython qui est un dérivé de MicroPython.

Plusieurs éléments non encore tous traités dans nos articles nous renvoient en effet à la pyboard Adafruit Trinket M0 :
https://www.adafruit.com/product/3500

Et effectivement bonne question, je lis que CircuitPython serait apparemment bridé en simple précision pour les flottants :
https://learn.adafruit.com/circuitpytho ... pectations

Si il est impossible de corriger cela du côté TI, ce serait très embêtant.
Je vois en effet nombre de scripts qui pourront produire facilement des résultats numériques complètement faux (au-delà des 5-10% de marge d'erreur) voir même complètement aberrants sans même l'avoir cherché.
Potentiellement tout ce qui est suites numériques définies par récurrence, et qui concernent donc la spécialité Mathématiques de Première Générale ainsi que toutes les Premières Technologiques.

Re: Module TI-Python: précision virgule flottante + comparai

Unread postPosted: 10 Dec 2018, 22:07
by Lionel Debroux
Aïe. Que CircuitPython soit prévu pour utiliser des SPFPs est une chose, mais vu que tous les concurrents utilisent des DPFPs, justement parce que les résultats faux causés par l'utilisation de SPFPs sont inacceptables, TI va être obligé de suivre le mouvement...

Re: Module TI-Python: précision virgule flottante + comparai

Unread postPosted: 10 Dec 2018, 22:28
by ptijoz
Comme c'est un module externe, TI va vite se mettre au niveau des concurrents et ça ne leur coûtera pas bien cher (à mon avis)

Re: Module TI-Python: précision virgule flottante + comparai

Unread postPosted: 10 Dec 2018, 22:54
by critor
@ptitjoz
Comme pour ce que j'en devine ils réutilisent CircuitPython qui est une implémentation qui si j'ai bien compris ne gère actuellement pas les entiers/flottants de plus de 32 bits, pas sûr que TI puisse se mettre au niveau, sauf à corriger l'implémentation.

Pas inenvisageable, mais puisqu'ils ont apparemment fait le choix de CircuitPython, à mon sens c'était justement pour ne pas s'embêter eux-mêmes avec ce qui concernait l'interprétion Python.

CircuitPython était peut-être un mauvais choix.



@Lionel
Le problème ce n'est pas juste la concurrence.
C'est aussi que 22 bits de mantisse c'est ridicule par rapport aux 40 bits du moteur de calcul historique des TI-z80 (et aussi Casio Graph) prévu pour faire des maths/sciences à la différence.
Avec des termes de suites récurrentes non entières sur 6-7 chiffres significatifs maximum, bonjour les résultats aberrants qui pourront débarquer après quelques itérations; ce que l'on n'obtenait pas aussi facilement avec le moteur de calcul historique.

Re: Module TI-Python: précision virgule flottante + comparai

Unread postPosted: 12 Dec 2018, 21:17
by critor
Je sors d'une formation TI-Python en ligne, où le présentateur utilisait les nouvelles versions .0010 :


Malheureusement, le problème de précision des flottants n'est clairement pas corrigé à ce jour, comme on peut le voir avec 51/7 et 9/7 :