Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Marge »

Un tel MPO consacré à PI avec l'élégance de la formule de Viète ne serait pas complet sans la vénérable HP-65 - c'est aussi histoire de donner des émotions fortes à notre Gilles59.

Image

La HP-65 demande un peu d'efforts d'adaptation au programmeur :

- certaines fonctions utilisent deux pas, d'autres un seul, il s'agit de s'adapter lors des tests logiques ; par exemple, [x=y] saute les deux pas suivants si le résultat est FAUX ; si l'instruction à suivre (si VRAI) ne possède qu'un pas, il faut insérer un NOP (No operation) : cela signifie qu'il faut avoir en tête la taille de toutes les instructions ;

Image

- à l'allumage de la HP-65, sa mémoire programme n'est pas vide (oui, je me suis fait avoir, j'ai cru que j'avais un modèle unique à mémoire constante :lol: ) : elle contient les 5 fonctions supérieures du clavier (1/x, \/¨x, etc.) assignées aux étiquettes A à E : il est plus économique de passer par ces fonctions pour un MPO. Les étiquettes peuvent être redondantes, donc on ne perd pas nécessairement les fonctions "supérieures" mais il faut être prudent ;

- pas facile de compter la mémoire utilisée : chaque instruction mesure six bits (source MOHP : "The HP-65 had 100 lines of space and used label addressing. Each instruction word was 6 bits long allowing for 64 distinct operations.").

Voici le code qui reprend l'algorithme que j'ai utilisé sur la 29c (voir plus bas) :

Code : Tout sélectionner

33 08   STO  8     {c'est le registre 8 qui permet les boucles}
02      2
33 02   STO 2
23      LBL
11      1
12      V¨x
31      ENTER
31      ENTER
02      2
81      /
33      STO
81      /
02      2
35 08   g Rd
02      2
61      +
35      g
83      DSZ
22      GTO
12      1
34 02   RCL 2
84      R/S

(un RTN n'arrête pas le programme, la machine cherche... quelque chose, sans doute le label initial qui ici n'existe pas.)
On nettoie les registres (f CLEAR REG), on entre 10, on presse RTN, puis R/S.
3,141591422, , comme sa petite sœur, mais en 9 sec. .

22 pas, soit (22*6 bits/8) 16,5 octets ; je suppose qu'il faut ajouter 7 octets pour chaque registre, ce qui nous fait un total de 30,5 octets ma bonne dame.

Si on arrondit à l'octet supérieur, on obtient la même somme que pour la 29c.
Marge a écrit :Programme pour HP-29c

Code : Tout sélectionner

STO 0
2
STO 2
LBL 1
SQR
ENTER
ENTER
2
/
STO / 2
Rd
2
+
DSZ
GTO 1
RCL 2
RTN

3,141591422 en 7 sec. 5/10

17 pas, 2 registres, soit 31 octets.
J'édite pour donner le résultat de la HP-65 avec le programme de zpalm pour 15c ; 3,141591422 est trouvé en 8 secondes, c'est mieux.

Code : Tout sélectionner

23      LBL
11      A
33 08   STO 8
02      2
33 01   STO 1
23      LBL
01      1
12      V¨x
33      STO
81      /
01      1
02      2
33      STO
71      *
01      1
61      +
35      g
83      DSZ
22      GTO
01      1
34 01   RCL 1
84      RTN
Mais toujours 22 pas... certes avec le LBL A que j'ai omis dans le programme précédent.
Modifié en dernier par Marge le 18 nov. 2014 12:02, modifié 2 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par zpalm »

Bien vu Marge, une bonne idée de sortir la HP 65 pour ce MPO! :D

Continuons la revue des HP, en effet calculer Pi c’est bien, mais c’est encore mieux de le faire sur une machine non-scientifique qui ne connait pas ce nombre. Dans cette catégorie quoi de mieux qu’une HP 12C ? Commercialisée depuis 33 ans on ne trouvera sur cette machine aucune fonction ayant un rapport avec Pi.
 
Voici une version sur HP 12C en 15 pas et un seul registre soit un total de 22 octets ! Qui dit mieux ?
Ce programme devrait marcher tel que sur une HP 38E/C, mais aussi sur une HP 33E/C ou une 10C.

Code : Tout sélectionner

01        2    2
02    44  0    STO 0
03    43 21    √
04 44.10. 0    STO/ 0
05        2    2
06 44.20. 0    STO* 0
07       40    +
08       34    x<>y
09        1    1
10       30    -
11    43 35    X=0?
12 43.33 15    GTO 15
13       34    X<>Y
14 43.33 03    GTO 03
15    45  0    RCL 0
 
En ajoutant un ENTER au début (ce qui fait 16 pas) ça marche aussi sur une HP 25 encore plus vintage (1975)...

Code : Tout sélectionner

01       31    ENTER
02       02    2
03    23 00    STO 0
04    14 02    √
05 23 71 00    STO/ 0
06       02    2
07 23 61 00    STO* 0
08       51    +
09       21    x<>y
10       01    1
11       41    -
12    15 71    X=0?
13    13 16    GTO 16
14       21    X<>Y
15    13 04    GTO 04
16    24 00    RCL 0
Sur la 25 sans le ENTER le premier 2 est concaténé au nombre entré avant l’appel du programme au lieu d’être entré séparément dans la pile, du moins c’est ce que j’ai constaté sur l’émulateur go25c.
 
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Marge »

Sur la 25 sans le ENTER le premier 2 est concaténé au nombre entré avant l’appel du programme au lieu d’être entré séparément dans la pile, du moins c’est ce que j’ai constaté sur l’émulateur go25c.
Oui, c'est une caractéristique de la 25.

Je me demande bien comment tu obtiens ton signe V¨¨ (racine carrée) dans ton code publié...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
casuffitdeschanel
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 650
Enregistré le : 21 sept. 2009 21:56
Localisation : Metz

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par casuffitdeschanel »

Salut

J'ai fait le programme sur Casio FX 4000 P et sur HP 35S, 1000 iterations, la Casio est beaucoup, vraiment beaucoup plus rapide... incroyable...
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par zpalm »

Marge a écrit :Je me demande bien comment tu obtiens ton signe V¨¨ (racine carrée) dans ton code publié...
Un simple copier/coller ... :wink:

Pour changer de style de programmation, voici une formule pour le solveur des HP 17BII/27S/19BII. Elle utilise la fonction sigma pour la boucle et les fonctions Let et Get pour gérer des variables intermédiaires cachées.

Code : Tout sélectionner

Version avec A et B cachées:
V=L(A:2)xL(B:0)x∑(I:1:N:1:L(A:G(A)x2/L(B:SQRT(2+G(B)))))+G(A)

Version avec A et B visibles:
V=L(A:2)xL(B:0)x∑(I:1:N:1:L(A:Ax2/L(B:SQRT(2+B))))+A
Utilisation : N est le nombre de boucle, V le calcul de Pi selon Viète, A et B sont des variables intermédiaires non visibles. Par exemple: 9 [N] affiche N=9.00 puis [V] lance le calcul et retourne en moins de 2 secondes : 3.14158772527.
Bon, avec 72 octets pour le stockage de la première formule et 63 pour la deuxième, on est loin de la compacité du RPN…en partie à cause de la foultitude de parenthèses.

Petite explication:
  • L(A:2) initialise A à 2 et retourne 2
  • L(B:0) initialise B à 0 et retourne 0
  • ∑(I:1:N:1: boucle d’indice I, de 1 à N avec un pas de 1
  • L(A:G(A)x2/L(B:SQRT(2+G(B)))) c’est là que se fait le calcul :
    • G(A) et G(B) permettent de rappeler les valeurs de A et B sans montrer les variables dans le menu. On peut utiliser A et B à la place de G(A) et G(B) mais alors A et B sont visibles dans le menu.
    • L(B:SQRT(2+G(B))) retourne √(2+B) et le stocke dans B
    • L(A:G(A)x2/ L(B:SQRT(2+G(B))) retourne Ax2/√(2+B) et le stocke dans A
  • La fonction ∑ fait la somme de toutes les valeurs Ax2/√(2+B) calculées pour chaque valeur de I, puis le résultat est multiplié par 2 ( L(A:2) ) et par 0 ( L(B:0) ) ce qui fait 0.
  • Enfin on ajoute ce 0 à la valeur finale de A retournée par G(A) pour avoir le résultat V.
Avatar du membre
SbM
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4609
Enregistré le : 24 nov. 2004 21:49
Localisation : SQY (78), France
Contact :

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par SbM »

Marge a écrit : Je me demande bien comment tu obtiens ton signe V¨¨ (racine carrée) dans ton code publié...
√ = alt-shift-V sur OS X :)
http://sbm.ordinotheque.free.fr | http://www.mo5.com
"Un bon disque dur est un disque dur mort." (Général Cluster)
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par C.Ret »

Depuis Windows 3.1, il est facile d'obtenir tous les caractères possibles sur son système à l'aide de la "Table des Caractères".

Image

C'est toujours possible sur Windows 8.1 (et ce le sera certainement aussi sur les prochaines version).

Le tout est de savoir où trouver sa "Table des Caractères" (charmap.exe) ou un raccourci qui y conduit (ou de lancer CHARMAP.EXE le nom de cet outil n'a pas changé depuis 1991) .
Modifié en dernier par C.Ret le 23 juin 2022 09:45, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Marge »

Excellent rappel, C.Ret, j'avais oublié cette astuce ; le plus rapide pour moi est de passer par des codes tapés au clavier...
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par C.Ret »

Pour moi aussi.
Malheureusement, il y a maintenant bien plus de symbolse et caractères que peut en gérer les "raccourcis" ou "compositions au clavier".
C'est la fin des systèmes "legacy", où tous les codes étaient disponibles directement. Les système actuels sont maintenant multiples, ISO, Unicode, Ansi, VT-x00, etc...

Même un simple fichier texte dans le NotePad a maintenant plusieurs façons d'être enregistré ... et donc de plus en plus de chance de ne plus être ouvert ou lu de la même façon selon le système destinataire.

Cela m'inquiète un peu, et me rapelle une vieille histoire où des gens construisent ensemble une énorme tour très compliquée et sophistiquée qui atteint des sommets de technologie et des performances jamais égalées. Mais malheureusement, ce projet n'abouti pas, les gens ne se comprenant plus et ne s'entraidant plus.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Marge »

J'apprécie ton commentaire, et c'est peut-être malheureusement une histoire sans fin.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 292
Enregistré le : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Xerxes »

The TI-62, and surely some other TIs, allows a consequent use of the memory commands:

Code : Tout sélectionner

00  CM
01  STO 0
02  2
03  STO 1
04  LBL 0
05  2
06  ST* 1
07  ST+ 2
08  ST Y^1/X 2
09  RCL 2
10  ST/ 1
11  DSZ
12  GTO 0
13  RCL 1
14  R/S
The speed is really amazing: only 43.1 seconds for 10 iterations.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2919
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par zpalm »

Xerxes a écrit :The TI-62, and surely some other TIs, allows a consequent use of the memory commands:

Code : Tout sélectionner

08  ST Y^1/X 2
Interesting way to get the square root of register 2. I don't have a TI 62 but how do you get this function in a single step? STO Y^X 1/X 2?
Avatar du membre
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 292
Enregistré le : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Xerxes »

The key sequence for the TI-62 is: STO INV Y^X 0..9
The TI-65 allows this technique too.
Avatar du membre
badaze
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 8384
Enregistré le : 12 févr. 2007 18:36
Localisation : Pas très loin de Lyon
Contact :

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par badaze »

Xerxes a écrit :The TI-62, and surely some other TIs, allows a consequent use of the memory commands:

Code : Tout sélectionner

00  CM
01  STO 0
02  2
03  STO 1
04  LBL 0
05  2
06  ST* 1
07  ST+ 2
08  ST Y^1/X 2
09  RCL 2
10  ST/ 1
11  DSZ
12  GTO 0
13  RCL 1
14  R/S
The speed is really amazing: only 43.1 seconds for 10 iterations.
It has already a Trace mode that displays the current step when running if you think it's too quick. ;)
Tout est bon dans le pocket.
Moi j'aime tout.... Casio, HP, Sharp, TI et les autres sauf que les TI semblent ne pas m'aimer :(
http://www.emmella.fr
Mes Casio - HP - Sharp - TI
Homme invisible.
Avatar du membre
Xerxes
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 292
Enregistré le : 02 avr. 2007 13:41
Localisation : Allemagne
Contact :

Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète

Message par Xerxes »

badaze a écrit :It has already a Trace mode that displays the current step when running if you think it's too quick. ;)
The TI-62 is a bit curious. As you mentioned there is a trace mode to keep track of a running program,
but even in trace off mode you can still see the programming steps running but faster of course.
In the trace on mode the TI-62 needs 77 seconds for 10 iterations.

Some low end TIs like the TI-60 do not offer any kind of conditional branching or loop control commands
except of the RST command. So we have to initialize the vars manually and then starting the program, until
it stops on division by zero error.

Code : Tout sélectionner

2
STO
*
1
STO
+
2
STO
INV
Y^X
2
RCL
2
STO
/
1
1
STO
-
0
RCL
0
1/X
RST
The steps are not fully merged like the TI-62, so the TI-60 needs much more bytes.
Répondre

Retourner vers « Tous les Pockets »