Aussi l'avons-nous commandé et bien évidemment au prix public, dès le premier jour de sa disponibilité chez
Toutefois, comble de malchance, après deux semaines nous ne l'avons toujours pas reçu.
Aussi, nos plus grands remerciements à nos premiers membres à l'avoir reçu, et , qui n'ont pas hésité à se donner la peine de nous partager informations, photos, archives et même le
Plan B, le test du module externe
Précisons également que nous ne disposons pas non plus des mise à jour et application
Par ailleurs, la sortie officielle au moins côté logiciel est prévu pour mi-mars, et donc le firmware pourrait être différent d'ici là...
- Premier coup d’oeil
- Matériel et spécifications
- Première connexion USB : stockage, version, fonctionnement
- Liste modules Python
- Nombres complexes
- Exploration module sys
- Nombres entiers courts et longs
- Reference design
- Exploration module builtins
- Exploration module math
- Nombres flottants et précision
- Exploration autres modules Python
- Mémoire de travail
- Performances
- Connexion USB en mode mise à jour
- Dumping et compatibilités
- Conclusion
1) Premier coup d'oeil :
Go to top- en novembre 2018
- dans l'usine de code L, c'est-à-dire l'usineKinpo ElectronicsauxPhilippines, ce que confirme la mention"FABRIQUÉ AUX PHILIPPINES"
2) Matériel et spécifications :
Go to topLa carte s'articule autour d'une unique puce
- un processeur Cortex-M0+cadencé à(ARMv6, Thumb)48 MHz
- une mémoire Flashde256 Kio
- une mémoire SRAMde32 Kio
Une petite recherche au sujet de cette puce nous apprend son utilisation dans la console de jeux portable française, éducative et rétro , ou encore pour les cartes de développement
Mais de façon encore plus intéressante, c’est également la puce utilisée dans les

Outre une possible compatibilité des
3) Première connexion USB : stockage, version, fonctionnement :
Go to top

Le module externe
- le nom TI-Python Adapter
- un identifiant vendeur 0451qui est bien celui deTexas Instruments
- un identifiant produit E020

- un périphérique de stockage de masse qui, comme une clé USB, offre un espace de stockage nommé Python CEde58,5 Kiode capacité, et avec55,5 Kiolibres
- un port série virtuel
Il suffit donc de copier les scripts
C'est donc probablement ce que fait l'application
- copier le script courant lorsque l'on en demande l'exécution
- copier l'ensemble des scripts de la calculatrice lorsque l'on appelle directement la console Python
Nous notons dans le dossier racine de l'espace de stockage un fichier
Il y a donc un petit peu de travail avec au moins 6 recompilations depuis la version
Nous avions fait à l'époque un bilan bienveillant et globalement positif de cette version, déplorant certes un gros défaut remonté entre temps en bonne position, mais louant l'énorme travail apparemment accompli, et espérant donc qu'il allait continuer...
A priori, seulement 6 recompilations par rapport à ce qu'il restait à faire ou corriger n'est pas très bon signe, mais nous allons voir.
Nous ignorons aussi ce que donne cet espace de stockage externe dans le cadre du mode examen.

Le port série virtuel quant à lui nous offre une console
TI-Python wrote:>>> # Shell Reinitialized
>>> help()
To list built-in modules please do `help("modules")`.
>>>
Notons que l'exécution d'un
print(...)
ne rend pas automatiquement la main, il faut valider chaque ligne affichée avec le caractère ASCII de contrôle de code 6 ctrl
F)
print(...)
sur la calculatrice 4) Liste modules Python :
Go to tophelp("modules")
afin d'avoir la liste de tous les modules TI-Python wrote:>>> # Shell Reinitialized
>>> help()
To list built-in modules please do `help("modules")`.
>>> help("modules")
__main__ collections random
array gc sys
builtins math time
Plus any modules on the filesystem
>>>
__main__ étant le script courant qui ne compte pas, nous avons donc 8 modules intégrés :
- array
- builtins
- collections
- gc
- math
- random
- sys
- time

Pour comparaison :

D'où le classement suivant :
- module externe TI-Pythonavec8modules
- + + NumWorks(version 10.0.0)avec7modules
- NumWorks(version 9.2.0)avec6modules
- Casio Graph 90+Eavec4modules

5) Nombres complexes :
Go to topMais même si donc les fonctions complexes
Testons :
TI-Python wrote:>>> # Shell Reinitialized
>>> 1j
Traceback (most recent call last):
File "<stdin>", line 1
SyntaxError: complex values not supported
>>>
Pour comparaison :

D'où le classement suivant :
- NumWorks+ + avec calculs et fonctions complexes
- Casio Graph 90+Eavec calculs complexes
- module externe TI-Python
6) Exploration module sys :
Go to top- Code: Select all
def sstr(obj):
try:
s=obj.__name__
except:
s=str(obj)
a=s.find("'")
b=s.rfind("'")
if a>=0 and b!=a:
s=s[a+1:b]
return s
def isExplorable(obj):
s=str(obj)
return s.startswith("<module '") or s.startswith("<class '")
def explmod(pitm,pitmsl=[],reset=True):
global curline
if(reset):
curline=0
pitmsl=[sstr(pitm)]
hd="."*(len(pitmsl)-1)
spath=".".join(pitmsl)
c=0
for itms in sorted(dir(pitm)):
c=c+1
try:
itm=eval(spath+"."+itms)
print(hd+itms+"="+str(itm))
if isExplorable(itm):
pitmsl2=pitmsl.copy()
pitmsl2.append(itms)
c=c+explmod(itm,pitmsl2,False)
except:
print(hd+itms)
if c>0:
print(hd+"Total: "+str(c)+" item(s)")
return c
L'appel
explmod(sys)
nous produit alors :TI-Python wrote:>>> # Shell Reinitialized
>>> from explmod import *
>>> import sys
>>> explmod(sys)
__name__=sys
argv=[]
byteorder=little
exit=<function>
implementation=(name='circuitpython', version=(3, 0, 0))
maxsize=1073741823
modules={}
path=['', '/', '/lib', '.frozen']
platform=TI-Python Adapter
print_exception=<function>
stderr=<io.FileIO 2>
stdin=<io.FileIO 0>
stdout=<io.FileIO 1>
version=3.4.0
version_info=(3, 4, 0)
Total: 15 item(s)
15
>>>
Comme promis, nous en apprenons davantage sur le module externe
Niveau implémentation il s'agit apparemment d'un
Notons le
sys.platform=='TI-Python Adapter'
qui permettra donc à un script de savoir si il tourne sur le module externe Notons également que lorsque l'on demande au module externe
- dans le dossier courant
- dans le dossier racine /
- dans le dossier /lib
- dans .frozen
7) Nombres entiers courts et longs :
Go to topsys.maxsize==1073741823
.Cette constante indique la borne supérieure pour les valeurs d'entiers courts. Notons que les entiers courts sont représentables nativement dans le langage machine de la plateforme faisant tourner l'implémentation
Les entiers courts peuvent donc ici prendre des valeurs de
Ce qui veut dire que les entiers courts sont ici codés sur 31 bits :
- 1 bit pour le signe
- 30 bits pour le nombre non signé
C'est moins que le standard
Voilà pourquoi nous qualifions plus haut
Mais si nous parlons d'entiers courts, c'est qu'il existe des entiers longs. En
Ce comportement n'est toutefois valide qu'à condition que le support des entiers longs ait été activé à la compilation. Vérifions cela :
TI-Python wrote:>>> # Shell Reinitialized
>>> import sys
>>> sys.maxsize+1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: small int overflow
>>>
Mais puisque cela ne concerne que le contexte des nombres entiers, ce n'est à notre avis pas bien gênant au lycée.
Pour comparaison :

D'où le classement suivant :
- NumWorks+ + +Casio Graph 90+Eavec entiers courts sur 32 bits et entiers longs
- module externe TI-Pythonavec entiers courts sur 31 bits
8) Reference design :
Go to top
Pour nous il est désormais clair que
Le
Les changements apportés incluent entre autres:
- pour le matériel :
- remplacement du connecteur USB micropar de l'USB mini
- retrait de la diode RVB (siTrinket M0)
- retrait de l'oscillateur à cristal de quartz 32.768 KHz (siFeather M0)
- retrait du connecteur batterie LiPo (siFeather M0)
- retrait de la Flash SPI (siFeather M0)
- probablement divers ajustements pour garantir le bon fonctionnement de l'USB dans le contexte spécifique d'utilisation, c'est-à-dire :
- alimenté par la calculatrice (variations de voltage)
- dans un contexte scolaire (nombreux changements de salle et sorties de bâtiment quotidiens et donc variations de température)
- alimenté par la calculatrice
- remplacement du connecteur
- pour le logiciel :
- couche de communication bidirectionnelle avec l'application PyAdaptrde la calculatrice
- couche de communication bidirectionnelle avec l'application
9) Exploration fonctions builtins :
Go to top- Code: Select all
def explmod(pitm,pitmsl=[],reset=True):
global curline
if(reset):
curline=0
pitmsl=[sstr(pitm)]
hd="."*(len(pitmsl)-1)
spath=".".join(pitmsl)
c=0
for itms in sorted(dir(pitm)):
c=c+1
try:
itm=eval(spath+"."+itms)
print(hd+itms+"="+str(itm))
if isExplorable(itm):
pitmsl2=pitmsl.copy()
pitmsl2.append(itms)
c=c+explmod(itm,pitmsl2,False)
except:
print(hd+itms)
if c>0:
print(hd+"Total: "+str(c)+" item(s)")
return c
L'appel
explmod(builtins)
nous produit alors :- Code: Select all
>>> # Shell Reinitialized
>>> from explmod import *
>>> import builtins
>>> explmod(builtins)
ArithmeticError=<class 'ArithmeticError'>
AssertionError=<class 'AssertionError'>
AttributeError=<class 'AttributeError'>
BaseException=<class 'BaseException'>
.__init__=<function>
.Total: 1 item(s)
EOFError=<class 'EOFError'>
Ellipsis=Ellipsis
Exception=<class 'Exception'>
GeneratorExit=<class 'GeneratorExit'>
ImportError=<class 'ImportError'>
IndentationError=<class 'IndentationError'>
IndexError=<class 'IndexError'>
KeyError=<class 'KeyError'>
KeyboardInterrupt=<class 'KeyboardInterrupt'>
LookupError=<class 'LookupError'>
MemoryError=<class 'MemoryError'>
NameError=<class 'NameError'>
NotImplementedError=<class 'NotImplementedError'>
OSError=<class 'OSError'>
OverflowError=<class 'OverflowError'>
ReloadException=<class 'ReloadException'>
RuntimeError=<class 'RuntimeError'>
StopIteration=<class 'StopIteration'>
SyntaxError=<class 'SyntaxError'>
SystemExit=<class 'SystemExit'>
TypeError=<class 'TypeError'>
UnicodeError=<class 'UnicodeError'>
ValueError=<class 'ValueError'>
ZeroDivisionError=<class 'ZeroDivisionError'>
__build_class__=<function>
__import__=<function>
__name__=builtins
__repl_print__=<function>
abs=<function>
all=<function>
any=<function>
bin=<function>
bool=<class 'bool'>
bytearray=<class 'bytearray'>
.append=<function>
.extend=<function>
.Total: 2 item(s)
bytes=<class 'bytes'>
.count=<function>
.endswith=<function>
.find=<function>
.format=<function>
.index=<function>
.isalpha=<function>
.isdigit=<function>
.islower=<function>
.isspace=<function>
.isupper=<function>
.join=<function>
.lower=<function>
.lstrip=<function>
.replace=<function>
.rfind=<function>
.rindex=<function>
.rsplit=<function>
.rstrip=<function>
.split=<function>
.startswith=<function>
.strip=<function>
.upper=<function>
.Total: 22 item(s)
callable=<function>
chr=<function>
classmethod=<class 'classmethod'>
dict=<class 'dict'>
.__delitem__=<function>
.__getitem__=<function>
.__setitem__=<function>
.clear=<function>
.copy=<function>
.fromkeys=<bound_method>
.get=<function>
.items=<function>
.keys=<function>
.pop=<function>
.popitem=<function>
.setdefault=<function>
.update=<function>
.values=<function>
.Total: 14 item(s)
dir=<function>
divmod=<function>
enumerate=<class 'enumerate'>
eval=<function>
exec=<function>
filter=<class 'filter'>
float=<class 'float'>
getattr=<function>
globals=<function>
hasattr=<function>
hash=<function>
help=<function>
help=<function>
hex=<function>
id=<function>
input=<function>
input=<function>
int=<class 'int'>
.from_bytes=<bound_method>
.to_bytes=<function>
.Total: 2 item(s)
isinstance=<function>
issubclass=<function>
iter=<function>
len=<function>
list=<class 'list'>
.append=<function>
.clear=<function>
.copy=<function>
.count=<function>
.extend=<function>
.index=<function>
.insert=<function>
.pop=<function>
.remove=<function>
.reverse=<function>
.sort=<function>
.Total: 11 item(s)
locals=<function>
map=<class 'map'>
max=<function>
memoryview=<class 'memoryview'>
min=<function>
next=<function>
object=<class 'object'>
oct=<function>
open=<function>
ord=<function>
pow=<function>
print=<function>
property=<class 'property'>
.deleter=<function>
.getter=<function>
.setter=<function>
.Total: 3 item(s)
range=<class 'range'>
repr=<function>
round=<function>
set=<class 'set'>
.__contains__=<function>
.add=<function>
.clear=<function>
.copy=<function>
.difference=<function>
.difference_update=<function>
.discard=<function>
.intersection=<function>
.intersection_update=<function>
.isdisjoint=<function>
.issubset=<function>
.issuperset=<function>
.pop=<function>
.remove=<function>
.symmetric_difference=<function>
.symmetric_difference_update=<function>
.union=<function>
.update=<function>
.Total: 18 item(s)
setattr=<function>
slice=<class 'slice'>
sorted=<function>
staticmethod=<class 'staticmethod'>
str=<class 'str'>
.count=<function>
.endswith=<function>
.find=<function>
.format=<function>
.index=<function>
.isalpha=<function>
.isdigit=<function>
.islower=<function>
.isspace=<function>
.isupper=<function>
.join=<function>
.lower=<function>
.lstrip=<function>
.replace=<function>
.rfind=<function>
.rindex=<function>
.rsplit=<function>
.rstrip=<function>
.split=<function>
.startswith=<function>
.strip=<function>
.upper=<function>
.Total: 22 item(s)
sum=<function>
super=<class 'super'>
tuple=<class 'tuple'>
.count=<function>
.index=<function>
.Total: 2 item(s)
type=<class 'type'>
zip=<class 'zip'>
Total: 190 item(s)
190
>>>
Pour comparaison :
NumWorks | Casio Graph 90+E | module externe TI-Python | ||
ArithmeticError<0> AssertionError<0> AttributeError<0> BaseException<1> EOFError<0> Ellipsis=Ellipsis Exception<0> GeneratorExit<0> ImportError<0> IndentationError<0> IndexError<0> KeyError<0> KeyboardInterrupt<0> LookupError<0> MemoryError<0> NameError<0> NotImplemented=NotImplemented NotImplementedError<0> OSError<0> OverflowError<0> RuntimeError<0> StopIteration<0> SyntaxError<0> SystemExit<0> TypeError<0> UnicodeError<0> ValueError<0> ViperTypeError<0> ZeroDivisionError<0> __build_class__() __import__() __repl_print__() abs() all() any() bin() bool<0> bytearray<2> bytes<26> callable() chr() classmethod<0> compile() complex<0> dict<14> dir() divmod() enumerate<0> eval() exec() filter<0> float<0> frozenset<18> getattr() globals() hasattr() hash() hex() id() input() int<2> isinstance() issubclass() iter() len() list<11> locals() map<0> max() memoryview<0> min() next() object<2> oct() open() ord() pow() print() property<3> range<0> repr() reversed<0> round() set<18> setattr() sorted() staticmethod<0> str<26> sum() super<0> tuple<2> type<0> zip<0> | ArithmeticError<0> AssertionError<0> AttributeError<0> BaseException<0> EOFError<0> Ellipsis=Ellipsis Exception<0> GeneratorExit<0> ImportError<0> IndentationError<0> IndexError<0> KeyError<0> KeyboardInterrupt<0> LookupError<0> MemoryError<0> NameError<0> NotImplementedError<0> OSError<0> OverflowError<0> RuntimeError<0> StopIteration<0> SyntaxError<0> SystemExit<0> TypeError<0> ValueError<0> ZeroDivisionError<0> __build_class__() __import__() __name__=builtins __repl_print__() abs() all() any() bin() bool<0> bytes<22> callable() chr() classmethod<0> complex<0> dict<14> dir() divmod() enumerate<0> eval() exec() filter<0> float<0> frozenset<9> getattr() globals() hasattr() hash() hex() id() input() int<2> isinstance() issubclass() iter() len() list<11> locals() map<0> max() min() next() object<0> oct() open() ord() pow() print() range<0> repr() reversed<0> round() set<18> setattr() slice<0> sorted() staticmethod<0> str<22> sum() super<0> tuple<2> type<0> zip<0> | ArithmeticError<0> AssertionError<0> AttributeError<0> BaseException<0> EOFError<0> Ellipsis=Ellipsis Exception<0> GeneratorExit<0> ImportError<0> IndentationError<0> IndexError<0> KeyError<0> KeyboardInterrupt<0> LookupError<0> MemoryError<0> NameError<0> NotImplementedError<0> OSError<0> OverflowError<0> RuntimeError<0> StopIteration<0> SyntaxError<0> SystemExit<0> TypeError<0> ValueError<0> ZeroDivisionError<0> __build_class__() __import__() __name__=builtins __repl_print__() abs() all() any() bin() bool<0> bytes<22> callable() chr() classmethod<0> complex<0> dict<14> dir() divmod() eval() exec() float<0> getattr() globals() hasattr() hash() hex() id() input() int<2> isinstance() issubclass() iter() len() list<11> locals() map<0> max() min() next() object<0> oct() open() ord() pow() print() range<0> repr() round() set<18> setattr() slice<0> sorted() staticmethod<0> str<22> sum() super<0> tuple<2> type<0> zip<0> | ArithmeticError<0> AssertionError<0> AttributeError<0> BaseException<0> EOFError<0> Ellipsis=Ellipsis Exception<0> GeneratorExit<0> ImportError<0> IndentationError<0> IndexError<0> KeyError<0> KeyboardInterrupt<0> LookupError<0> MemoryError<0> NameError<0> NotImplementedError<0> OSError<0> OverflowError<0> RuntimeError<0> StopIteration<0> SyntaxError<0> SystemExit<0> TypeError<0> ValueError<0> ZeroDivisionError<0> __build_class__() __import__() __name__=builtins __repl_print__() abs() all() any() bin() bool<0> bytearray<2> bytes<26> callable() chr() classmethod<0> complex<0> dict<14> dir() divmod() enumerate<0> eval() exec() filter<0> float<0> frozenset<9> getattr() globals() hasattr() hash() hex() id() input() int<2> isinstance() issubclass() iter() len() list<11> locals() map<0> max() memoryview<0> min() next() object<0> oct() open() ord() pow() print() property<3> range<0> repr() reversed<0> round() set<18> setattr() slice<0> sorted() staticmethod<0> str<26> sum() super<0> tuple<2> type<0> zip<0> | ArithmeticError<0> AssertionError<0> AttributeError<0> BaseException<1> EOFError<0> Ellipsis=Ellipsis Exception<0> GeneratorExit<0> ImportError<0> IndentationError<0> IndexError<0> KeyError<0> KeyboardInterrupt<0> LookupError<0> MemoryError<0> NameError<0> NotImplementedError<0> OSError<0> OverflowError<0> ReloadException<0> RuntimeError<0> StopIteration<0> SyntaxError<0> SystemExit<0> TypeError<0> UnicodeError<0> ValueError<0> ZeroDivisionError<0> __build_class__() __import__() __name__=builtins __repl_print__() abs() all() any() bin() bool<0> bytearray<2> bytes<22> callable() chr() classmethod<0> dict<14> dir() divmod() enumerate<0> eval() exec() filter<0> float<0> getattr() globals() hasattr() hash() help() help() hex() id() input() input() int<2> isinstance() issubclass() iter() len() list<11> locals() map<0> max() memoryview<0> min() next() object<0> oct() open() ord() pow() print() property<3> range<0> repr() round() set<18> setattr() slice<0> sorted() staticmethod<0> str<22> sum() super<0> tuple<2> type<0> zip<0> |
218 | 188 | 175 | 204 | 190 |
D'où le classement suivant :
- avec 218entrées
- avec 204entrées
- module externe TI-Pythonavec190entrées
- NumWorksavec188entrées
- Casio Graph 90+Eavec175entrées

10) Exploration module math :
Go to top- Code: Select all
def explmod(pitm,pitmsl=[],reset=True):
global curline
if(reset):
curline=0
pitmsl=[sstr(pitm)]
hd="."*(len(pitmsl)-1)
spath=".".join(pitmsl)
c=0
for itms in sorted(dir(pitm)):
c=c+1
try:
itm=eval(spath+"."+itms)
print(hd+itms+"="+str(itm))
if isExplorable(itm):
pitmsl2=pitmsl.copy()
pitmsl2.append(itms)
c=c+explmod(itm,pitmsl2,False)
except:
print(hd+itms)
if c>0:
print(hd+"Total: "+str(c)+" item(s)")
return c
L'appel
explmod(math)
nous produit alors :TI-Python wrote:>>> # Shell Reinitialized
>>> from explmod import *
>>> import math
>>> explmod(math)
__name__=math
acos=<function>
asin=<function>
atan=<function>
atan2=<function>
ceil=<function>
copysign=<function>
cos=<function>
degrees=<function>
e=2.71828
exp=<function>
fabs=<function>
floor=<function>
fmod=<function>
frexp=<function>
isfinite=<function>
isinf=<function>
isnan=<function>
ldexp=<function>
log=<function>
modf=<function>
pi=3.14159
pow=<function>
radians=<function>
sin=<function>
sqrt=<function>
tan=<function>
trunc=<function>
Total: 28 item(s)
28
>>>
Pour comparaison :

Notons toutefois que cette sélection est un peu plus riche que sur
D'où le classement suivant :
- + + NumWorksavec41entrées
- module externe TI-Pythonavec28entrées
- Casio Graph 90+Eavec23entrées
math.pi==3.14159
sur le module externe math.pi=3.141592653589793
comme sur toutes les solutions concurrentes.Pareil avec
math.e==2.71828
au lieu de math.e==2.718281828459045
.Un problème avec la précision des décimales ? Parce que ce n'est pas possible, elle serait inférieur à ce qu'offre une calculatrice 4 opérations du primaire...
11) Nombres flottants et précision :
Go to topmath.pi==3.14159
. Les nombres décimaux sont en fait calculés en virgule flottante, soit sous la forme En
- simple précision / 32 bits :
- 1 bit pour le signe de la mantisse M
- 23 bits pour la valeur absolue de la mantisse M (qui en fait peut prendre des valeurs sur 24 bits, puisque le 1 systématique de la partie entière n'est pas stocké)
- 8 bits pour l'exposant E
- double précision / 64 bits :
- 1 bit pour le signe de la mantisse M
- 52 bits pour la valeur absolue de la mantisse M (qui en fait peut prendre des valeurs sur 53 bits)
- 11 bits pour l'exposant E
Testons donc la précision des mantisses et exposants sur le module externe
- Code: Select all
def precm(b):
k,b=0,float(b)
while 1+b**-k-1>0:
k+=1
return k
def prece():
k=0
while 2.**-k>0:
k+=1
em=-k+1
k=0
while str(2.**(em+2**k))[0:3]!='inf':
k+=1
return k
Voici la sortie obtenue :
TI-Python wrote:>>> # Shell Reinitialized
>>> from prec import *
>>> precm(2)
22
>>> precm(10)
7
>>> prece()
9
Le module externe
- des valeurs absolues de mantisses M sur 22 bits (soit environ 7 chiffres significatifs)
- des exposants E sur 9 bits
Pour comparaison :

D'où le classement :
- + NumWorks+Casio Graph 90+E+ avec53+12bits
- HP Primeavec48+12bits
- Casio Graph 90+EavecKhiCASavec45+12bits
- module externe TI-Pythonavec22+9bits
Et déjà, le standard 24/23 bits est considéré comme n'étant jamais suffisant, à partir du moment où il y a besoin de calculs décimaux.
Une catastrophe, si ça reste en l'état !
Pourquoi ? Nous n'allons sûrement rien apprendre à un constructeur de calculatrices, mais comme toute représentation en virgule flottante tu vas avoir facilement des erreurs de calcul qui vont se propager sur le dernier chiffre significatif, puis l'avant-dernier et ainsi de suite. Mais ici avec seulement dans les 7 chiffres significatifs, ces erreurs vont donc facilement atteindre des chiffres recopiables sur ta copie !
Quelques exemples :
- Simple algorithme de somme :
- Code: Select all
def sumr(n,a,b,d=1):
s=0
for k in range(a,b+d,d):
s+=1/k**n
return s
L'appelsumr(-0.1,195,1,-1)
fournit la sortie suivante sur le module externeTI-Python:TI-Python wrote:>>> # Shell Reinitialized
>>> from sumr import *
>>> sumr(-0.1,195,1,-1)
300.788
>>>Or, la bonne approximation au millième près n'est pas300,788mais300,792comme le dit unanimement la concurrence !Mais le pire est à venir, lorsque nous allons enchaîner des calculs différents... - Passons au niveau Première avec les racines d'un polynôme du second degré :
- Code: Select all
from math import *
def roots(a,b,c):
d=b*b-4*a*c
print("delta=b^2-4ac="+str(delta))
if d<0:
print("delta<0")
print("pas de racine reelle")
return
else:
w=sqrt(d)
x1=(-b+w)/(2*a)
if d==0:
print("delta=0")
print("1 racine double")
print("x=-b/(2a)="+str(x1))
return x1
else:
x2=(-b-w)/(2*a)
print("delta>0")
formule="racine(delta)"
print("2 racines")
print("x1=(-b+"+formule+")/(2a)="+str(x1))
print("x2=(-b-"+formule+")/(2a)="+str(x2))
return x1,x2
L'appelroots(1281.421,2562.8424,1281.421)
fournit la sortie suivante sur le module externeTI-Python:TI-Python wrote:>>> # Shell Reinitialized
>>> from roots import *
>>> roots(1281.421,2562.8424,1281.421)
delta=b^2-4ac=0.0
delta=0
1 racine double
x=-b/(2a)=-1.0
-1.0
>>>Les conséquences ici vont bien au-delà d'une erreur de calcul pardonnable, puisque tout le raisonnement est faux. Il n'y a pas une racine double mais 2 racines distinctes, car en fait le discriminant n'est pas nul, loin de là ! Le discriminant vaut un peu plus de 2 comme l'indique unanimement la concurrence !Même la
TI-83 Premium CEdit pareil avec son moteur de calcul historique !
Le pire, c'est donc qu'utiliser le module externeTI-Pythoncensé améliorer taTI-83 Premium CEen dégrade en fait les capacités de calcul !
Et note bien qu'ici, les deux racines sont pourtant suffisamment distinctes, la différence étant bien loin de concerner les seuls deux derniers chiffres significatifs.Tu penses peut-être qu'il te suffira d'arrondir à l'unité pour ne pas avoir faux en recopiant les affichages de ton module externeTI-Python? Et bien non, ne crois pas être à l'abri pour autant... - Passons au niveau Terminale, avec un algorithme de seuil sur une suite convergente :
- Code: Select all
def seuil(d):
n,u,l,d=0,2.,1,d**2
while (u-l)**2>=d:
u,n=1+(1/((1-u)*(n+1))),n+1
print(n,u)
return n
Avec la ligne d'appelseuil(0.01)
, demandons au module externeTI-Pythonà partir de quel rang nous seront à moins d'un centième de la limite de la suite, ici 1 :TI-Python wrote:>>> # Shell Reinitialized
>>> from seuil import *
>>> seuil(0.01)
[...]
5842 1.01001
5843 0.982895
5844 1.01
5845 0.982897
5846 1.01
5847 0.9829
5848 1.01
5848
>>>Sauf que ce n'est pas à partir du rangn=5848que les termes de la suite rentrent dans l'intervalle [0,99;1,01]. Cette valeur est complètement délirante, puisque c'est en fait à partir du rangn=6366comme le crie unaniment la concurrence :
Si si, même laTI-83 Premium CEest d'accord et même doublement !Si tu crois avoir vu le pire avec un millier de différence, attends-toi à être surpris(e)... - Restons sur les suites de Terminale, mais cette fois-ci en spécialité avec une suite récurrente d'ordre 2 :
- Code: Select all
from math import *
def u(n):
k=0
uc=1
un=1-sqrt(2)
for k in range(n):
t=2*un+uc
uc=un
un=t
return uc
def table(u,n):
for i in range(n):
print(i,u(i))
Avec la ligne d'appeltable(u,23)
, nous obtenons sur le module externeTI-Python:TI-Python wrote:>>> # Shell Reinitialized
>>> from suite2 import *
>>> table(u,23)
0 1
1 -0.414213
2 0.171574
3 -0.0710659
4 0.0294418
5 -0.0121822
6 0.00507736
7 -0.00202751
8 0.00102234
9 1.71661e-05
10 0.00105667
11 0.00213051
12 0.00531769
13 0.0127659
14 0.0308495
15 0.0744648
16 0.179779
17 0.434023
18 1.04782
19 2.52967
20 6.10717
21 14.744
22 35.5952De quoi conjecturer une suite croissante divergeant vers +∞ ?...
Et bien non, perdu, cette suite converge vers 0 comme la concurrence te le dira :
Même laTI-83 Premium CEabonde dans le même sens :Mais attends, tu n'as pas tout vu, on peut avoir pire qu'un résultat faux : pas de résultat du tout !... - Terminons en redescendant au niveau Première, avec l'approche du nombre dérivé par la limite du taux de variation :
- Code: Select all
def f(x):
return x*x*x
def ta1(f,x,h):
return (f(x+h)-f(x))/h
def ta2(f,x,h):
return (f(x+2*h)-2*f(x+h)+f(x))/h/h
def table(f,x,n):
for k in range(n):
h=10**-k
print(h,ta1(f,x,h),ta2(f,x,h))
Taponstable(f,1,7)
pour approcher sur le module externeTI-Pythonles dérivées première et seconde de la fonction d'expression$mathjax$f(x)=x^3$mathjax$en x=1 :TI-Python wrote:>>> # Shell Reinitialized>>> from table import *
>>> table(f,1,7)
1 7.0 12.0
0.1 3.30999 6.60005
0.01 3.02997 6.07967
0.001 3.00264 5.72205
0.0001 2.98977 143.051
1e-05 3.00407 0.0
1e-06 2.86102 0.0
>>>Et bien c'est pire que d'habitude... l'affichage est tout simplement inexploitable, aucune conjecture n'est possible.
En fait, la dérivée seconde se met à délirer dès la 4ème itération pour devenir aberrante dès la 5ème. La dérivée première sort quant à elle définitivement des clous à la 7ème itération.
Les valeurs que l'ensemble de la concurrence permettent de conjecturer sontf'(1)=3etf''(1)=6:
Mais voilà avec seulement 22 bits soit 7 chiffres significatifs, sur le module externe
Comme de plus tu n'as donc que 7 chiffres significatifs, les erreurs vont très rapidement altérer la partie utile du résultat, celle que tu as l'habitude de recopier. Avec des conséquences désagréables lors d'une évaluation, notamment si tu omets la justification.
Et ça encore, c'est quand le résultat n'est pas totalement aberrant ou inexploitable...
Le comble étant que toute la concurrence, la
Bref, nous espérons que Texas Instruments remédie à cette situation problématique d'ici la sortie officielle en mi-mars...
12) Exploration autres modules :
Go to top- Code: Select all
def explmod(pitm,pitmsl=[],reset=True):
global curline
if(reset):
curline=0
pitmsl=[sstr(pitm)]
hd="."*(len(pitmsl)-1)
spath=".".join(pitmsl)
c=0
for itms in sorted(dir(pitm)):
c=c+1
try:
itm=eval(spath+"."+itms)
print(hd+itms+"="+str(itm))
if isExplorable(itm):
pitmsl2=pitmsl.copy()
pitmsl2.append(itms)
c=c+explmod(itm,pitmsl2,False)
except:
print(hd+itms)
if c>0:
print(hd+"Total: "+str(c)+" item(s)")
return c
Voici la sortie obtenue :
TI-Python wrote:>>> # Shell Reinitialized
>>> import array
>>> explmod(array)
__name__=array
array=<class 'array'>
.append=<function>
.extend=<function>
.Total: 2 item(s)
Total: 4 item(s)
4
>>> import collections
>>> explmod(collections)
__name__=collections
namedtuple=<function>
Total: 2 item(s)
2
>>> import gc
>>> explmod(gc)
__name__=gc
collect=<function>
disable=<function>
enable=<function>
isenabled=<function>
mem_alloc=<function>
mem_free=<function>
Total: 7 item(s)
7
>>> import random
>>> explmod(random)
__name__=random
choice=<function>
getrandbits=<function>
randint=<function>
random=<function>
randrange=<function>
seed=<function>
uniform=<function>
Total: 8 item(s)
8
>>> import time
>>> explmod(time)
__name__=time
monotonic=<function>
sleep=<function>
struct_time=<class 'struct_time'>
Total: 4 item(s)
4
Comparaison bilan qui en découle :

D'où le classement final sur les entrées offertes :
- avec 307entrées
- NumWorks(version 10.0.0)avec295entrées
- avec 288entrées
- module externe TI-Pythonavec258entrées
- NumWorks(version 9.2.0)avec257entrées
- Casio Graph 90+Eavec206entrées
13) Mémoire de travail :
Go to top- les définitions globales (variables, fonctions, classes)issues des scripts importés
- les arguments d'appel de la ou des fonctions en cours d'exécution
- les définitions locales effectuées par la ou les fonctions en cours d'exécution
Voici quelques tailles occupées en mémoire par des variables
- 64 octets pour une liste vide
- 8 octets par élément de liste supplémentaire
- 24 octets pour un entier nul
- 28 octets pour un entier court non nul
- 49 octets pour une chaîne vide
- 1 octet par caractère de chaîne supplémentaire
En se basant sur ces tailles, le script suivant permet d'estimer la capacité de la mémoire de travail en allouant plusieurs blocs de mémoire :
- Code: Select all
def mem():
try:
l=[]
try:
l+=[0]
l+=[""]
l[1]+="x"
while True:
try:
l[1]+=l[1][l[0]:]
except:
if l[0]<len(l[1])-1:
l[0]=len(l[1])-1
else:
raise(Exception)
except:
print("+",len(l)>1 and len(l[1]))
return 64+8*len(l)+(len(l) and 24+4*(l[0]>0)+(len(l)>1 and 49+len(l[1])))+mem()
except:
return 0
Voici la sortie obtenue :
TI-Python wrote:>>> # Shell Reinitialized
>>> from mem import *
>>> mem()
+ 8196
+ 4096
+ 2176
+ 1428
+ 512
+ 408
+ 252
+ 80
+ 32
+ 4
+ 4
+ 4
17192
>>>
L'on dispose donc sur le module externe
Cette mémoire de travail comporte donc entre autres ici des blocs continus de
D'où le classement :
- avec 2,046Mo
- Casio Graph 90+Eavec1,027Mo
- avec 255,07Ko
- avec 30,147Ko
- module externe TI-Pythonavec17,192Ko
- calculatrice NumWorksavec13,658Ko
- logiciel web NumWorksavec5,946Ko
14) Performances :
Go to topAfin d'être équitable, le script de test ne doit pas utiliser de nombre flottants. Contentons-nous donc d'un script travaillant sur des entiers, et ne nécessitant pas d'entiers longs :
- Code: Select all
try:
from time import *
except:
pass
def hastime():
try:
monotonic()
return True
except:
return False
def genseed(ndigits):
nmax,s,k=5*10**(ndigits-1),0,1
while s<nmax:
s+=k
k*=2
return s
def genarr(ndigits):
sd,arr=genseed(ndigits),[]
for k in range(1,ndigits):
for j in range(ndigits):
t=sd%10**k
arr.extend([t,-t,10**k-t,t-10**k])
sd=sd//10+(sd%10)*10**(ndigits-1)
arr.extend([sd,-sd])
return arr
def sortarr(arr,sdiff):
segs=[0,len(arr)-1]
while len(segs):
iref=segs[0]
for k in range(segs[0],segs[1]+1):
if sdiff*(arr[k]-arr[iref])>0:
t=arr[iref]
arr[iref]=arr[k]
arr[k]=arr[iref+1]
arr[iref+1]=t
iref+=1
if iref>=segs[0]+2:
segs.extend([segs[0],iref-1])
if iref<=segs[1]-2:
segs.extend([iref+1,segs[1]])
segs.pop(0)
segs.pop(0)
return arr
def test(l,n):
timed=hastime()
start,stop,sdiff,arr=0 or timed and monotonic(),1,-1,[]
arr.extend(genarr(l))
for k in range(n):
arr.extend(sortarr(arr,sdiff))
sdiff=-sdiff
stop=timed and monotonic() or 1
return stop-start,len(arr),arr[0],arr[len(arr)//2-1],arr[len(arr)//2],arr[len(arr)-1]
La ligne d'appel
test(9,2)
se termine en Une fois le script exécuté à l'identique sur les autres plateformes, voici le classement obtenu :
- en 1,41s
- en 1,56s
- en 2,40s
- NumWorksen3,74s
- Casio Graph 90+Een4,75s
- HP Prime G2en8,81s
- en 9,78s
- HP Prime G1en20,73s
- module externe TI-Pythonen23,20s
- Casio Graph 90+EavecKhiCASen60,71s
Notons toutefois que les
15) Connexion USB en mode mise à jour :
Go to top
Nous avons alors dans ce cas accès un espace de stockage de
Nous y trouvons un fichier
Nous trouvons également un fichier
Adafruit Trinket M0 wrote:UF2 Bootloader v1.23.0 SFHR
Model: Trinket M0
Board-ID: SAMD21E18A-Trinket-v0
Notre

Le contenu du fichier
TI-Python wrote:UF2 Bootloader v1.0.3U SFRO
Model: TI-Python Adapter
Board-ID: TI Python Adapter
Nous ignorons pourquoi, mais
Nous ignorons si cette fonctionnalité a été cassé involontairement, ou si
16) Dumping et compatibilités :
Go to topIl est probable que le
De plus, certaines de ces cartes sont à la différence facilement trouvables pour moins de 10€ !
Enfin, les dimensions de la carte

Il n'est pas garanti que l'application
Conclusion :
Go to topPour la faible capacité de stockage
Pour le reste nous pouvons excuser l'absence de gestion des entiers longs, la faible mémoire de travail
Nous pouvons même excuser l'absence de gestion des nombres complexes puisque les élèves étant en Terminale S/STI2D/STL cette année ont donc eu droit à l'ancien programme de Seconde qui n'imposait pas encore un enseignement exclusivement en langage
Nous pouvons également excuser l'absence d'un module graphique, puisqu'il ne sera nécessaire avant la rentrée 2019 pour le nouveau programme de Physique-Chimie en Seconde.
En l'état actuel sur donc cette version
Or, si le module externe
Si il peut être fort intéressant d'évoquer en classe la représentation interne des nombres décimaux pour expliquer pourquoi le module externe
Ce serait donc à
En effet, nous avons signalé ce défaut en très bonne position en novembre 2018, et le module externe
Peut-être que le choix de partir sur une implémentation
Mais le constructeur
Nous ignorons la réponse mais le découvrirons bientôt, et la négative serait inexcusable.
Surtout, l'implémentation
