★ CODING ★ AMSLIVE ★ AMSLIVE N°07 - SINUS SITE , LA SUITE (2/2) ★ |
AMSLIVE n°07 - SINUS SITE , LA SUITE (2/2) | Coding Amslive |
En 1 mois, votre mal de tête a du tomber. On reprend donc les considérations abstraites qui ont fait dire à quelqu'un : il est peut-être bête, ce Madram, mais il est pas con (à moins que ça ne soit l'inverse ?).Quand je dis "fin", ce n'est que provisoire. Il y a tant de choses à dire sur le sujet. Cependant, une fois bien assimilé ce que je vous aurai raconté, vous pourrez créer ondulations, animations, déformations, voire sons les plus fous ! PRECALCUL Je me permets une digression. A ne pouvoir profiter de la liberté de la paresse, je me rabats sur la liberté de la presse. Dans la plupart des cas, on construit les courbes en BASIC, puis on enregistre le résultat (une "table"). Compactée, elle utilisera sûrement moins de place et de temps que de la construire en language machine à l'initialisation du programme. Mais pour ceux qui veulent laisser le prog tout calculer, je donne quelques pistes. Les routines mathématiques font partie du système et non pas de l'interpréteur BASIC. On peut donc y accéder par des vecteurs. Attention ils ne sont pas aux mêmes adresses sur 464 & 664/6128 et celles données par LES CLEFS ne sont pas toutes exactes. BDAC sur 6128 calcule le sinus d'un angle codé en réel (sur 5 octets, sujet d'un autre article si vous le désirez ardemment). HL doit pointer sur ces 5 octets. Ces routines ne sont pas très rapides, vous voudrez peut-être en concevoir de nouvelles. Pas compliqué, il faut vous dire que si x est exprimé en rad, sin(x) est la limite de la série : sin(x) = x – x^3/3! + x^5/5! - x*7/7! ... +(-1)^n*x^(2n+1)/(2n+1)!Quatre termes suffisent pour une approximation très correcte qui peut s'écrire x( 1 – x^2/6( 1 – x^2/20( 1 – x^2/42 ) )) Les détails du calcul sont disponibles jusqu'au 15 novembre dans ma corbeille à papier. BREF... Revenons à une construction de table sous BASIC : la fonction SIN renvoie une valeur codée sur 5 octets, comprise entre -1 et 1. Or, un vaillant programmeur en assembleur préférerait une valeur codée sur 1 octet, variant donc entre 0 et 255 (ou -128 et 12 7 en binaire signé). Pas de problème, un POKE (sin(t)+1)*255/2 s'occupe de l'arrondi au plus proche. Ce qui importe, c'est ce manque de précision. Chaque valeur est définie à 1 unité près (autrement dit, à + ou - ½ unité). Et si on additionne deux de ces valeurs, le résultat n'est plus défini qu'à 2 unités près. Prenez l'exemple suivant (si, si, prenez, c'est cadeau) : 5,5 et 3,5 ont été arrondis à 6 et 4 (différence de 0,5). 6 + 4 = 10, qui diffère de 1 avec 5,5 + 3,5. Comme quoi, les incertitudes s'additionnent. TREMBLEZ, PAUVRES COURBES La ligne suivante trace une sinusoïde de faible amplitude obtenue par addition de deux courbes. DEG:FOR x = 0 TO 638 STEP 2:a=(SIN(t)+1)*100:b=(SIN(t+183)+l)*100: PLOT x,CINT(a+b):NEXT
L'arrondi se fait après l'addition. Maintenant, remplacez CINT(a+b) par CINT(a)+CINT(b)C'est exactement ce qu'il se passe quand on prend des valeurs, déjà arrondies, dans une table. Résultat, la courbe est parkinsonienne (figure 2).
La figure 3 fournit l'examen à la loupe de ce qui arrive dans ces cas-là.
LE REMEDE Ahah. Gloups. Hum ? Quoi ? Le remède ? Ben y'en a pas. Le problème est que même une très grande précision n'empêche pas les erreurs. Entre les valeurs 0.499999 et 0.5 il n y a que 0.000001 de différence ; pourtant, après arrondissement, l'écart sera de 1. LD A,(DE) ; on additionne les poids faibles |
|
Page précédente : AMSLIVE n°07 - HAPPY DRIVERS : LES RSX AMSDOS |
|