Il est bien connu que les nombres rationnels ont des développements décimaux périodiques à partir d'un certain rang
(voir Wikipedia).
Par exemple $$\frac{37411}{33300} = 1,12\,345\,345\,345\dots$$
On a une partie entière $1$, une partie décimale fixe $12$ et une partie décimale périodique $345$.
Les notations classiques pour un tel développement sont $1,12\overline{345}$ ou $1,12\underline{345}$ voire $1,12[345]$.
De la même manière qu'on utilise une virgule pour séparer la partie entière de la partie décimale, on peut utiliser un point-virgule pour séparer la partie décimale fixe de la partie décimale périodique.
Pour l'exemple précédent, on obtient l'écriture (beaucoup plus facile à entrer au clavier) : $$\frac{37411}{33300} = 1,12;345$$
S'il n'y a pas de partie décimale fixe, on convient de supprimer la virgule qui est devant le point virgule, par exemple $\frac{1}{3} = 0;3$ au lieu de $0,;3$.
(Attention à ne pas confondre $0;3 = \frac{1}{3}$ et $0,3 = \frac{3}{10}$ !)
À l'invite de commande, on tape une expression à évaluer et on lance l'évaluation avec la touche [Entrée].
On peut utiliser les touches de mouvement du curseur pour éditer la ligne ou les lignes précédentes.
On dispose des quatre opérations +, -, *, / et la puissance ^ à exposant entier relatif.
La réponse est donnée sous forme de fraction et sous forme de développement décimal.
On peut stocker les résultats dans des variables dont les noms suivent la règle du langage Python.
On quitte le programme avec Ctrl + C.
On voit sur la copie d'écran que le programme n'utilise pas la virgule et le point-virgule comme séparateurs. J'ai essayé, mais "ça fait bizarre" . On est habitué à utiliser le point décimal sur les calculatrices et les ordinateurs. Les séparateurs sont donc '.' et ':'.
Lors du premier lancement du programme, on voit s'afficher le message "Generating LALR tables". C'est le module PLY qui émet ce message; il écrit deux fichiers dans le répertoire du script : parsetab.py et parser.out. Ce sont des fichiers texte que l'on peut examiner, mais pas modifier. Lors des lancements ultérieurs, le programme ne recalcule pas les tables du parseur, mais charge le module parsetab.py pour gagner du temps.
Le programme retourne toujours des développements décimaux propres (!):
$\texttt{
?> 1.24999:9999\\
5/4\\
1.25\\
?>}$
Les règles de priorité des opérations sont les mêmes que celle de Python.
En particulier, la puissance à la priorité devant toutes les autres opérations, même devant le moins unaire :
$\texttt{
?> -3\,\^\ 2\\
-9\\
-9\\
?>}$
comme en Python :
$\texttt{
>>> -3**2\\
-9\\
>>>}$
Les messages d'erreur sont succincts : à vous de trouver où ça coince !
$\texttt{
?> 5/0\\
Impossible de diviser par zero.\\
?> 2\,\^\ 1.5\\
L'exposant de la puissance n'est pas entier.\\
?> glop\\
La variable glop n'a pas de valeur.\\
?> 2**5\\
Erreur de syntaxe.\\
?>}$
Ce programme utilise le module Fraction (un formidable module standard de Python). C'est à lui que sont dévolus tous les calculs. Les résultats sont stockés sous forme de fractions. Seuls les résultats sont convertis en développements décimaux périodiques, car ceux-ci peuvent être très longs. Dans ce cas, la conversion peut être très longue : on peut arrêter tout avec Ctrl+C.
E. Catalan : Sur les fractions décimales périodiques
R. Rolland : Notes sur les développements décimaux périodiques