APPLICATIONSDIVERS ★ LES FONCTIONS ARCSINUS ET ARCCOSINUS (AMSTRAD MAGAZINE) ★

Les Fonctions Arcsinus et Arccosinus (Amstrad Magazine)Applications Divers
Vous avez pu remarquer que quel que soit l'ordinateur ou sa marque, il n'existe pas de fonctions mathématiques telles que Arcinus et Arccosinus. Il est évident que ces fonctions n'ont pas beaucoup d'utilité et ne sont pas employées dans des classes inférieures à la terminale. Or justement à partir de ce niveau, ces fonctions peuvent devenir importantes (physique, maths, électronique, etc.). Voici donc deux de ces fonctions que nous avons redéfinies en RSX. Attention ce programme tel qu'il est donné, ne fonctionne que sur 464. Adaptez-le vous-même en fournissant les adresses équivalentes données à la fin selon les modèles.

Le procédé n'est pas sorcier puisque nous pouvons obtenir ces deux fonctions grâce à l'arctangeante. Il suffit pour cela de quelques transformations mathématiques résultants des calculs suivants.

Tg (Arccos(x)) = √(1 - x²) / x

en composant par Arctangeante on obtient

Arccos(x) = atn (√(1 - x²) / x

(Attention au signe de × ). Pour obtenir Arc-sinus (x) on a

Tg (Arcsin (x)) = x / √(1 - x²)

en composant par Arctangeante on obtient

Arsin ( × ) = Atn ( x / √(1 - x² ) )

Commentaires : les deux organigrammes suivants ont été directement adaptés en langage machine. Pour les deux fonctions, x doit être compris entre - 1 inclus et 1 inclus. On a choisi d'indiquer 255 en cas d'erreur. Les calculs sont réalisés en degrés. Organigrammes : pour l'arccosinus : comme on ne peut pas diviser par 0 et que Arccosinus (0) = 90 on l'affiche directement. Si x est différent de 0, on applique directement la formule (1). Puis on teste le signe de x . Si x est positif, on affiche directement le résultat. Si par contre il est négatif on ajoute 180 ou on fait résultat = 180 — ABS (a). Pour l'arcsinus on ne peut pas non plus diviser par 0 (obtenu pour les deux x = - 1 et x = 1) on a choisi, d'indiquer directement le résultat ; pour Arcsin (1) = 90 deg et Arcsin ( - 1) = - 90 deg. Pour le reste on applique la formule (2).

Les deux organigrammes permettent d'entrevoir que l'on peut utiliser les mêmes parties de programmes pour les deux. Le sous-programme à l'étiquette ZOU n'est que pour l'arcsinus. Avant de continuer précisons la méthode d'appel de ces routines. Du basic, après avoir assemblé le programme, on fera memory & 8fff : load “nomprog” : call & 9000. Puis pour un calcul on tapera par exemple : b = 0.2 : | arcos, àb : print b. Vous obtiendrez alors la valeur de Arccos (0.2). Cela peut paraître bizarre de prendre b puis de le réafficher. En fait b se voit attribuer par la machine une adresse arbitraire que l'on fournit (sans toutefois la connaître) par le fameux à. Une fois le calcul fini, on fournit au programme l'adresse de b (que l'on a sauvegardé) à la routine chargée de l'affichage : Print. Pour plus de clarté, expliquons le programme en assembleur.

(1) : Le registre IX possède l'adresse du contenu de la variable b. Avec le à on fournit une adresse. Donc le contenu de l'adresse IX+ 0, IX + 1 sera l'adresse de la variable b. On charge alors dans HL cette adresse que l'on sauve aussi dans la pile.

(2) : attention aux manipulations de la pile. Il est fort déconseillé de l'utiliser dans un sous-programme parce que justement la machine s'en sert pour mémoriser l'adresse de départ du sous-programme. Donc, lors d'un POP vous risquez d'avoir des surprises, c'est-à-dire une tout autre donnée. C'est la raison pour laquelle on a répété les lignes =#901E à =#9024 aux adresses #9060 à =#9066.

(3) : on charge dans DE la première adresse d'une zone de 5 octets (mem1) qui servira de mémoire de calcul. Puis on met le contenu de b dans mem1. Comme l'on veut conserver le nombre de départ pour le tester, on le sauve également dans memO, Une fois ce travail fait, on teste le signe de mem1 (#9099) et on revient.

(4) : on sauve le résultat contenu dans A (PUSH AF). Il a été obtenu comme suit : si le contenu de mem1 est négatif, on a l'accumulateur A égal à 255 ; si le contenu de mem1 est nul on a A = 0 ; si le contenu de mem1 est positif A= 1. On restitue ensuite le contenu de la pile dans A (POP AF).

(5) : si mem1 =0 on va à AFF. AFF qui a la particularité de transcrire 90 ( #5a) en flottant et de le mettre dans mem1.

(5 bis) : (call =#bd40) convertit un nombre entier (dans HL) en un nombre au format réel 5 octets dont le premier est pointé par le registre DE.

(6) : une fois que 90 est traduit en flottant on va à RESU (c'est la raison pour laquelle on restitue dans l'accumulateur A la réponse au test de la ligne #9099).

(7) : on met dans DE l'adresse de la variable b (que l'on ne connaît toujours pas) qui est dans la pile. On charge dans HL la première adresse de mem1 et on transfert le contenu de mem1 à l'adresse contenu dans DE qui sert de référence à la fonction basic Print. En effet Print va chercher la première adresse d'une zone de 5 octets (pour des nombres réels) dans le registre DE.

(8) : toujours par rapport au test effectué auparavant : si le contenu de mem1 est négatif on forme sa valeur absolue. Puis on met #ff dans la variable système à l'adresse H b8ff qui indique que le calcul est en degré. Ensuite on charge 1 dans l'accumulateur que l'on traduit en réel pour le mettre dans mem3. Ensuite on compare ( # bd6a) le contenu de mem1 ( x ) avec 1 en mem3. L'accumulateur A contient le résultat.

(9) : si la valeur absolue de x est supérieure à 1 le calcul est impossible ; on affiche 255 (sous prog RETO).

(10) : on transcrit deux en flottant puis on élève x au carré ( #bd7C) ; on met un signe moins devant x au carré (=#BD6D) et on l'ajoute à mem3 - 1 en flottant - ( BD58). On fait la racine carré du tout (#BD79).

(11) : on divise le tout par x ( # BD64) puis on en prend l'arctangeante (#BD91).

(12) : on prend la valeur de départ x ; on teste son signe (=#BD70). S'il est négatif (A= =#ff), on prend 180 que l'on convertit en flottant et que l'on ajoute au résultat obtenu en (11). ATTENTION : Vous voyez qu'une fois traduit en flottant, on inverse le signe de 180 ( #BD6D en ligne #9052). En effet l'opération s'effectue en binaire signé. Il faut donc inverser le signe obtenu après conversion de tout nombre positif dépassant
127. A partir de 128 on a le bit 7 de l'octet à 1 qui signale à l'ordinateur (en opérations signées) que le nombre est négatif. Donc prudence avec la routine #BD40. Une fois l'addition faite on saute à RESU qui affiche le résultat.

(13) : si x est positif, on affiche directement le résultat obtenu en (11).

(14) : pour ce qui est de l'arcsinus, on se sert à peu près des mêmes sous-programmes selon les besoins de l'organigramme. Le sous-programme ZOU teste la valeur absolue de x puis si x est égal à 1 ou - 1 on affichera 90 ou -90 degrés. '

Guillaume PONTICELLI, Amstrad Magazine

★ EDITEUR: AMSTRAD MAGAZINE
★ ANNÉE: 1987
★ CONFIG: 64K + AMSDOS
★ LANGAGE:
★ LiCENCE: LISTING
★ AUTEUR: Guillaume Ponticelli
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» Les  Fonctions  Arcsinus  et  Arccosinus    (Amstrad  Magazine)    FRENCHDATE: 2020-05-11
DL: 166
TYPE: ZIP
SiZE: 5Ko
NOTE: 40 Cyls
.HFE: Χ

» Les  Fonctions  Arcsinus  et  Arccosinus    (Amstrad  Magazine)    LISTING    FRENCHDATE: 2021-02-02
DL: 174
TYPE: PDF
SiZE: 411Ko
NOTE: 4 pages/PDFlib v1.6

Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 432 millisecondes et consultée 958 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.