Bonsoir, ayant postulé pour un poste de programmeur gameplay, on m'a avertit que le test porterait sur un test de gameplay pour une DS, en C, avec des calculs à virgule fixe.
En ce qui concerne le langage C aucun problème, mais ayant toujours développé sur pc, c'est les calculs à virgule fixe qui me posent un peu de soucis.
Je me suis donc renseigné dessus (ayant reçu l'email hier), et j'en viens à vous voir pour essayer d'être à l'aise avec et enlever certains doutes.
Je vous expose donc un code d'addition que j'ai fais pour essayer de comprendre :
(Bien entendu je retourne la valeur directement en int ou float, mais j'aurais pu retourner la valeur fixe pour effectuer d'autres calculs avant de convertir)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 int _tmain(int argc, _TCHAR* argv[]) { float fNb1 = 23.45; float fNb2 = 45.32; printf("AdditionInt : %d \n", AdditionInt(fNb1, fNb2)); printf("AdditionFloat : %f \n", AdditionFloat(fNb1, fNb2)); _getch(); return 0; } int AdditionInt(int _iNb1, int _iNb2) // reçoit 2 int (pour pouvoir faire un décalage binaire) { int a = (_iNb1 << 8); // met en virgule fixe int b = (_iNb2 << 8); return (a+b) >> 8; // retourne le résultat en int } float AdditionFloat(float _fNb1, float _fNb2) // reçoit 2 float { float a = (_fNb1*(float)(1<<8)); // met en virgule fixe float b = (_fNb2*(float)(1<<8)); return ((a + b) / (float)(1<<8)); // retourne le resultat en float }
Donc je me suis fixé un décalage binaire de 8 pour ma virgule fixe, et ce que je ne suis pas sûr c'est laquelle de ces deux fonctions d'additions (ou une autre que j'ai pas vu) serait la plus appropriée pour des calculs.
Car la syntaxe que j'ai le plus vu, est celle de "AdditionInt", où on effectue un décalage binaire vers la gauche pour obtenir la valeur fixe, le problème c'est qu'après avoir effectué ce calcul avec les deux int, je me retrouve avec un résultat de 68 où toute précision est perdue.
Donc en concidérant que je programme sur une DS et qu'il faille absolument optimiser etc... la fonction "AdditionFloat" est elle bonne ou ya il un moyen de retrouver la précision en modifiant un peu la fonction "AdditionInt" ?
Je vous remercie d'avance de bien vouloir m'aider, et je suis ouvert à tout conseil et/ou correction.
Lyofen
Partager