Programmer en RPL

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
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Programmer en RPL

Message par Gilles59 »

Le RPL est un langage original et puissant qui est apparu sur les calculatrice HP avec la HP28S puis la HP48 et continue à exister avec la HP50.

Il semble qu'on soit plusieurs ici à utiliser le RPL sur ces calculatrices. L'idée de ce topic est d'échanger sur les subtilités du RPL langage puissant, original et pratique mais parfois complexe.

Evidemment si j'ouvre ce sujet c'est que j'ai déjà quelques questions ...
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+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Variables locales, sous-programmes locaux et récursivité

Message par Gilles59 »

1/ Le RPL permet d'utiliser des variables locales. La syntaxe est simple :

Code : Tout sélectionner

«
 1 2 3
    -> un deux trois
    «
      un deux trois "Somme" un deux + trois +
   »
  un deux trois 
»
Ce programme génère sur la pile :

1 2 3 "Somme" 6 'un' 'deux' 'trois'

Le fonctionnement des variables locales est simple:
- Les variables locales sont crées par -> suivi de leurs noms. Elles s'initialisent avec les valeurs sur la pile. Elles sont 'visibles' uniquement dans la partie de niveau en dessous démarrant par << et se finissant par le >> correspondant

2/ Le RPL est récursif

Code : Tout sélectionner

«
  -> n
  «
    IF 0. n == THEN 1 ELSE n 'n' DECR Fact * END 
  »
»
3/ Ca se complique quand on veut combiner les deux !

Imaginons qu'on veuille créer une fonction locale récursive. L'intérêt est multiple en particulier pour éviter d'encombrer le menu de l'afficheur avec des programmes qui n'ont qu'un intérêt local. Je suis sur que c'est possible car lu dans un bouquin que je n'ai plus, et pas moyen d'y arriver ....

J'essaie :

Code : Tout sélectionner

«
  «
    -> n
    «     
     IF 0. n == THEN 1 ELSE n 'n' DECR f * END  
    » 
  »
    -> f
    « 5 f »
»  
'F2' STO
Mais j'obtiens sur la pile :

5
« -> n « IF 0. n == THEN 1 ELSE n 'n' DECR f * END » »

Bref le prog s'affiche mais ne s'exécute pas.... Je ne comprends pas.
Modifié en dernier par Gilles59 le 25 nov. 2010 21:58, modifié 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+ CM14 et MM12 / Alice 32
Avatar du membre
kweeky
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1777
Enregistré le : 05 oct. 2007 19:46
Localisation : Pas très loin de Bordeaux

Re: Programmer en RPL

Message par kweeky »

Salut Gilles

Je ne suis pas chez moi et donc je n'ai pas ma HP-50G sous la main, mais je pense que le problème vient du fait que quand tu fais :

Code : Tout sélectionner

-> f
    « 5 f »
La machine stocke bien le programme factorielle dans la variable locale "f", mais qu'ensuite elle va placer 5 dans la pile, puis la variable f dans la pile sans l'évaluer. C'est pourquoi tu obtiens le programme dans la pile. Tu devrais essayer :

Code : Tout sélectionner

« 5 f EVAL »
Je ne suis pas sûr que ça marche, mais qui ne tente rien n'a rien.

@+
Avatar du membre
kweeky
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1777
Enregistré le : 05 oct. 2007 19:46
Localisation : Pas très loin de Bordeaux

Re: Programmer en RPL

Message par kweeky »

Après réflexion, je m'aperçois qu'il y a peut-être un autre problème : tu utilises le nom de variable "f" dans le bout de code que tu stockes ensuite dans la variable locale "f". Or avant que la variable locale "f" ne soit créée, le nom "f" va se référer à une éventuelle variable "f" déjà existante...
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

kweeky a écrit :Salut Gilles

Je ne suis pas chez moi et donc je n'ai pas ma HP-50G sous la main, mais je pense que le problème vient du fait que quand tu fais :

Code : Tout sélectionner

-> f
    « 5 f »
La machine stocke bien le programme factorielle dans la variable locale "f", mais qu'ensuite elle va placer 5 dans la pile, puis la variable f dans la pile sans l'évaluer. C'est pourquoi tu obtiens le programme dans la pile. Tu devrais essayer :

Code : Tout sélectionner

« 5 f EVAL »
Je ne suis pas sûr que ça marche, mais qui ne tente rien n'a rien.

@+
Bsr ! ca marche pas mais ca change

Je me retrouve avec la pile : 4 5 << ... code ..>>
Modifié en dernier par Gilles59 le 25 nov. 2010 22:05, modifié 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+ CM14 et MM12 / Alice 32
Avatar du membre
gege
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 7141
Enregistré le : 31 janv. 2008 14:24
Localisation : Banlieue Paârisienne
Contact :

Re: Programmer en RPL

Message par gege »

De mémoire et de façon imprécise, la situation ne me semble pas si idyllique que ça.

D'abord, si tu as une variable locale puis que tu appelles un autre programme, ce dernier ne voit pas la variable.
(info ou intox ?)

Ensuite, pour définir des variables locales en plus de la syntaxe -> x, il existe une syntaxe <-x (collé) qui je crois vaguement pallie au premier problème, mais à écrire ce n'est pas vraiment pratique.

En marge de ces soucis, si tu utilises une 49G+ ou 50G en mode ALG, si tu as le malheur d'utiliser un verbe "uniquement RPL", à la sauvegarde ton programme est converti en une espèce de bouillie incompréhensible (et non exécutable) truffée du préfixe RPN>.
En gros ces machines ne sont pas programmables en pratique.

Pas glop
G.E. le grincheux
Avatar du membre
kweeky
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1777
Enregistré le : 05 oct. 2007 19:46
Localisation : Pas très loin de Bordeaux

Re: Programmer en RPL

Message par kweeky »

Salut gege
gege a écrit :D'abord, si tu as une variable locale puis que tu appelles un autre programme, ce dernier ne voit pas la variable.
(info ou intox ?)
C'est malheureusement vrai, le programme appelé ne connait pas les variables locales du programme appelant. Ce qui pourrait expliquer le problème précédent.
Ensuite, pour définir des variables locales en plus de la syntaxe -> x, il existe une syntaxe <-x (collé) qui je crois vaguement pallie au premier problème, mais à écrire ce n'est pas vraiment pratique.
Tu m'intéresses, là, car je ne connais pas ce truc. C'est un truc officiel de la doc HP ?
En gros ces machines ne sont pas programmables en pratique.
Là je te trouve trop dur, gege. Vilain grincheux ! :wink: Ces machines sont tout aussi programmables que les anciennes 48. De toutes façons, utiliser ces modèles en mode ALG c'est un péché ! Autant prendre une TI ou une CASIO, qui seront beaucoup plus pratiques à utiliser que le mode batard algébrique des nouvelles machines HP.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

gege a écrit :De mémoire et de façon imprécise, la situation ne me semble pas si idyllique que ça.

D'abord, si tu as une variable locale puis que tu appelles un autre programme, ce dernier ne voit pas la variable.
(info ou intox ?)

Ensuite, pour définir des variables locales en plus de la syntaxe -> x, il existe une syntaxe <-x (collé) qui je crois vaguement pallie au premier problème, mais à écrire ce n'est pas vraiment pratique.

En marge de ces soucis, si tu utilises une 49G+ ou 50G en mode ALG, si tu as le malheur d'utiliser un verbe "uniquement RPL", à la sauvegarde ton programme est converti en une espèce de bouillie incompréhensible (et non exécutable) truffée du préfixe RPN>.
En gros ces machines ne sont pas programmables en pratique.

Pas glop
G.E. le grincheux
Je déteste la HP50 en mode algébrique. Ce mode ne devait pas exister. La syntaxe <- crée des variables local au "mot" stockés mais visibles dans tout le mot.
Tu as peut etre une piste avec un pb de visibilité croisée.
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+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Ensuite, pour définir des variables locales en plus de la syntaxe -> x, il existe une syntaxe <-x (collé) qui je crois vaguement pallie au premier problème, mais à écrire ce n'est pas vraiment pratique.
Tu m'intéresses, là, car je ne connais pas ce truc. C'est un truc officiel de la doc HP ?)[/quote]

Oui c'est dans la doc . Ca doit dater des HP49.

Je crois avoir trouvé ce qui cloche dans la doc aussi. je regarde apres avoit batu c.ret à Isola (ou perdu lol)

Vu dans la doc : Les "programmes locaux" ont un comportement différents et ne s'évaluent pas automatiquement. Il faut bien un EVAL mais comme le prog est récursif il faut le mettre aux bons endroits :)

Sinon concernant le RPL j'ai toujours réussi à programmer ce dont j'avais besoin
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+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Version corrigée :

Code : Tout sélectionner

«
  «
    -> n
    «     
     IF 0. n == THEN 1 ELSE n 'n' DECR f EVAL * END  
    » 
  »
    -> f
    « 5 f EVAL »
»
'F2' STO
Sinon la syntaxe -> <-x permets de créer une variable dont la durée de vie est égale à la durée de vie du programme qui la crée. Je n'ai pas eu l'occasion de l'utiliser encore

Merci Kweeky, tu m'as mis sur la piste ;)
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+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Programmer en RPL

Message par Gilles59 »

Au passage j'ai réussi à tourver comme déplacer plus élégamment la tortue dans le prog sur les fractales

XYTor : la position actuelle de la tortue
DistDep : la distance à avancer
DirTor : la direction de la tortue

Faire en mode complexe (merci c.ret de l'idée) :

Code : Tout sélectionner

'( DistDep , <\ DirTor)' ->NUM 'XYTor' STO+
<\ correspond au sybole 'angle'

Ca évite tous les calcul de COS SIN etc. Je vais récrire le prog sans passer par des listes mais en traçant en direct. Ca sera tres concis et tres rapide
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+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

En fait, pour introduire le RPL, il faut rapeller que celui-ci est un language basé sur l'évaluation.

Contrairement au language RPN des HP qui ne traitaient que des nombre dans leur pile (x y z t), le RPL a initialement été conçu pour manipuler dans "la pile" toute sorte d'objets.
En particulier, des nombres complexes, des nombre hexadécimaux, des vecteurs ou des matrices, des listes, des chaines de caratères, des descripteurs, des expressions algébriques, des programmes et, caché à l'utilisateur, des adresses mémoire, des pointeurs et toutes sorte d'objets nécessaires au fonctionnement du calculateur.

Mais ce n'est pas, à mon sens la diffèrence fondemmentale fondemmentale. En effet, il existe des calculatrices RPN qui manipulent dans leur pile des objets autres que des nombres :
- l'HP 41 manipule labels, chaine alphanumérique et codes synthétiques
- certaines HP récentes sont RPN et manipule des nombres complexes (un par niveau), des unités, des angles, des nombres binaires, ...

Non la vraie différence, à mon avis, est que tout objet qui entre dans la pile des HP28/48/49/50 est evalué.
En ce sens le RPL est comme le FORTH, la pile contient à la fois les arguments et les opérandes qui sont immédiatement évalués (c'est à dire exécutés) ce qui met en retour (et toujours dans la pile) les résultats (ou/et d'autres opérandes ce qui enchaine les programmes.

Par exemple :
Si on entre un nombre ou si le résultat d'une opération produit un nombre, par exemple 321. Celui-ci est placé dans la pile et évalué.
Par chance, un nombre est toujours évalué en sa valeur. Le processus s'arrête donc avec la pile qui contient 321.

Si l'on entre un second nombre (ou si une seconde opération produit un nombre), par exemple 654, celui-ci est placé dans la pile et immédiatement évalué.
Là aussi, heureusement pour nous, l'évaluation d'un nombre conduit à ce même nombre.
Ce n'est pas le cas pour tous les objets que le système manipule :
-> l'évaluation d'un nom de variable retourne le contenu de cette variable. Ainsi si on tape A et qu'il existe une variable A contenant 987, alors c'est ce nombre qui est retourné, entré dans la pile et évalué.
Heureusement pour nous ....
... chacun voit où je veux en venir (pas sûr), mais au moins j'espère que tous les lecteurs de ce post entrevoient la récurrence sous-jacente à ce principe de fonctionnement.
-> l'évaluation d'un opérande effectue cette opération.

Ainsi, si l'on tape +, alors l'opérande 'somme' est placé dans la pile et évalué. ce qui effectue la somme des deux nombres.
Et tout cela ressemble à du RPN 321 654 + retourne 975
Mais c'est très différent, la pile est 'dynamique', elle n'est pas uniquement l'endroit où les arguments et les résultats sont mémorisés.

Cependant, tout cela a un inconvénient majeur. comment exécuter un programme ?
En effet, les programmes en RPL sont séquentiels, il faut donc entre chacune des instructions qui les composent interagir avec la pile. C'est diffèrent d'un simple opérateur qui prend tout ses arguments dans le même pile.

Donc, exécuter un programme en RPL revient en fait à en évaluer séquentiellement les objets qui le compose. On prend le premier, on le place dans la pile, il est donc évalué ce qui modifie de façon récurrente la pile puis un mécanisme automatique place l'élément suivant du programme dans la pile est ainsi de suite.

Bien, on a un système cohérent qui n'admet pas d'exception à la règle : tout objet placé dans la pile est immédiatement évalué.

Donc exécuter un programme revient à le placer dans la pile, son évaluation l'exécute.
Bien.

Très bien ce RPL, c'est très rigoureux.
On va pouvoir utiliser toutes sortes d'objets, créer des objets afin de répondre aux besoin des clients.
C'est ce qui est arrivé, les HP49/50 ont des objets supplémentaires qui n'existent pas sur les modèles précédents afin de naturellement manipuler les entiers naturels, les nombres à précision infinie, les objets graphiques, les fichiers d'échanges, l'horodatage, ... etc

Et si un nouveau besoin se fait sentir, il sera facile de créer un nouveau type d'objet. Il s'insèrera 'naturellement' dans le système.

Mais...
Car il y a un toujours un mais.
Maintenant que l'on a décidé qu'exécuter un programme c'est le mettre dans la pile, comment fait-on pour l'éditer, le modifier ou même simplement le créer.
Si on tape (ou qu'un processus produise un programme) et qu'il entre dans la pile, il sera immédiatement évalué et donc exécuter !
On ne peut donc pas le mémoriser, ni le modifier, ni rien faire avec !!!

Ce qui fait qu'il a bien fallu faire une exception à la sacro-sainte règle du placer dans la pile = évaluer !

En effet, les guillemets « et » ont l'outrecuidance propriété d'empêcher l'évaluation d'un objet placé dans la pile.
Et ça le fait à chaque fois, que ce soit en tapant le programme, en éditant la ligne de commande, en rappelant une variable globale ou locale par RCL ou directement en saisissant son nom, le programme est mit sur la pile SANS être évalué !

C'est tellement bête et systématique que l'on l'oublie à chaque fois.

Si la variable globale A contient une expression algébrique, un nombre ou tout autre objet, la saisie de A (ou un procédé qui retourne A) le place dans la pile où il est évalué, retourne son contenu qui est à son tour évalué.

Par contre, si A contient un programme, celui est placé dans la pile et ... ...il est s'exécute.

Ce n'est pas logique ! Je viens d'expliquer en long et en large que placer un objet délimité par de les « » déroge à la règle d'évaluation systématique.

En fait , il y a une astuce, en pressant la touche du menu ou en saisissant A en ligne de commande, les HP force l'exécution du programme.
La raison est simple, c'est pour mimer le comportement des opérandes. Pour faire + on appuie sur la touche +, pour le sinus, on appuie sur la touche du menu correspondant à SIN. On ne fait pas + EVAL, ni SIN EVAL
Ce qui , il faut l'avouer , serait bien pénible.

Donc en saisissant A, ou en accédant à A par la touche du menu, ou en ayant tapé A dans un programme, l'exécution est forcée. Pour l'éviter, il faut taper 'A'.

Par contre, quand il s'agit d'une variable locale, le mécanisme qui force l'exécution n'est pas activé. Est-ce in oubli ou est-ce volontaire afin de pouvoir enchainer par une commande d'édition ou d'impression du programme ? Ou y-a-t-il une autre raison technique derrière cela ?

En tout cas, pour l'exécuter un programme , il faut appuyer sur la touche EVAL (ou saisir cette commande).

C'est ce qui se passe dans le code ci-dessus. La variable locale f contient un programme. Son évaluation retourne simplement ce programme dans la pile. Pour l'exécuter, il faut simplement ajouter EVAL.

En fait, les variables locales diffèrent un peu des autres objets car il sont dépendant du contexte.



Il y une autre curiosité (ou exception à la règle universelle évaluant tout objet placé dans la pile.

Imaginant que nous ayant la liste suivante { A + B } avec au centre le plus de la touche + :
En toute logique, que devrait retourner la séquence suivante :
321 654 { A + B } 2 GET

Je vous laisse y réfléchir.
Là aussi ça ne se passe pas comme on pourrait s'y attendre.

P.S. L'astuce du EVAL est documenté à la page n°20 du manuel de référence du HP28S.
"Evaluer le nom d'une variable locale place simplement son contenu dans la pile opérationnelle".
Puis l'utilisation des variables locales fait l'objet de tout un paragraphe (p. 200 du chapitre 23 concernant l'évaluation)

Dans le manuel d'utilisateur, concernant l'évaluation des programmes pris en argument, il est indiqué qu'il faut ajouter EVAL pour forcer l'exécution du programme pris comme argument donc ceux contenus dans une variable locale. (program PRESERVE).


RAPPEL du JOUR:
évaluation:
C'est l'opération fondamentale des calculateurs RPL :
- L'évaluation d'une donnée renvoie dans la pile cet objet lui-même.
- L'évaluation d'un nom renvoie dans la pile l'objet stocké dans la variable correspondant à ce nom et l'évalue, si cet objet est un nom ou un programme.
- L'évaluation d'une procédure renvoie dans la pile chaque objet contenu dans la procédure et l'évalue s'il s'agit d'une commande ou d'un nom sans guillemets.

(p. 370 du glossaire)
Modifié en dernier par C.Ret le 05 avr. 2021 09:30, 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
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Concernant la notation ( 3</45°), elle n'est pas présente sur les HP28C/S

Mais, il me semble, d'après ce que j'ai vu sur les HP48 (ce doit être identique sur la 50 !). Qu'il s'agit en fait simplement d'un mode d'affichage des nombres complexes, qui sont en internes toujours représenté de la même façon.

Exactement comme les entiers binaires. Avec le menu MODE, on chois si l'on veut des entier BIN, HEX, OCT ou DEC; Cela change leur affichage (et impression), mais en interne, c'est toujours le même objet.

Pour les nombres complexes en notation angulaire, c'est identique en interne c'est toujours le même nombre complexe.

Les relations liant tout cela sont :
z = x + i.y = r.cos a + i.r.sin a = r.exp(-i.a) où x =r.cos a et y=r.sin a et a exprimé en radian dans exp(-i.a)

z est in nombre complexe quelconque.
x est la partie réelle du nombre x= RE(z)
y est la partie imaginaire de z : y = IM(z)
r est la norme (c'est la distance depuis le centre du repère) du nombre complexe r=ABS(z)
a est l'argument (c'est à dire l'angle fait depuis l'axe de réel) : a= ARG(z)

Ces relations entre z,x,y,r et a sont la base de l'algèbre complexe et explique pourquoi on utilise souvent des représentations graphiques pour illustrer les propriétés complexes.; il y a un lien fort entre la définition des complexes, leur représentation dans le plan et la trigonométrie.
C'est pour cela que j'utilise les complexes pour calculer les fractales de Koch (et autres courbes dérivées). Avec les complexes, une simple multiplication correspond à une rotation et une addition à une translation.


Sur les HP48/49/50, en fonction des choix de l'utilisateur dans le menu mode, ou de la saisie du caractère </ ou i, le complexe z est affiché : x+y.i ou (x,y) ou r </ a

Sur les HP28, tous les complexes sont uniquement sous la forme (x,y)
(Exception faite du résultat de la fonction R->P)

Mais en interne, c'est identique donc pour extraire la norme ou l'argument d'un nombre complexe r >\ a , il suffit de la séquence
r >\ a ABS pour obtenir r
r >\ a ARG pour obtenir a
r >\ a RE pour obtenir x
r >\ a IM pour obtenir y
et de changer les préférence dans le menu MODE pour avoir (x,y) x+i.y etc...

Ainsi, 3>\45° est simplement (2.1213, 2.1213)
4>\60° est simplement (2. , 3.4641)
etc.

En France, on utilise surtout la notation algébrique des nombre complexes 'z=x+i*y', mais aux USA, la plupart de publication utilisent le raccourci : 3i2 ou 5i3/4 ainsi que la notation angulaire.


Tout cela pour dire qu'à mon avis, les ' ' ne sont pas nécessaires, ni d'ailleurs la commande ->NUM

(r<\a) 'XYTor' STO+ devrait directement ajouter (x,y) au contenu de XYTor.
Modifié en dernier par C.Ret le 05 avr. 2021 09:35, 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
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3405
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Programmer en RPL

Message par C.Ret »

Gilles59 a écrit :Version corrigée :

Code : Tout sélectionner

« -> n
  « IF 0. n == 
    THEN 1 
    ELSE n 'n' DECR f EVAL * 
    END  
  » 
»
J'ai un souci avec la partie n 'n' DECR
Que fait cette commande DECR ?

Pourquoi n'est-ce pas plus simplement :

Code : Tout sélectionner

« -> n
  « IF 0. n == 
    THEN 1 
    ELSE n 1 - f EVAL * 
    END  
  » 
»
Si « n 'n' DECR » est simplemnt équivalent à « n 'n' STO+ 'n' RCL », je ne vois pas l'intérêt de modifier n qui n'est plus utilisé dans le programme. Et comme c'est une variable locale, elle disparait après le *

Les variables locales servent aussi beaucoup à définir les function analytiques qui supportent aussi la récurrence :

Code : Tout sélectionner

 « -> n 'IFTE( n>0 , n*FCT(n-1) , 1 )' » 'FCT' STO 



Par ailleurs, la récurrence peut se programmer beaucoup plus facilement en utilisant directemetn le nom global de la fonction que l'on définit:

Voici la façon dont je programme le calcul par récurence de la factorielle, en utilisant FACTR pour ne pas confondre avec la fonction FACT originale :

Code : Tout sélectionner

« -> n   
   «  IF n 0 ==
       THEN 1
       ELSE n n 1 - FACTR *
       END
  »
»
'FACTR' STO
Et là comme il n'y a pas de variable locale, pas besoin de la commande EVAL.
On peut faire plus 'léger' encore et s'affranchissant de la variable locale n:

Code : Tout sélectionner

« IF DUP 1 > THEN DUP 1 - FACTR * END » 'FACTR' STO
Dans les deux cas, la récurence consiste à empiler les multiplications qui ne seront exécutées que lorsque l'on arrive à 1.
Dans le second cas, les multiplication sont accumulés dans la pile (opérationelle) ainsi que les arguments (en ordre décroissants) .

En comparant les deux codes, on comprendra l'intérêt de la variable locale : rendre la lecture plus facile et ne pas avoir à décortiquer les opérations de pile (DUP, SWAP; ROT, ROLL et entre DROP !)

On soulève ici un des problème et reproche le plsu sérieux et le plus sensé opposé au RPL : il ne met pas en évidence les mouvemetn de la pile et rend obscure de ce fait le fonctionnemetn de certaine procèdure.
C'est exactement le même problème que les GOTO des programmes spagetti.
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
kweeky
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1777
Enregistré le : 05 oct. 2007 19:46
Localisation : Pas très loin de Bordeaux

Re: Programmer en RPL

Message par kweeky »

Salut C.Ret

La fonction DECR attend comme argument un nom (global ou local) de variable. Elle décrémente d'une unité la valeur de la variable concernée ET laisse cette valeur sur la pile.

Exemple : si A contient 33, la séquence 'A' DECR laisse 32 sur la pile, et la variable A contient alors 32. L'opération inverse est INCR.

@+
Répondre

Retourner vers « Tous les Pockets »