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
remy
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2086
Inscription : 13 mars 2006 16:39
Localisation : Issy
Contact :

Re: Calculons Pi comme Viète

Message par remy » 05 nov. 2014 19:23

Rom1500 a écrit :
Marge a écrit :Et comment fait-on avec les machines en BASIC ?
Sur PC-1500 :
10:A=2:B=0:FOR I=0TO 9:B=SQR(B+2):A=A*2/B:NEXT I
Le résultat est dans la variable A
Mémoire utilisée = 42 octets
Moi je le fait en 37 octets ....
avec le même code mais sur un PC-1251 :-)
La tokenisation des fonctions est sur un octet et il gagne aussi un octet sur le numéro de ligne.
Résultat 3.141591422 en moins de 2 secondes
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

Avatar de l’utilisateur
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5599
Inscription : 26 mars 2009 14:07
Localisation : Ile de France
Contact :

Re: Calculons Pi comme Viète

Message par ledudu » 05 nov. 2014 19:52

remy a écrit :Moi je le fait en 37 octets ....avec le même code mais sur un PC-1251 :-)
Escroc ! :D

Avatar de l’utilisateur
Rom1500
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 701
Inscription : 29 nov. 2013 17:24
Localisation : Pas très loin de Lyon
Contact :

Re: Calculons Pi comme Viète

Message par Rom1500 » 05 nov. 2014 20:02

ledudu a écrit :
remy a écrit :Moi je le fait en 37 octets ....avec le même code mais sur un PC-1251 :-)
Escroc ! :D
Argh ! :D
Plus qu'à coder en assembleur… CGH !!!
Toutes les infos : http://www.pc-1500.info
PC-1500+CE-150 : EU PC1500, PC1500A / JP PC1500, PC1500D, PC1501 / HU PTA4000, PTA4000+16 / US TRS80 PC2 / BR PC-1500RP, PC-1500RP2 / CN PC-1500, PC-1500A, Nanfeng PC-1500A
PC-1600 : PC-1600K V2, CE-1600M, CE-1604L, CE-515P, module 32Ko, module 512Ko
Extensions en boite : CE-150/151/152/153/154/155/156/157/158/159/160/161/162E/163 sans boite

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

Re: Calculons Pi comme Viète

Message par Gilles59 » 05 nov. 2014 20:02

En 17 pas (soit 17 octets) sur Casio FX-502/602/603P :

Code : Tout sélectionner

SAC 
10 Min00 
2  
LBL0
 * 2 / 2 M+08 MR08 √ Min08 
DSZ GOTO0
=
Ca fait même 15 pas (octets), si on saisit en entrée le nombre d'itérations

Code : Tout sélectionner

SAC 
Min00 
2 
LBL0
 * 2  / 2 M+08 MR08 √ Min08 
DSZ GOTO0
=
résultat 3.141591422

602P = 1,9 sec
603P = 0,5sec

17 itérations donnent : 3.141592654 en moins de 0,9 sec sur 603P

Une version alternative à celle de Bernouilli en RPL qui égale les 50 octets, mais pas mieux :

Code : Tout sélectionner

«
0 2
0 9  START
 2 * SWAP 2 + √  DUP UNROT / 
NEXT
NIP »
10 itérations : 0,0967 sec -> 3.14159142151
17 itérations : 0,1602 sec -> 3.14159265356

Le NIP (comme le DROP de Bernouilli) permet de laisser la pile 'propre'. On gagne 2,5 octets sinon.
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+

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

Re: Calculons Pi comme Viète

Message par Gilles59 » 05 nov. 2014 21:24

Rom1500 a écrit :
Marge a écrit :Et comment fait-on avec les machines en BASIC ?
Sur PC-1500 :
10:A=2:B=0:FOR I=0TO 9:B=SQR(B+2):A=A*2/B:NEXT I
Le résultat est dans la variable A
Mémoire utilisée = 42 octets
Il faudrait ajouter un PRINT A ou équivalent à la fin.
Quel est le résultat ?
Ca fait combien d'octets ? et le temps d'exécution si mesurable ?

je vais consolider les différentes solutions dans un tableau.
ce MPO doit être pas loin du maximum du nombre de machines utilisées ;D (je merdouille avec ma 15C LE par contre :O ) Autant j'aime bien pour calculer, autant pour programmer ouch ..
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+

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 05 nov. 2014 21:56

Une version pour la HP PRIME, honteusement copiée sur ROM1500 ;D
A noter que la Prime renvoie directement le dernier résultat du calcul à l'écran si on ne précise pas quelle valeur renvoyer ('return') , donc ici A

Code : Tout sélectionner

EXPORT Viete(X)
BEGIN
 A:=2; B:=0;
 FOR I FROM 1 TO X DO
  B:= √(B+2); A:=2*A/B;
 END;
END;
Taille ... Inférieur à 1kB (la prime n'a que faire des octets,elle ne les connait qu'en kilo)
Viete(10) = 3.14159142151 en 0,000 s
Viete(17)= 3.14159265356 en 0,000 s (de temps en temps 0,005 ;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+

Avatar de l’utilisateur
jvernet
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7838
Inscription : 24 mai 2002 09:57
Localisation : France 69
Contact :

Re: Calculons Pi comme Viète

Message par jvernet » 05 nov. 2014 22:51

Rom1500 a écrit :
Marge a écrit :Et comment fait-on avec les machines en BASIC ?
Sur PC-1500 :
10:A=2:B=0:FOR I=0TO 9:B=SQR(B+2):A=A*2/B:NEXT I
Le résultat est dans la variable A
Mémoire utilisée = 42 octets
Il n'y a pas le controle du nombre d'iterations ni affichage du resultat, triche !! :pirat:

Mon code n'etait pas trop optimisé, le même pour 7500G:

Code : Tout sélectionner

?->C
2->A
0->B
Lbl 1
SQR(B+2)->B
2A/B->A
Dsz C:Goto 1
A¤
39 Pas.
Dernière édition par jvernet le 05 nov. 2014 23:23, édité 1 fois.
"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."

Avatar de l’utilisateur
C.Ret
Fonctionne à 9600 bauds
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

Message par C.Ret » 05 nov. 2014 23:22

Je n'ai pas de prime, mais une vieile version de l'émilateur de la HP-39gii:

Code : Tout sélectionner

EXPORT VIETE(n)
BEGIN
  LOCAL a:=2,b:=0,c;
  FOR c FROM 1 TO n DO
     a:=a*2/(√(b+2)►b);
  END;
  RETURN a;
END;
Oups, 1 KB
d'après le gestionaire de mémoire ... je suis toujours hors course sur ce MPO :(
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..

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 05 nov. 2014 23:57

C.Ret a écrit :Je n'ai pas de prime, mais une vieile version de l'émilateur de la HP-39gii:

Code : Tout sélectionner

EXPORT VIETE(n)
BEGIN
  LOCAL a:=2,b:=0,c;
  FOR c FROM 1 TO n DO
     a:=a*2/(√(b+2)►b);
  END;
  RETURN a;
END;
C.ret, ton programme tourne sur la Prime. J'avais oublié cette particularité du PPL (Prime Programming Langage) qui permet d'affecter 'au vol' une variable pendant un calcul avec ►

Le même programme sur la Prime est _beaucoup_ plus petit que la 39GII . Mais je ne ne sais pas calculer la taille exacte d'un programme. L'émulateur de la Prime de HP est libre et gratuit je pense...
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+

Keeper
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 250
Inscription : 20 juil. 2014 20:01
Localisation : 71

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

Message par Keeper » 06 nov. 2014 00:08

Sur Casio fx-180P, fx-180Pv et fx-180P Plus (22 octets au total)

A saisir dans P2 (5 octets)

Code : Tout sélectionner

ENT
Min
KAC
2
Kin 1
A saisir dans P1 (18 octets)

Code : Tout sélectionner

1
M-
Kout 2
+
2
=
√
Kin 2
1/x
X
2
X
Kout 1
=
Kin 1
MR
x>0
Kout 1
On lance P2 juste entrer le nombre d'itérations et initialiser les variables.
Puis P1 pour avoir le résultat

Avec 10 itérations :
Sur fx-180P : résultat en 5,40 secondes
Sur fx-180Pv : résultat en 1,90 secondes
Sur fx-180P Plus : résultat en 1,06 secondes


Je n'ai pas la version Pa pour tester. Il serait intéressant de voir s'il y a une différence avec la Pv. Si quelqu'un a les deux pour tester... :wink:

Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1428
Inscription : 27 oct. 2010 20:46

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

Message par Gilles59 » 06 nov. 2014 00:20

Keeper a écrit :
Avec 10 itérations :
Sur fx-180P : résultat en 5,40 secondes
Sur fx-180Pv : résultat en 1,90 secondes
Sur fx-180P Plus : résultat en 1,06 secondes
ca booste pour une machine de cette époque... Je suis agréablement surpris ...
Par contre je ne vois pas la boucle... ca marche comment ?
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+

Keeper
Fonctionne à 300 bauds
Fonctionne à 300 bauds
Messages : 250
Inscription : 20 juil. 2014 20:01
Localisation : 71

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

Message par Keeper » 06 nov. 2014 00:29

Gilles59 a écrit :
Keeper a écrit :
Avec 10 itérations :
Sur fx-180P : résultat en 5,40 secondes
Sur fx-180Pv : résultat en 1,90 secondes
Sur fx-180P Plus : résultat en 1,06 secondes
ca booste pour une machine de cette époque... Je suis agréablement surpris ...
Par contre je ne vois pas la boucle... ca marche comment ?
Oui je suis aussi surpris... Mais ma fx-180P n'est pas une des premières avec la housse, c'est déjà le modèle avec le boitier rigide. Peut-être que ça joue...
Il est même possible de gagner un peu en vitesse (0,20s sur fx-180P) en n'utilisant pas la fonction 1/x mais ça rajoute des octets :)

Code : Tout sélectionner

MR
x>0
La boucle est là. Je rappelle la valeur qui est en mémoire et si elle est supérieure à 0, ça relance le programme depuis le début. C'est un peu "archaïque" et ça oblige à faire un programme séparé pour l'initialisation.

Et en début de programme je décrémente la valeur en mémoire avec

Code : Tout sélectionner

1
M-

tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 756
Inscription : 06 oct. 2012 14:37

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

Message par tyann » 06 nov. 2014 00:45

Bonsoir à tous
Troisième version pour la Ti 66.
En réorganisant l'ordre des calculs j'ai réussi à gratter
1 pas, j'en ai profité pour virer le nombre d'itération
du programme donc gain final 2 pas.

Code : Tout sélectionner

000	STO
001	02
002	2
003	√x
004	STO
005	00
006	x
007	2
008	=
009	x<>t
010	RCL
011	00
012	+
013	2
014	=
015	√x
016	x<>t
017	/
018	x<>t
019	DSZ
020	02
021	00
022	04
023	x<>t
024	R/S
RST N itérations R/S.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, El 5120, 9200, 9600

Canon X-07

Avatar de l’utilisateur
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2498
Inscription : 03 mai 2008 15:33
Localisation : Grenoble

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

Message par zpalm » 06 nov. 2014 07:25

Gilles59 a écrit :(je merdouille avec ma 15C LE par contre :O ) Autant j'aime bien pour calculer, autant pour programmer ouch ..
Sur la HP-15C LE en 19 pas et 1 registre (I), soit 26 octets (19+7):

Code : Tout sélectionner

01 42.21.11    LBL A
02    44 25    STO I
03        2    2
04       36    ENTER
05        0    0
06       40    +
07 42.21  0    LBL 0
08    43 36    LastX
09       34    X<>Y
10        2    2
11       20    *
12       34    X<>Y
13        2    2
14       40    +
15       11    √
16       10    ÷
17 42. 5.25    DSE I
18    22  0    GTO 0
19    43 32    RTN
On rentre le nombre de boucles puis GSB A (ou A en mode USER).
Par exemple : [9] [A]

On peut réduire le nombre de pas en utilisant un registre mémoire supplémentaire mais au total cela fait plus d'octets.

Avatar de l’utilisateur
jvernet
Fonctionne à 14400 bauds
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

Message par jvernet » 06 nov. 2014 17:45

Sur les Sharp, je propose ça:

Code : Tout sélectionner

10 CLEAR:INPUT C:A=2:FOR I=0TO C:B=SQR(B+2):A=A*2/B:NEXT I:PRINT A
49 octets sur PC-1500. Ca respecte les régles: controle le nombre de boucle, et affiche le resultat


En C sur Sharp PC-850G (pas testé, mais ça devrait le faire)

Code : Tout sélectionner

main()
{ 
  
  float q=0.0, pi=2.0;
  int n; 
  scanf("%d",n);
  for (int i=0; i<n; ++i) 
         pi *= 2.0/(q=sqrt(2.0+q));
  printf("%f\n",pi);
}
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 ?

Sur CANON X07, par exemple:

Code : Tout sélectionner

10 DEFDBL A,B:A=2:INPUT C:FOR I=0 TO C:B=SQR(B+2):A=A*2/B:NEXT:PRINT A
"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."

Répondre

Revenir vers « Tous les Pockets »