Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Modérateur : Politburo
-
remy
- Fonctionne à 2400 bauds

- Messages : 2086
- Inscription : 13 mars 2006 16:39
- Localisation : Issy
- Contact :
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Très bien vu le CLEAR Jérôme. C'est moins cher qu'un B=0.
PockEmul, Emulateur de pocket Sharp, Canon, Casio, HP, TI, NEC, Panasonic, Sanco, Seiko, General, National, ....
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store
- jvernet
- Fonctionne à 14400 bauds

- Messages : 7838
- Inscription : 24 mai 2002 09:57
- Localisation : France 69
- Contact :
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
On peut faire encore mieux avec les Sharp, avec la touche DEF. Sauf que je sais plus comment ça marche: tu tapes 10 DEF Aremy a écrit :Très bien vu le CLEAR Jérôme. C'est moins cher qu'un B=0.
en mode RUN et tu peux lire la valeur tapée avec le DEF A dans le programme. Je faisais ça tout le temps avec mes programmes. MAIS tu ne peux pas utiliser CLEAR.
Tiens, je viens d'acquèrir un 1246S. Quelle merde
JV
"l'ordinateur et l'homme sont les deux opposés les plus intégraux qui existent. L'homme est lent, peu rigoureux et très intuitif. L'ordinateur est super rapide, très rigoureux et complètement con."
-
remy
- Fonctionne à 2400 bauds

- Messages : 2086
- Inscription : 13 mars 2006 16:39
- Localisation : Issy
- Contact :
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
C'est le AREAD qui permet de lire la valeur à l'cran et la stocker dans une variable.
Mais ça prend le même nombre d'octets qu'un INPUT C 
Le 1247 utilise le proc SC61720, pas d'info donc pas d'émulo.
Mais tu peux utiliser le PC-1245 qui lui est émulé dans PockEmul. Tu peux même le programmer en C (enfin je crois, je ne souvient plus si j'ai développé les libs pour ce modèle)
Code : Tout sélectionner
10 "A" AREAD CLe 1247 utilise le proc SC61720, pas d'info donc pas d'émulo.
Mais tu peux utiliser le PC-1245 qui lui est émulé dans PockEmul. Tu peux même le programmer en C (enfin je crois, je ne souvient plus si j'ai développé les libs pour ce modèle)
PockEmul, Emulateur de pocket Sharp, Canon, Casio, HP, TI, NEC, Panasonic, Sanco, Seiko, General, National, ....
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Sur les HP49G+/50G avec la library long float 3.93 on peut calculer avec un nombre arbitraire de chiffres significatifs (la seule limite est la mémoire)jvernet a écrit : Sur certains langages, il doit être possible d'augmenter la precision (le nombre de decimales), par exemple avec un double en c. Les BASIC Microsoft avaient cette possibilité, quels autres ?
Exemple:
Code : Tout sélectionner
20 'DIGITS' STO @ Calculer avec 20 chiffres significatifs
'COS(PI/6)' ->FNUM @ Evaluer la formule en 'long float'
0.86602540378443864676Code : Tout sélectionner
«
'DIGITS' STO @ Nombre de chiffres significatifs pour les calculs
'N' STO @ Nombre d'itération pour calculer PI
2 R<->F 'F2' STO @ 2 en réel long
0 R<->F F2
1 N START
F2 FMULT SWAP F2 FADD FSQRT DUP UNROT FDIV
NEXT
NIP
»
'FViete' STO
Nb_Itération Nb_chiffres_significatifs FViete
Ex :
170 102 FViete
retourne en 170 itérations les 100 premières décimales de PI correctes :
Code : Tout sélectionner
314159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706786.E-101Cette library est vraiment très bien faite.Par exemple, la fonction ->FNUM calcule toute formule algébrique exacte (CAS) avec la précision souhaitée (100 décimales si vous voulez ou bien plus même). Genre 'PI' ->FNUM vous donne les 1000 premières décimales de PI ! Voilà une library qui va rester sur mon HP ;D
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+
- gege
- Fonctionne à 14400 bauds

- Messages : 7180
- Inscription : 31 janv. 2008 15:24
- Localisation : Banlieue Paârisienne
- Contact :
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Bonjour,
C'est impressionnant, mais il utilise une librairie toute faite...
Ca serait sympa un truc 100% fait sur la calculatrice.
G.E.
C'est impressionnant, mais il utilise une librairie toute faite...
Ca serait sympa un truc 100% fait sur la calculatrice.
G.E.
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Salut Gege !gege a écrit :Bonjour,
C'est impressionnant, mais il utilise une librairie toute faite...
Ca serait sympa un truc 100% fait sur la calculatrice.
G.E.
Je sens bien C.RET sur ce coup ;D
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+
- babaorhum
- Fonctionne à 1200 bauds

- Messages : 452
- Inscription : 13 janv. 2013 20:44
- Localisation : Marseille-est
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Bonjour à tous,
... suis très en retard sur ce MPO ... j'ai bricolé ma proposition ce soir sur ma 42S, qui ressemble à la belle proposition de zpalm avec sa 41C :
Entrer le nombre d'itérations voulues et XEQ "V" -
Ma HP indique une taille de 22 byte pour ce petit programme.
Je suis au max de la précision de la machine avec un 19 XEQ"V" qui trouve 3,14159265364 en 3 secondes. Je remarque que la valeur de Pi est donné (sur la même machine ) par 3,159265359 soit un écart de 5E-11. J'obtiens donc la valeur de pi avec une précision inférieure à 1E-10 , pas mal quand même !
Il était fort ce VIETE et elle est toujours aussi chouette ma 42s !!!
... suis très en retard sur ce MPO ... j'ai bricolé ma proposition ce soir sur ma 42S, qui ressemble à la belle proposition de zpalm avec sa 41C :
Code : Tout sélectionner
01 LBL "V"
02 2
03 ENTER
04 LBL 01
05 SQRT
06 STO / ST Y
07 2
08 STO x ST Z
09 +
10 DSE ST Z
11 GTO 01
12 X<>Y
Ma HP indique une taille de 22 byte pour ce petit programme.
Je suis au max de la précision de la machine avec un 19 XEQ"V" qui trouve 3,14159265364 en 3 secondes. Je remarque que la valeur de Pi est donné (sur la même machine ) par 3,159265359 soit un écart de 5E-11. J'obtiens donc la valeur de pi avec une précision inférieure à 1E-10 , pas mal quand même !
Il était fort ce VIETE et elle est toujours aussi chouette ma 42s !!!
BaBaoRhum
HP J728,200LX,1000CX,75C,71B, 48GX,42s,41CX,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026
HP J728,200LX,1000CX,75C,71B, 48GX,42s,41CX,35s,32E,32Sii,28S,22s,21,16C,11C,12Cp
Sharp PC- E500,1600,1500,1350,1261,1245
Casio FX-502P,602p,850P,3900P,4000P
TI-74&92 ; Canon X-07 ; Panasonic HHC RL-H1400 ; TANDY EC-4026
- badaze
- Fonctionne à 14400 bauds

- Messages : 7462
- Inscription : 12 févr. 2007 19:36
- Localisation : Pas très loin de Lyon
- Contact :
Re: Calculons Pi comme Viète
Quatrième jet pour TI 57 II. Si on peut entrer le nombre d'itérations.
16 pas. Donne 3.1415914 pour 10 itérations en 14,5 secondes.
16 pas. Donne 3.1415914 pour 10 itérations en 14,5 secondes.
Code : Tout sélectionner
CM
STO 0
2
STO 2
LBL 1
2
STO + 1 (SUM 1 sur TI 57 LED)
STO X 2
RCL 1
Racine x
STO 1
STO / 2 (Inv Prd 2 sur TI 57 LED)
Dsz
GTO 1
RCL 2
R/S
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.
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.
Re: Calculons Pi comme Viète
Une adaptation directe de la version CASIO 602P ...
[/size]
... pour TI57 classique :
donne 3.1415914 pour 10 boucles.
je ne sais pour le temps l'émulateur étant beaucoup plus rapide....
Testé sur l'émulateur TI57 de la HP50 (qui s'appuie sur le microcode TI 57, voir http://www.hrastprogrammer.com/emulators.htm
16 pas soit 1 pas de plus que la 602 à cause du R/S
La version de Badaze sur TI57 II s'adapte facilement sur TI 57 classique :
Remplacer CM par C.T (je n'ai trouvé de CM sur TI57 "classique",ou j'ai loupé un truc ??)
Remplacer la mémoire 1 par la mémoire 7
Code : Tout sélectionner
SAC
Min00
2
LBL0
* 2 / 2 M+08 MR08 √ Min08
DSZ GOTO0
=... pour TI57 classique :
Code : Tout sélectionner
C.T
STO 0
2
LBL1
*
2
/
2
SUM 7
RCL 7
SQRT
STO 7
DSZ
GTO 1
=
R/S
je ne sais pour le temps l'émulateur étant beaucoup plus rapide....
Testé sur l'émulateur TI57 de la HP50 (qui s'appuie sur le microcode TI 57, voir http://www.hrastprogrammer.com/emulators.htm
16 pas soit 1 pas de plus que la 602 à cause du R/S
La version de Badaze sur TI57 II s'adapte facilement sur TI 57 classique :
Remplacer CM par C.T (je n'ai trouvé de CM sur TI57 "classique",ou j'ai loupé un truc ??)
Remplacer la mémoire 1 par la mémoire 7
Dernière édition par Gilles59 le 09 nov. 2014 14:02, édité 1 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+
Re: Calculons Pi comme Viète
J'ai l'intuition qu'il va être difficile de faire mieux ...badaze a écrit :Quatrième jet pour TI 57 II. Si on peut entrer le nombre d'itérations.
16 pas. Donne 3.1415914 pour 10 itérations en 14,5 secondes.
Belle optimisation depuis le début ;D
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Et un octet de plus gagné sur 502/602/603 ;D
14 pas :
14 pas :
Code : Tout sélectionner
SAC
Min00
2
LBL0
* 2 M+08 / MR08 √ Min08
DSZ GOTO0
=
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49G+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+
- Hobiecat
- Fonctionne à 9600 bauds

- Messages : 3397
- Inscription : 06 sept. 2011 14:57
- Localisation : Normandie
Re: Calculons Pi comme Viète
L'expérience des MPO montre qu'il ne faut jamais dire jamais, même s'il est vrai que sur ces dernières versions, il semble ne plus y avoir grand'chose à gagner...Gilles59 a écrit :J'ai l'intuition qu'il va être difficile de faire mieux ...
Belle optimisation depuis le début ;D
- Marge
- Fonctionne à 14400 bauds

- Messages : 5593
- Inscription : 01 oct. 2008 14:39
- Localisation : En bas, tout au fond à gauche.
Re: Calculons Pi comme Viète
Je ne comprends les calculs *2/2 dans les deux programmes.Gilles59 a écrit :Une adaptation directe de la version CASIO 602P ...
[/size]Code : Tout sélectionner
SAC Min00 2 LBL0 * 2 / 2 M+08 MR08 √ Min08 DSZ GOTO0 =
... pour TI57 classique :
Code : Tout sélectionner
C.T STO 0 2 LBL1 * 2 / 2 SUM 7 RCL 7 SQRT STO 7 DSZ GTO 1 = R/S
- C.Ret
- Fonctionne à 9600 bauds

- Messages : 2483
- Inscription : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
Je le suis effectivement, mais avec un peu de retard, j'étais à l'usine tout mon W.E..Gilles59 a écrit :Je sens bien C.RET sur ce coup ;D
La version multiprécision pour HP-28S ressemble pour le moment à cela :
Code : Tout sélectionner
VVIETE:
1: { size } @ Taille multiprécision
« 0 CON @ 0.000…0 avec 6*(s-1) décimales
DUP @ Copy valeur pour test de fin
DUP 1 2 PUT @ 2.000…0
DO @ 1 9 START
SWAP @ SWAP
1 DUP2 GET 2 + PUT VSQRT @ 2 + √
[ 2 ] VRDM @ Ajuste dimension selon argument initial
OVER VDIV @ 2.000…0 OVER /
ROT VMULT VRDM VDISP @ ROT *
UNTIL @ NEXT
VSAME? @ Boucle jusqu'à résultat identique
END DROP2 CLMF @
»
1E6 'VEb' STO @ Base représentation multi en ARRaY Ce sont en fait des vecteurs ; le premier élément donnant la partie entière et les éléments suivant les décimales regroupées par 6. Ce qui permet d'eviter les erreurs de calcul, l'HP28S effectuant les calcul sur 12 chiffres.
Pour faciliter le développemnt, le regroupement est mémorisé dans une constante 'VEb' ce qui permet de changer la base à
plus facilement.
Les principaux membre de la bibliothèque sont :
° VMULT qui effectue une multiplication
° VDIV qui effectue une division
* VSQRT qui extrait une racine carré
Les deux derniers programme limite la profondeur de calcul en fonction de la taille (nombre de groupe de décimales) donné par l'argument.
Pour éviter les erreur d'arrondi, les calculs sont effectué à l'intérieur de ces deux programme avec un groupe de plus que demandé.
Le résultat final est donnée quand le calcul ne modifie plus les décimales des groupes demandé.
Le programme VViete procède de la même façon, il augmente le nombre de (groupes de) décimales jusqu"à convergé pour la précision demandée.
Pour cela ces trois programme utilise VRDM et VSAME évitant la répétition de séquences d'instructions identiques pour justemetn limiter la précision ou arrêtre les calculs.
VCARRY est un sous-programme important car il permet de gérer les retenues et donc de re-formater le vecteur décrivant un nombre décimal en multi-précision.
VDISP ->V et V-> sont utilisés pour afficher et convertir les valeurs.
Code : Tout sélectionner
==================================================================
VMULT:
« → A B
« A DIM B DIM + 1 - @ Résultat fait (a+b-1) éléments
{} + 0 CON @ Mise à zéro accumulateur "final size"
A VRDM @ Multiplicante initial à la taille finale
1 B DIM FOR k
DUP B k GET * @ Multiplication par i-ème facteur B
ROT + VCARRY← @ Ajout dans accumulateur et traitement retenues
0 ROT ARRY→ SWAP DROP →ARRY @ Décalage à droite du multiplicante
NEXT
DROP » »
==================================================================
VDIV:
« OVER DIM → s @ Limite taille résultat à celle de A
« VRDM @ Ajuste taille du diviseur
1 s START
OVER V→ OVER V→ / IP @ Effectue division partielle
DUP2 * 4 ROLL - NEG VCARRY→ @ Calcule reste
ARRY→ 0 SWAP →ARRY @ Décale d'une "unité" et abaisse un zéro
1 DUP2 GET 4 ROLL VEb * + PUT @ Ajoute la retenue
ROT @ Prépare division suivante
NEXT
DROP2
s →ARRY » »
==================================================================
VSQRT:
« DUP DUP @ Copie argument inital
DO
DUP2 VDIV + .5 →V VMULT @ Voir algorithme M.P.O. n° 46
VRDM @ Limite taille à argument inital
UNTIL VSAME? END @ Boucle jusqu'à racine exacte
DROP2
»
==================================================================
VCARRY←:
« 0 SWAP @ Initiate carry
DUP DIM 1 FOR i
i DUP2 GET @ Get i-th value
4 ROLL + @ Add previous carry
VEb MOD @ Keep remaining in vector
LAST / FLOOR 4 ROLLD @ Store next carry
PUT @ Put value back in vector
-1 STEP
IF SWAP THEN
"Overflow" 1 DISP 1 SF @ Display error message and set flag
END »
1E6 'VEb' STO @ Base représentation multi en ARRaY
==================================================================
Et les programmes secondaires :
Code : Tout sélectionner
==================================================================
→V: @ Converti en multi-précision
« DEPTH 1 - → d0
« DO
IP
LAST FP VEb *
UNTIL DUP FP NOT END
DEPTH d0 - →ARRY » »
1E6 'VEb' STO @ Base représentation multi en ARRaY
====================================================================
V→: @ Transforme en son approximation
« DUP DIM → s
« 1
2 s START DUP VEb / NEXT
s →ARRY DOT » »
====================================================================
VDISP: @ Affiche et imprime proprement
« VEb LOG 1 - → t @ Un nombre en multi précision
« 1 SF "" OVER 1
DO
GETI
IF 1 FS?C
THEN →STR "." +
ELSE VEb / →STR "000000000000" + 2 DUP t + SUB " " + END
4 ROLL SWAP +
IF DUP SIZE 24 MOD 23 t - > THEN 10 CHR + END
ROT ROT
UNTIL DUP 1 == END
DROP2 PR1 1 DISP » »
1E6 'VEb' STO @ Base représentation multi en ARRaY
====================================================================Code : Tout sélectionner
==================================================================
DIM:
« SIZE @ Like SIZE, DIM returns :
IF DUP TYPE 5 == @ * nb of caracters for Strings
THEN LIST→ @ * nb of elements for Lists
IF 2 == THEN * END @ * vectors or arrays
END »
Ex: "CH3OH" DIM ---> 5
[3 14 15 ] ---> 3
[[ 1 2 3 ]
[ 4 5 6 ]] ---> 6
==================================================================Il s'agit d'éviter les répétition et d'optimiser le code et misant petit.
Code : Tout sélectionner
====================================================================
VRDM:
« OVER SIZE RDM » @ Réajuste taille à partir du niveau 2:
====================================================================
VSAME?:
« SWAP OVER DUP 5 ROLL SAME » @ Compare résultat actuel avec précédent
====================================================================Evidemment c'est loin d'être rapide
Dernière édition par C.Ret le 09 nov. 2014 19:41, édité 1 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803 + SD2iec. | TI-57 LCD | HP-28S + HP82240A | TI-74 BasiCalc | HP-41C + (2 memory + stat + IR) | HP-15C | HP Prime Color Touchscreen Graphing Calculator| TI-92 II | CASIO fx-602p + FA-1 | HP-71B 64K+JPC-ROM+HPIL+card reader . Sommaire des M.P.O..
- bernouilli92
- Fonctionne à 14400 bauds

- Messages : 4847
- Inscription : 21 nov. 2012 14:03
- Localisation : Ile de France
Re: Misez p'tit, optimisez n°60 : Calculons Pi comme Viète
On peut déjà gagner un octet en remplaçantC.Ret a écrit : Il s'agit d'un MPO, je défit quiconque de trouver le moyen de faire plus court sur HP-28S
"000000000000"
par
"000000" DUP +
Ensuite on peut remplacer "Overflow" par "OVL err"
Je suis sûr qu'on peut encore grappiller des octets par-ci par-là.
HP, Casio, Sharp, Psion, quelques TI et divers autres





