Correctif TI-Python flottants + complexes sur Trinket M0
Posted: 14 Feb 2019, 23:32
Version française: viewtopic.php?f=41&t=22328&lang=fr
English version: viewtopic.php?f=41&t=22328&lang=en
English version: viewtopic.php?f=41&t=22328&lang=en
Edit update: TI a corrigé le problème des flottants dans sa nouvelle version
Edit update: TI fixed the floating point issue in the new version
Edit update: TI fixed the floating point issue in the new version
En résumé: il y a maintenant une paire de firmwares non officiels pour le TI-Python Adapter associé aux TI-83 Premium CE, qui corrigent les plus gros défauts de la première version du firmware officiel (le rapprochant des solutions concurrentes), en fournissant la gestion des nombres flottants double précision pour corriger les horribles problèmes de précision, et l'ajout des gestion des nombres complexes, des fonctions spéciales de maths (dont trigo hyperbolique), et des entiers (plus) longs. Binaires et code source liés en bas de ce post.
TL;DR: there's now a couple third-party firmware images for the TI-Python Adapter associated to the TI-83 Premium CE, which fix the main drawbacks of the first version of the official firmware (making it closer to competitor offerings), featuring double precision floating-point values to fix severe accuracy issues, as well as the addition of complex math functions, special math functions (including hyperbolic trig), and long(er) integers. Binaries and source code linked at the bottom of this post.
Suite à la livraison des premiers modules externes TI-Python par Jarrety pour améliorer ta TI-83 Premium CE, dans notre test dédié nous venons de voir que le matériel et le firmware reprenaient ceux d'une carte Python (PyBoards) développée par Adafruit. Probablement la Trinket M0 ou la Feather M0. D'où la possibilité d'interchanger les firmwares entre ces différents appareils.
L'implémentation Python sur le module TI-Python est donc celle développée tout spécialement par Adafruit pour ces cartes, un CircuitPython en version 3.0.0. C'est un fork de MicroPython comportant d'importants changements dans le code, certains visant probablement un peu plus de légèreté pour tourner un peu mieux sur des cartes vraiment peu puissantes.
L'implémentation Python sur le module TI-Python est donc celle développée tout spécialement par Adafruit pour ces cartes, un CircuitPython en version 3.0.0. C'est un fork de MicroPython comportant d'importants changements dans le code, certains visant probablement un peu plus de légèreté pour tourner un peu mieux sur des cartes vraiment peu puissantes.
After the first external TI-Python modules improving your TI-83 Premium CE were delivered by Jarrety, in our detailed test, we showed that the hardware and the firmware were taken from a Python board (PyBoards) developed by Adafruit, probably the Trinket M0 or the Feather M0, hence the ability to interchange firmware between these boards and the TI-Python Adapter.
The TI-Python Adapter's Python implementation is the one tailor-made by AdaFruit for their boards, CircuitPython, version 3.0.0. This MicroPython fork contains widespread code changes, some of which probably aim at slightly reducing the footprint for running better on really underpowered hardware.
The TI-Python Adapter's Python implementation is the one tailor-made by AdaFruit for their boards, CircuitPython, version 3.0.0. This MicroPython fork contains widespread code changes, some of which probably aim at slightly reducing the footprint for running better on really underpowered hardware.
Et justement, parmi les allègements il y en a un qui est particulièrement problématique dans le contexte du lycée scientifique, c'est la précision des nombres flottants.
Les nombres non entiers, qu'ils soient décimaux ou réels, sont représentés en Python en virgule flottante, soit au format
Or, toutes les calculatrices n'accordent pas le même nombre de bits pour coder la mantisse M et l'exposant E de ces nombres, ce qui limite leur nombre de chiffres significatifs.
Voici la transcription Python d'un algorithme permettant de calculer les nombres de bits et de chiffres significatifs utilisables pour les mantisses de flottants, ceci en appelant respectivement
Précisons que selon les modèles, le test devra être réalisé deux fois, car bien souvent l'environnement Python utilisera un moteur de calcul spécifique totalement déconnecté du reste de la calculatrice.
Voici le petit classement de différents appareils scolaires en termes de précision binaire et décimale qui en découle, du meilleur au pire :
Pour référence, 53 bits correspondent à ce qui est appelé la double précision dans le contexte du Python, et 24 bits à la simple précision.
Comme tu peux le voir, les premiers modules externes TI-Python à avoir été livrés ont un très grave défaut, avec une précision en virgule flottante nettement inférieure à celle de la TI-83 Premium CE, et dégraderont donc ses capacités de calcul !
Cette précision est même inférieure à celle qu'offre l'étron intergalactique Lexibook GC3000FR, et même pire encore à celles qui ont été jugées nécessaires pour les TI/Casio scientifiques de collège ou pour les TI/Casio de primaire... et également inférieure à celle des flottants Python simple précision normaux !
Par conséquent, avec des résultats intermédiaires et finaux bridés sur 7 chiffres significatifs, nombre d'activités numériques au programme du lycée scientifique - notamment lorsqu'il y a enchaînement de différents calculs (polynômes du second degré, suites récurrentes, nombre dérivé, matrices, itérations de boucles, fonctions récursives...) conduiront à des résultats faux, aberrants ou même totalement inexploitables, beaucoup plus facilement sur le module externe TI-Python que sur les solutions concurrentes !
Dans le test dédié précédemment évoqué, nous avons mentionné des exemples de résultats faux.
De la part d'Adafruit, cette utilisation des flottants simple précision vient d'un allègement volontaire de MicroPython, afin de minimiser la consommation de ressources sur ses cartes Trinket/Feather M0, qui ont des caractéristiques matérielles très faibles. Adafruit semble ne pas avoir pensé ses cartes pour le contexte scientifique du lycée, mais davantage pour servir dans des projets techniques ou encore comme jouet d'éveil au Python pour les écoliers/collégiens.
Même si cette base matérielle et logicielle semble être une bonne solution pour minimiser les coûts de production, vouloir construire un produit pour le lycée scientifique en partant de ça n'était-il pas une erreur ?...
Les nombres non entiers, qu'ils soient décimaux ou réels, sont représentés en Python en virgule flottante, soit au format
$mathjax$\pm M\times 2^{E-E_{min}}$mathjax$
avec $mathjax$M\in [1;2[$mathjax$
.Or, toutes les calculatrices n'accordent pas le même nombre de bits pour coder la mantisse M et l'exposant E de ces nombres, ce qui limite leur nombre de chiffres significatifs.
Voici la transcription Python d'un algorithme permettant de calculer les nombres de bits et de chiffres significatifs utilisables pour les mantisses de flottants, ceci en appelant respectivement
precm(2)
et precm(10)
:- Code: Select all
def precm(b):
k,b=0,float(b)
while 1+b**-k-1>0:
k+=1
return k
Précisons que selon les modèles, le test devra être réalisé deux fois, car bien souvent l'environnement Python utilisera un moteur de calcul spécifique totalement déconnecté du reste de la calculatrice.
Voici le petit classement de différents appareils scolaires en termes de précision binaire et décimale qui en découle, du meilleur au pire :
modèles | bits | chiffres significatifs |
Graph 90+E / fx-CG50 (Python) Graph 35/75/85/95 USB / fx-9750GII/9860G (CasioPython) NumWorks (Python) TI-Nspire[ (MicroPython) | 53 | 16 |
HP Prime (CAS) | 48 | 15 |
Graph 90+E / fx-CG10/20/50 (KhiCAS) NumWorks (hors Python) TI-82/85/86/89/92 / Voyage 200 TI-Nspire (hors MicroPython) | 45 | 14 |
TI-81 | 41 | 13 |
fx-92 Collège 2D / Spéciale Collège / fx-ES/EX Graph 90+E / fx-CG50 (hors Python et KhiCAS) Graph 35/75/85/95 USB / fx-9750GII/9860G (hors CasioPython) fx-CG10/20 (hors KhiCAS) Sharp EL-9900/9950 TI-73/76.fr/83/84 / 82 Stats/Plus/Advanced | 40 | 13 |
HP Prime (hors CAS) | 38 | 12 |
Lexibook GC3000FR | 35 | 11 |
TI-Primaire Plus | 34 | 11 |
TI-Collège Plus / 30/34/36 MultiView | 32 | 10 |
fx-CP400/CG500 / Classpad | 31 | 10 |
module externe TI-Python | 22 | 7 |
Pour référence, 53 bits correspondent à ce qui est appelé la double précision dans le contexte du Python, et 24 bits à la simple précision.
Comme tu peux le voir, les premiers modules externes TI-Python à avoir été livrés ont un très grave défaut, avec une précision en virgule flottante nettement inférieure à celle de la TI-83 Premium CE, et dégraderont donc ses capacités de calcul !
Cette précision est même inférieure à celle qu'offre l'étron intergalactique Lexibook GC3000FR, et même pire encore à celles qui ont été jugées nécessaires pour les TI/Casio scientifiques de collège ou pour les TI/Casio de primaire... et également inférieure à celle des flottants Python simple précision normaux !
Par conséquent, avec des résultats intermédiaires et finaux bridés sur 7 chiffres significatifs, nombre d'activités numériques au programme du lycée scientifique - notamment lorsqu'il y a enchaînement de différents calculs (polynômes du second degré, suites récurrentes, nombre dérivé, matrices, itérations de boucles, fonctions récursives...) conduiront à des résultats faux, aberrants ou même totalement inexploitables, beaucoup plus facilement sur le module externe TI-Python que sur les solutions concurrentes !
Dans le test dédié précédemment évoqué, nous avons mentionné des exemples de résultats faux.
De la part d'Adafruit, cette utilisation des flottants simple précision vient d'un allègement volontaire de MicroPython, afin de minimiser la consommation de ressources sur ses cartes Trinket/Feather M0, qui ont des caractéristiques matérielles très faibles. Adafruit semble ne pas avoir pensé ses cartes pour le contexte scientifique du lycée, mais davantage pour servir dans des projets techniques ou encore comme jouet d'éveil au Python pour les écoliers/collégiens.
Même si cette base matérielle et logicielle semble être une bonne solution pour minimiser les coûts de production, vouloir construire un produit pour le lycée scientifique en partant de ça n'était-il pas une erreur ?...
And precisely, one of the changes which aim at producing more lightweight builds is especially harmful for science-oriented high school teaching purposes, is the prevision of floating-point numbers.
Non-integer numbers, be them decimal or real, are represented as floating-point values in Python, that is in the
As a matter of fact, calculators use different bit counts for encoding the mantissa M and the exponent E, which caps the number of significant figures.
Here is the Python translation of an algorithm computing the number of bits and the number of significant digits usable for floating-point number mantissas, by calling respectively
On some models, this test needs to be performed twice, as the Python environment often uses a specific computations engine, completely disconnected from the rest of the calculator's operation.
Here is the rundown of school calculators in terms of binary / decimal accuracy, from best to worst:
For reference, 53 bits correspond to what is termed double precision in the context of Python, and 24 bits correspond to simple precision.
As you can see, the first external TI-Python Adapter modules delivered to customers are thoroughly crippled by floating-point precision much lower than that of the TI-83 Premium CE, and therefore lower its computation abilities very much !
This precision is even lower than that of the Lexibook GC3000FR intergalactic PoS, or even worse, lower than the ones deemed necessary for the TI/Casio scientific calculators aimed at primary and secondary calculators... and lower than that of normal Python single precision floating-point values !
Therefore, with intermediate and final results truncated to 7 significant digits, many numerical activities used in scientific high school level math classes - especially when chaining / iterating multiple computations (quadratic polynomials, recurrent sequences, derived number, matrices, loop iterations, recursive functions...) simply produce wrong, stupid or even completely unusable results, much more easily on the TI-Python Adapter than on competitors' solutions !
In the aforementioned detailed test, we listed multiple instances of wrong results.
As far as Adafruit is concerned, using single precision floating-point values stems from a voluntary reduction of MicroPython, in order to reduce the foorprint on their Trinket/Feather M0 boards, whose hardware characteristics are very weak. Adafruit doesn't seem to have designed boards for the purpose of targeting scientific high schools, they probably target technical projects or baby Python activity steps for pupils younger than high schoolers.
Even if such hardware and software seem to be a good method to reduce production costs, maybe trying to use them as a starting point for building a product targeting scientific high school teaching purposes was a mistake, huh ?
Non-integer numbers, be them decimal or real, are represented as floating-point values in Python, that is in the
$mathjax$\pm M\times 2^{E-E_{min}}$mathjax$
format, with $mathjax$M\in [1;2[$mathjax$
.As a matter of fact, calculators use different bit counts for encoding the mantissa M and the exponent E, which caps the number of significant figures.
Here is the Python translation of an algorithm computing the number of bits and the number of significant digits usable for floating-point number mantissas, by calling respectively
precm(2)
and precm(10)
:- Code: Select all
def precm(b):
k,b=0,float(b)
while 1+b**-k-1>0:
k+=1
return k
On some models, this test needs to be performed twice, as the Python environment often uses a specific computations engine, completely disconnected from the rest of the calculator's operation.
Here is the rundown of school calculators in terms of binary / decimal accuracy, from best to worst:
models | bits | significant digits |
Graph 90+E / fx-CG50 (Python) Graph 35/75/85/95 USB / fx-9750GII/9860G (CasioPython) NumWorks (Python) TI-Nspire[ (MicroPython) | 53 | 16 |
HP Prime (CAS) | 48 | 15 |
Graph 90+E / fx-CG10/20/50 (KhiCAS) NumWorks (outside Python) TI-82/85/86/89/92 / Voyage 200 TI-Nspire (outside MicroPython) | 45 | 14 |
TI-81 | 41 | 13 |
fx-92 Collège 2D / Spéciale Collège / fx-ES/EX Graph 90+E / fx-CG50 (outside Python and KhiCAS) Graph 35/75/85/95 USB / fx-9750GII/9860G (outside CasioPython) fx-CG10/20 (outside KhiCAS) Sharp EL-9900/9950 TI-73/76.fr/83/84 / 82 Stats/Plus/Advanced | 40 | 13 |
HP Prime (hors CAS) | 38 | 12 |
Lexibook GC3000FR | 35 | 11 |
TI-Primaire Plus | 34 | 11 |
TI-Collège Plus / 30/34/36 MultiView | 32 | 10 |
fx-CP400/CG500 / Classpad | 31 | 10 |
TI-Python Adapter | 22 | 7 |
For reference, 53 bits correspond to what is termed double precision in the context of Python, and 24 bits correspond to simple precision.
As you can see, the first external TI-Python Adapter modules delivered to customers are thoroughly crippled by floating-point precision much lower than that of the TI-83 Premium CE, and therefore lower its computation abilities very much !
This precision is even lower than that of the Lexibook GC3000FR intergalactic PoS, or even worse, lower than the ones deemed necessary for the TI/Casio scientific calculators aimed at primary and secondary calculators... and lower than that of normal Python single precision floating-point values !
Therefore, with intermediate and final results truncated to 7 significant digits, many numerical activities used in scientific high school level math classes - especially when chaining / iterating multiple computations (quadratic polynomials, recurrent sequences, derived number, matrices, loop iterations, recursive functions...) simply produce wrong, stupid or even completely unusable results, much more easily on the TI-Python Adapter than on competitors' solutions !
In the aforementioned detailed test, we listed multiple instances of wrong results.
As far as Adafruit is concerned, using single precision floating-point values stems from a voluntary reduction of MicroPython, in order to reduce the foorprint on their Trinket/Feather M0 boards, whose hardware characteristics are very weak. Adafruit doesn't seem to have designed boards for the purpose of targeting scientific high schools, they probably target technical projects or baby Python activity steps for pupils younger than high schoolers.
Even if such hardware and software seem to be a good method to reduce production costs, maybe trying to use them as a starting point for building a product targeting scientific high school teaching purposes was a mistake, huh ?
Heureusement, devant la gravité de la situation et pour voir si c'était difficile de faire mieux que TI (une forme de défi personnel), Lionel Debroux vient de passer du temps (une heure pour la première version qui compile mais ne produit pas les résultats attendus, quelques heures supplémentaires pour la première version qui calcule correctement, bien davantage pour les modifications ultérieures et le partage en deux versions qui ont des caractéristiques un peu différentes suivant les opérations qu'on souhaite réaliser) à rajouter le support des nombres flottants en double précision à un firmware pour Trinket M0, en repartant du code de CircuitPython disponible publiquement (dans une version plus récente que celle utilisée par TI) !
Fortunately, given how dire the situation is and in order to see whether doing better than what TI did is hard (some form of a personal challenge), Lionel Debroux spent some time (an hour for the first version which built correctly but didn't yield the expected results, several additional hours for the first version which computes correctly, much more for later modifications and the split into two versions with slightly different contents targeting different operation sets) adding support for double-precision floating-point numbers to a firmware targeting the Trinket M0, by restarting from the CircuitPython code (in a version newer than the one used by TI) !
Notons que les nombres flottants simple précision ne sont pas le seul gros défaut du module externe TI-Python tel qu'on le voit actuellement, et que les firmwares produits par Lionel comble justement d'autres manques fonctionnels (dont ne souffrent pas la plupart des solutions concurrentes), en particulier :
Une des versions du firmware fournit également d'autres modules : os et storage (io a fait une courte apparition, il a été enlevé pour des raisons de place)
A moins que quelqu'un trouve une idée pour gagner des kilo-octets supplémentaires sans réduire la fonctionnalité, il n'y a pas de marge de manoeuvre pour faire évoluer le produit ultérieurement - une nouvelle fois, contrairement à la plupart des solutions Python calculatrice concurrentes.
- la gestion des nombres complexes (Terminales S/STI2D/STL): le module cmath et donc les fonctions complexes qu'il fournit
- les fonctions mathématiques spéciales, notamment de trigonométrie hyperbolique, présentes sur certaines autres implémentations de Python sur calculatrice mais pas dans le firmware 3.0.0.12 du TI-Python Adapter.
- les entiers longs, un peu plus longs (64 bits) dans une version et vraiment plus longs dans l'autre - présents dans toutes les autres implémentations de Python sur calculatrice
Une des versions du firmware fournit également d'autres modules : os et storage (io a fait une courte apparition, il a été enlevé pour des raisons de place)
A moins que quelqu'un trouve une idée pour gagner des kilo-octets supplémentaires sans réduire la fonctionnalité, il n'y a pas de marge de manoeuvre pour faire évoluer le produit ultérieurement - une nouvelle fois, contrairement à la plupart des solutions Python calculatrice concurrentes.
Note that single precision floating-point values aren't the only significant issue with the TI-Python Adapter as it currently stands, and that the firmware images produced by Lionel plug in other holes in functionality (which most competing solutions do not have), especially:
Unless someone has an idea to save multiple additional KBs of Flash memory without reducing functionality, there's no spare room left in the Flash memory to provide later product improvements to consumers - again, unlike most competing Python solutions for calculators.
- complex math functionality
- special math functions
- long integers
Unless someone has an idea to save multiple additional KBs of Flash memory without reducing functionality, there's no spare room left in the Flash memory to provide later product improvements to consumers - again, unlike most competing Python solutions for calculators.
Par contre, nous avions testé sur le stand de TI à l'UdPPC en octobre dernier, et la TI-83 Premium CE munie de l'OS 5.3.5 et de l'application PyAdaptr refusait de fonctionner avec la carte Adafruit Trinket M0 munie de son firmware d'origine.
C'est donc au code firmware modifié par Texas Instruments qu'il faudrait apporter ces mêmes modifications, mais malheureusement à la différence ce code n'est pas public à notre connaissance.
A défaut donc d'une réouverture du code que Texas Instruments a repris en le fermant, les modifications en question sont tenues gracieusement à la disposition de la communauté et du constructeur. Espérons...
C'est donc au code firmware modifié par Texas Instruments qu'il faudrait apporter ces mêmes modifications, mais malheureusement à la différence ce code n'est pas public à notre connaissance.
A défaut donc d'une réouverture du code que Texas Instruments a repris en le fermant, les modifications en question sont tenues gracieusement à la disposition de la communauté et du constructeur. Espérons...
However, we had made some tests on TI's space at the UdPPC show in October 2018, and the TI-83 Premium CE equipped with the 5.3.5 OS version and the PyAdaptr FlashApp refused to communicate with an Adafruit Trinket M0 running its factory default firmware.
These modifications should therefore be applied direclty into Texas Instruments's modified firmware, but unfortunately, its code isn't published anywhere, as far as we can tell. These modifications are provided to the community and the manufacturer, let's hope that TI integrates them, and even opens up their source code, why not...
These modifications should therefore be applied direclty into Texas Instruments's modified firmware, but unfortunately, its code isn't published anywhere, as far as we can tell. These modifications are provided to the community and the manufacturer, let's hope that TI integrates them, and even opens up their source code, why not...
Source de l'information : viewtopic.php?f=41&t=22242&start=80#p239474 et posts suivants.
Binaires prêts à l'emploi : dernière version actuelle à viewtopic.php?f=41&t=22328&p=240032#p240032 . D'une manière générale, en pièces jointes des posts de ce topic, et auparavant, de viewtopic.php?f=41&t=22242&start=80#p239474 .
Code source : avec les binaires, sous forme de diff, et https://github.com/debrouxl/circuitpython .
Texte de la news: critor (le gros du texte), Lionel (quelques parties, la traduction anglaise).
Binaires prêts à l'emploi : dernière version actuelle à viewtopic.php?f=41&t=22328&p=240032#p240032 . D'une manière générale, en pièces jointes des posts de ce topic, et auparavant, de viewtopic.php?f=41&t=22242&start=80#p239474 .
Code source : avec les binaires, sous forme de diff, et https://github.com/debrouxl/circuitpython .
Texte de la news: critor (le gros du texte), Lionel (quelques parties, la traduction anglaise).
Information source: viewtopic.php?f=41&t=22242&start=80#p239474 and subsequent posts.
Readily usable binaries: latest version at viewtopic.php?f=41&t=22328&p=240287#p240287 . In general, binaries are posted as attachments in this topic, and earlier, at viewtopic.php?f=41&t=22242&start=80#p239474 and subsequent posts.
Source code: alongside the binaries in diff form, and https://github.com/debrouxl/circuitpython .
News writing credits: critor (the bulk of the text), Lionel (select parts, the English translation.
Readily usable binaries: latest version at viewtopic.php?f=41&t=22328&p=240287#p240287 . In general, binaries are posted as attachments in this topic, and earlier, at viewtopic.php?f=41&t=22242&start=80#p239474 and subsequent posts.
Source code: alongside the binaries in diff form, and https://github.com/debrouxl/circuitpython .
News writing credits: critor (the bulk of the text), Lionel (select parts, the English translation.