1

pour un prog, j'utilise ce format pour representer les nombres décimaux :
sur un long,
les 16 bits de poids fort representent la partie entiere et les 16 bits de poid faible représentent la partie décimale
exemple : 1.5 = 0x0001 8000
en gros, je multiplie le nb par 2^16

mais j'ai un pb :
je ne peut pas effectuer des opérations mathematiques (a part l'addition et la soustraction) sur ces nombre
j'ai bien touvé une methode pour la multiplication :
long mulfix (long a, long b)
{
	long ah = a >> 16, al = a & 0xFFFF, bh = b >> 16, bl = b & 0xFFFF;
	return (ah * bh << 16) + (al * bl >> 16) + al * bh + ah * bl;
	}

(est-ce que ca peut etre optimisé (surtout le & 0xFFFF) ?)

mais par contre impossible de coder la division...
pouriez vous m'aider ?
merci d'avance smile
avatar

2

long mulfix(long a, long b)
{
  return (long)(((long long)a*(long long)b)>>16);
}

long divfix(long a, long b)
{
  return (long)((((long long)a)<<16)/(long long)b));
}
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3

ha, merci, kevin smile
oui c'est bien plu simple comme ca

amis sinon, sans utiliser de long long, est-ce qu'il y a un moyen simple de faire une division ?
avatar

4

Si tu n'utilises pas le "long long", tu vas perdre la précision sur la partie fractionnnaire...
Mon site perso : http://www.xwing.info

5

azerty83 a écrit :
ha, merci, kevin smile oui c'est bien plu simple comme ca

Attention, la multiplication a l'air plus simple, mais elle sera probablement plus lente que ce que tu as codé, parce que le 68k ne gère pas les long long en natif et que ma routine de multiplication de long longs (celle utilisée par TIGCC en interne quand tu utilises mon implémentation de mulfix) travaille plus ou moins comme ta routine de multiplications, mais avec des nombres plus longs (toi, c'est (32 bits)*(32 bits)->(48 bits), moi, c'est (64 bits)*(64 bits)->(64 bits)).
amis sinon, sans utiliser de long long, est-ce qu'il y a un moyen simple de faire une division ?

Pas vraiment. Tu devras probablement faire ce que fait ma routine de division de long longs: je fais la division comme on la ferait à la main (mais en base 2 évidemment): en gros, c'est une suite de décalages et de soustractions. Le 68k ne prévoit que la division (32 bits)/(16 bits)->(16 bits), alors que tu as besoin au moins de (48 bits)/(32 bits)->(32 bits). (D'où l'utilisation dans divfix d'une division (64 bits)/(64 bits)->(64 bits). (32 bits)/(32 bits)->(32 bits) ne suffisent pas à cause de la taille du numérateur, donc on est obligés d'utiliser la taille de dessus.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

6

oui, d'accord je vais garder ma routine de multiplication et essayer de d'en coder une pour la division

mais je n'ai besoin que de (32 bits)/(32 bits)->(32 bits)

et une autre question :
pour un test de collision, j'ai desoin de connaitre la distance entre 2 pixels (et donc de calculer sqrt(Dx^2+Dy^2) (je suis obligé de passer par la norme))

est-ce que le plus rapide pour la racine est d'utiliser une de ses definition sous forme de somme (heu, je ne me rappelle plus du tout de ces defs), et donc de faire un certain nombre d'itérations pour obtenir une meilleur precision ?
avatar

7

azerty83
a écrit : mais je n'ai besoin que de (32 bits)/(32 bits)->(32 bits)

Non, parce que tu dois faire la multiplication par 65536 avant la division, sinon tu coupes ta partie fractionnaire lors de la division.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

Pour les racines carrées, la routine suivante doit pouvoir t'aider:
/******************************************************************************
*
* project name:  FAT-Engine
* file name:     fastsqrt.c
* initial date:  16/04/2002
* author:        thomas.nussbaumer@gmx.net
* description:   fast square root algorithm using a 256 bytes lookup table
*
* (algorithm posted at comp.graphics.algorithms)
*
* $Id: fastsqrt.c,v 1.1 2002/04/18 16:09:53 tnussb Exp $
*
******************************************************************************/

/*
// Integer Square Root function
// Contributors include Arne Steinarson for the basic approximation idea, Dann
// Corbit and Mathew Hendry for the first cut at the algorithm, Lawrence Kirby
// for the rearrangement, improvments and range optimization and Paul Hsieh
// for the round-then-adjust idea.
*/
unsigned long fastsqrt(unsigned long x) {
    static const unsigned char sqq_table[] = {
       0,  16,  22,  27,  32,  35,  39,  42,  45,  48,  50,  53,  55,  57,
      59,  61,  64,  65,  67,  69,  71,  73,  75,  76,  78,  80,  81,  83,
      84,  86,  87,  89,  90,  91,  93,  94,  96,  97,  98,  99, 101, 102,
     103, 104, 106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118,
     119, 120, 121, 122, 123, 124, 125, 126, 128, 128, 129, 130, 131, 132,
     133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145,
     146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157,
     158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168,
     169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178,
     179, 180, 181, 181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188,
     189, 189, 190, 191, 192, 192, 193, 193, 194, 195, 195, 196, 197, 197,
     198, 199, 199, 200, 201, 201, 202, 203, 203, 204, 204, 205, 206, 206,
     207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214, 214, 215,
     215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223,
     224, 224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231,
     231, 232, 232, 233, 234, 234, 235, 235, 236, 236, 237, 237, 238, 238,
     239, 240, 240, 241, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246,
     246, 247, 247, 248, 248, 249, 249, 250, 250, 251, 251, 252, 252, 253,
     253, 254, 254, 255
    };

    unsigned long xn;

    if (x >= 0x10000) {
        if (x >= 0x1000000) {
            if (x >= 0x10000000) {
                if (x >= 0x40000000) {
                    if (x >= 65535UL*65535UL) return 65535;
                    xn = sqq_table[x>>24] << 8;
                }
                else {
                    xn = sqq_table[x>>22] << 7;
                }
            }
            else if (x >= 0x4000000) xn = sqq_table[x>>20] << 6;
            else                     xn = sqq_table[x>>18] << 5;
        }
        else {
            if (x >= 0x100000) {
                if (x >= 0x400000) xn = sqq_table[x>>16] << 4;
                else               xn = sqq_table[x>>14] << 3;
            }
            else {
                if (x >= 0x40000) xn = sqq_table[x>>12] << 2;
                else              xn = sqq_table[x>>10] << 1;
            }
            goto nr1;
        }
    }
    else if (x >= 0x100) {
        if (x >= 0x1000) {
            if (x >= 0x4000) xn = (sqq_table[x>>8] >> 0) + 1;
            else             xn = (sqq_table[x>>6] >> 1) + 1;
        }
        else if (x >= 0x400) xn = (sqq_table[x>>4] >> 2) + 1;
        else                 xn = (sqq_table[x>>2] >> 3) + 1;

        goto adj;
    }
    else {
        return sqq_table[x] >> 4;
    }

    xn = (xn + 1 + x / xn) >> 1;
nr1:
    xn = (xn + 1 + x / xn) >> 1;
adj:

    // we don't care about being one on the wrong side - therefore the
    // next line is commented out.

    // if (xn * xn > x) xn--;

    return xn;
}


//#############################################################################
// Revision History
//#############################################################################
//
// $Log: fastsqrt.c,v $
// Revision 1.1  2002/04/18 16:09:53  tnussb
// initial version
//
//


(Comme je ne pense pas que tu aies envie d'importer une librairie dynamique de 55 KO juste pour une routine de racines carrées, je pense que le plus simple est de prendre juste la routine.)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

heu j'ai essayé de comprendre cette fonction mais je n'y arrive pas trop
c'est quoi la fonction qui a été utilisée pour creer la liste au debut ?
avatar

10

Aucune idée. Et tu n'as pas besoin de comprendre la fonction pour l'utiliser.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

oui mais je n'aime pas utliser un truc sans comprendre grin
avatar

12

Bon, j'ai regardé la fonction de plus près, et son fonctionnement est assez simple en fait:

1. Le tableau est une liste des racines carrées des nombres entre 0 et 255, en virgule fixe 8 bits, dont 4 pour la partie entière et 4 pour la partie fractionnelle.

2. Ce que fait le reste de la routine est de ramener le nombre en un nombre entre 0 et 255 par une division par 22n, de lire la racine carrée dans le tableau, et de multiplier le résultat par 2n/16 (/16 parce que le tableau est en virgule fixe 4-4).

3. Ensuite, elle corrige l'approximation xn ainsi obtenue en prenant la moyenne de xn et de x/xn. Un des 2 nombres sera plus grand que la racine carrée et l'autre plus petit, et la moyenne sera assez proche de la racine carrée.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

merci, c'est deja plus clair smile
avatar

14

bon, j'ai essayer d'implémenter un algo de division euclidienne mais en vain...

vous ne pouvez pas m'aider ?
merci smile
avatar

15

oulà, c chaud ça ! eek
tu veux refaire un CAS ou quoi ? grin
Non-Webmaster et non-programmeur du site. .Pour tout probleme ou question ,débrouillez vous avec les Webmasters .

«- Pas Moo ! ^^

16

heu..
une coder un algo de division euclidienne sur des nbs a virgule fixe ne doit pas etre bien dur, mais je n'y arrive pas...
(pim > non c'est pour un jeu/simulateur)
avatar

17

division euclidienne avec un nombre a virgule confus
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

18

oui grin

non, en fait tu assimiles le nb a virgule a un entier en faisant un décalage

(10/2.5=100/25, pareil en base 2)
avatar

19

M'enfin ca s'appelle pas une division euclidienne ca...
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!

20

ben 100/25 ca reste une division euclidienne, non ? confus
avatar

21

Il me semble (à vérifier) qu'une division Euclidienne est une division qui ne renvoie pas de nombre décimal, en clair il y a toujours un reste (parfois nul).
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

22

c ça smile
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

23

oui et une division est une suite de vivisiosn euclidiennes.
en fait j'avais mal posé ma question c'est un algo de div normale que je cherchais...
mais un tel algo doit etre une suite de div euclidienne ("une suite de décalages et de soustractions" comme disait kévin)
mais je bloque toujours
avatar

24

Rappelle-toi de tes cours de CM1...

Je me suis déjà amusé à coder une fonction de division et c'est pas dur tongue
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

25

merde, j'ai arreté l'école en CE2 sad

non, mais le truc que m'enmerde, c'est comment savoir combien de fois va b dans a

en fait non, ya pas que ca

mais je en sais pas, je en dois pas chercher dans la bonne direction donc je suis completement aveuglé


au secours !!!!

je meurs !!!!

arg. sick
avatar

26

Ca se fait comme tu l'as appris en CM1 !
Souviens-toi : tu regardais l'arrière de la couverture de ton cahier de brouillon smile Y'avait des tables. Et pour les nombres qui étaient trop grands pour être dans les tables ben tu y allais au pif...

En prog on ne va pas utiliser de table, on va tout le temps aller "au pif". Mais d'une façon plus intelligente : effectue une recherche dichotomique.


Sinon, tu peux aussi oublier l'algorithme d'Euclide et en utiliser un autre (hé oui, il n'y a pas que la façon apprise au primaire qui existe) beaucoup plus rapide. Faudrait que je le retrouve.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

27

ouais, en fait je veux bien ton autre methode grin

(tu sais que tu as un vrai talent pour expliquer les choses simples au enfants N
tu devrais etre maitre d'ecole grin)
avatar

28

Ho ça va je fait comme je peux hum
Tu n'as pas compris quoi ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

29

y'a koi de plus rapide que l'euclidienne ? tu te rapelles du principe ?

30

non, ce n'était aucunement ironique !
j'ai tout bien compris

mon "grin" voulais juste mettre en exergue le decalage entre mon compliment (sincere) et le sujet du topic...
avatar