| Amiga Impact

  · Accueil
  · Actualités
   · Proposer une info
  · Agenda
   · Proposer une date
  · Articles
  · Forum
  · Petites Annonces
  · Chat IRC
  · À propos du site
   · Confidentialité



 | Connexion

Identifiant :

Mot de passe :

 Mémoriser

  · Inscription
  · Mot de passe oublié



 | En ligne

Illustration du profil de Amigars Illustration du profil de kix






 | Nous suivre

Flux RSSGoogle+TwitterFacebook





Forum

/   Forums d'Amiga Impact
   /  Trigo en asm 68k

Accueil Forums AmigaOS, MorphOS et AROS Développement Trigo en asm 68k

Ce sujet a 12 réponses, 3 participants et a été mis à jour par  bombseb, il y a 1 an et 2 mois.

13 sujets de 1 à 13 (sur un total de 13)

Auteur Messages   
#311615 Trigo en asm 68k
 le 15/06/2018 à 11:03


bombseb

Participant
  • Messages : 60

Bonjour,

Une petite question aux connaisseurs…

Comment faire pour calculer un sinus ou un cosinus en asm ?
Je sais qu’il existe des outils pour générer des tables précalculées, mais j’aimerais précalculer ma table moi même au lancement de mon programme…

(Je suis sur un Amiga 1200 émulé avec WinUAE)

 

 

#311616 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 11:13


__sam__

Participant
  • Messages : 1933

Tu travailles en flottant ou en point fixe ? Tu veux la valeur plutôt exacte de sin/cos ou une approximation suffira ?

Samuel.

Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne
A1200 (Blizzard-IV/fpu/64Mo) - A500 (+ 1Mo PPS) - A500 Vampire V2+ ^8^
(mais aussi TO8 - TO8D - TO9. Groupe PULS.)
Pub >>Teo 1.8.4<<

#311617 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 11:18


bombseb

Participant
  • Messages : 60

Salut Sam,

On va dire que j’aimerais générer une table de 1024 valeurs de sinus dont les valeurs vont de 0 à 65535 (une table de word donc)

Flottant ou point fixe, peu importe….une approximation devrait suffire pour un sine scroller…

Je viens de tomber là dessus justement  : https://amycoders.org/sources/sinegensource.html

 

#311618 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 12:29


__sam__

Participant
  • Messages : 1933

Donc du point fixe 16.16.

Une approximation de sin(x) entre -pi et pi est y=4*(x/pi)*(1-abs(x/pi)). Elle est précise à 6% près.

Ta table fait 1024 entrées pour 0..2PI, donc pi (en x) vaut: 512, et 1 en y est 65536.

Donc la formule à mettre dans la table est: 65536*4*(x/512)*(1-abs(x)/512) ce qui se simplifie en: tab[x] = x*(512-abs(x)).

Vérification: sin(0) -> tab[0]=0, sin(pi/2) -> tab[256] = 256*256 = 65536 -> 1, sin(pi) -> tab[512] = 0. sin(3pi/2) = sin(3pi/2-2pi) = sin(-pi/2) –> -256*(512-abs(-256)) = -256*256 = -65536 -> -1. Ca colle!

L’abs va nous ennuyer, mais on peut au départ calculer tab[x] avec x>0 (ce qui nous permet d’utiliser une multiplication non signée), puis pour les x<0, il suffit se savoir que sin(-x) = -sin(x) cad tab[x] = -tab[-x].

Allons y pour l’asm (sans bouées):

calc sin_tab:
lea sin_tab,a0
; calcul de tab[0..511] correspondant aux valeurs de x>0
moveq #0,d0
.1
move.w #512,d1
sub.w d0,d1
beq.b .2 ; donc quand on sort, d0 vaut 512. Idéal pour décompter.
mulu.w d0,d1
addq.w #1,d0
move.l d1,(a0)+
bra.b .1
; calcul de tab[512..1023] correspondante aux valeurs de x<0
; on ne fait que recopier la table de la partie 1 en inversant
; le signe.
.2
move.l -512*4(a0),d1
neg.l d1
move.l d1,(a0)+
subq.w #1,d0
bne.b .2
; fini
rts
; tableau de 4ko
sin_tab:
ds.l 1024

Ca devrait être +/- correct, mais j’ai pas testé. En tout cas le principe est là.

(Désolé pour la mise en page, mais le forum ne respecte pas les blancs dans le code 🙁 Une version correctement formatée est visible >><<.)

Samuel.

Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne
A1200 (Blizzard-IV/fpu/64Mo) - A500 (+ 1Mo PPS) - A500 Vampire V2+ ^8^
(mais aussi TO8 - TO8D - TO9. Groupe PULS.)
Pub >>Teo 1.8.4<<

#311619 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 12:40


bombseb

Participant
  • Messages : 60

Wow impressionnant 🙂

Bon je vais devoir digérer tout ca alors…

Merci beaucoup

 

Pour info j’ai touvé ca aussi, c’est intéressant : https://amycoders.org/tutorials/sintables.html

 

 

#311620 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 12:52


bombseb

Participant
  • Messages : 60

Excuse moi je ne comprend pas cette phrase :

« Ta table fait 1024 entrées pour 0..2PI, donc pi (en x) vaut: 512, et 1 en y est 65536.  »

Pourquoi tu remplace pi par 512 ? -> C’est bon j’ai compris 🙂

 

#311622 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 12:57


__sam__

Participant
  • Messages : 1933

je remplace pi par 512 parce que ta table a 1024 entrées et que 1024 représente la fin de la sinusoide, cad 2pi.

Donc si 2pi=1024, il vient pi=512. L’entrée 512 de la table correspond à sin(pi), celle en 256 correspond à sin(pi/2). Ben oui pi/2 c’est 256 quand pi=512. Tu vois le truc? On mappe un x réel entre 0 et 2pi vers un x’ entier entre 0 et 1024.

Samuel.

Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne
A1200 (Blizzard-IV/fpu/64Mo) - A500 (+ 1Mo PPS) - A500 Vampire V2+ ^8^
(mais aussi TO8 - TO8D - TO9. Groupe PULS.)
Pub >>Teo 1.8.4<<

#311624 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 12:58


bombseb

Participant
  • Messages : 60

Oui c’est cool merci, j’aurai pas eu l’idée de voir le truc comme ca 🙂

 

#311625 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 13:15


bombseb

Participant
  • Messages : 60

Je vais encore t’ennuyer un petit peu 🙂

Comment tu arrive de ca : 65536*4*(x/512)*(1-abs(x)/512)

à ca  x*(512-abs(x)) ?

Désolé ca fait un bail que j’ai pas fait de maths….

#311630 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 17:44


__sam__

Participant
  • Messages : 1933

Bah, c’est pas des maths, juste du calcul… un chouille laborieux là parce que j’ai essayé de détailler toutes les étapes élémentaires
65536*4*(x/512) * (1-abs(x)/512)
= (65536*4)*(x/512) * (1-abs(x)/512)
= 262144*(x/512) * (1-abs(x)/512)
= (262144*x/512) * (1-abs(x)/512)
= ((262144/512)*x) * (1-abs(x)/512)
= (512*x) * (1-abs(x)/512)
= (512*x) * (1-abs(x)/512)*1
= (512*x) * (1-abs(x)/512)*(512/512)
= (512*x) * (((1-abs(x)/512)*512)/512)
= (512*x) * ((512 – abs(x))/512
= 512*x * (512 – abs(x))/512
= x * (512 – abs(x)) * 512/512
= x * (512 – abs(x)) * 1
= x * (512 – abs(x))
CQFD 😉

Samuel.

Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne
A1200 (Blizzard-IV/fpu/64Mo) - A500 (+ 1Mo PPS) - A500 Vampire V2+ ^8^
(mais aussi TO8 - TO8D - TO9. Groupe PULS.)
Pub >>Teo 1.8.4<<

#311637 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 21:36


logo

Participant
  • Messages : 1720

Efficace et bien expliqué, même si je sens déjà poindre une légère migraine ;-), ça sent les automatismes et l’amour du travail bien fait.

 

Peg2 (H.S.) - G4 1 GHz - 768 Mo RAM - Radeon 8500 128Mo 64 Mo - MorphOs 3.9
Mac mini - G4 1.42 GHz - 1 Go RAM - Radeon 9200 32 Mo - MorphOs 3.9
WinUAE 4.0.1 (350 SysInfo Mips, boing boing boing ball !)
Mist FPGA (68020_7.10 SysInfo MIPS AGA)
A1200 en cours de résurrection 😉
A500 Kickstart 1.3

#311642 Répondre à : Trigo en asm 68k
 le 15/06/2018 à 22:47


__sam__

Participant
  • Messages : 1933

Pour ceux qui veulent s’amuser avec l’approximation de sin(x) entre -pi et pi par 4x(1-|x|/pi)/pi, j’ai posé la question à wolfram alpha. Il dit que le max d’erreur est obtenu pour x = +/-0.471972 ou x = +/-2.66962 et vaut 0.0560096. [REVISION BAC-S by sam 😛 ]

On est donc juste un peu « au dessus » du sinus au max de 5.6% (par rapport à 1). Mais c’est tout à fait acceptable en pratique car le calcul est rapide. Voyez comment les courbes sont proches.

(clickez l’image pour voir sur Wolfram Alpha)

Samuel.

Amiga A500 + GVP530 (8Mo/fpu/mmu/scsi) - en panne
A1200 (Blizzard-IV/fpu/64Mo) - A500 (+ 1Mo PPS) - A500 Vampire V2+ ^8^
(mais aussi TO8 - TO8D - TO9. Groupe PULS.)
Pub >>Teo 1.8.4<<

#311645 Répondre à : Trigo en asm 68k
 le 16/06/2018 à 08:32


bombseb

Participant
  • Messages : 60

Yes, très bien expliqué merci beaucoup Sam…Il me manquait surtout cette formule : 4x(1-|x|/pi)/pi que je ne connaissais pas
Je vais pouvoir m’amuser maintenant 🙂

 

 


13 sujets de 1 à 13 (sur un total de 13)

Vous devez être connecté pour répondre à ce sujet.

                   
Derniers sujetsFraîcheur
 · MorphOS au quotidien il y a 1 heure
 · Qu’avez-vous acheté aujourd’hui? il y a 1 heure et 23 minutes
 · [RECHERCHE] Indivision pour Amiga 1200 il y a 1 heure et 34 minutes
 · [RECHERCHE] Agnus 8372A ou 8375 il y a 2 heures et 2 minutes
 · Les cartes accélératrices pour AMIGA 500 il y a 4 heures et 19 minutes
 · 007 (Bond) joué par une femme il y a 6 heures et 10 minutes
 · [VENDS] matériel Amiga il y a 6 heures et 52 minutes
 · CDROM Non reconnu il y a 7 heures et 40 minutes
 · Le fil des annonces LeBonCoin il y a 9 heures et 36 minutes
 · Adaptateur Scanplus de Amedia il y a 17 heures et 34 minutes





RechercheFraîcheur


Copyright © 2004-2019 Amiga Impact. Tous droits réservés. Les marques citées sont déposées par leurs propriétaires respectifs.
Conditions d'Utilisation, Politique de Confidentialité et Information sur les cookies.


Fil RSS WordPressNicolas Gressard, Conseil et développement informatique

Do NOT follow this link or you will be banned from the site!