Go Down

Topic: 1+1=11... et ça c'est beau ! (Read 1 time) previous topic - next topic

AspiGeek

#5
Oct 17, 2012, 06:52 pm Last Edit: Oct 17, 2012, 07:03 pm by AspiGeek Reason: 1
Merci de ta réponse Trigger.

Ne te fie pas au print, si tu cast resultat en int tu verras que le problème existe toujours et que le double ne tombe pas sur un entier.
J'ai besoin de récupérer un int car il me sert d'index dans un tableau, un index de tableau typé double n'est pas autorisé en C.

J'ai beau retourné le problème dans tous les sens je ne comprends pas comment c'est lié au nombre de boucles  :smiley-eek:

Edit : Bonjour Skywodd pourtant dans mon premier exemple le cast fonctionne !!!
Sinon je suis d'accord que le int arrondi à l'entier inférieur mais ce n'est pas le problème ici.

A savoir, juste 2 tours de boucle pow(2,i) renvoie les bonnes valeurs. Plus de 2 tours de boucles tous les résultats ne sont plus des entiers.


skywodd

#6
Oct 17, 2012, 07:19 pm Last Edit: Oct 17, 2012, 07:24 pm by skywodd Reason: 1
Après quelques tests (oui je suis curieux :smiley-mr-green:) voici ce que je constate :

- Sur PC (pour avoir une base de comparaison) :
Code: [Select]
#include <math.h>
#include <stdio.h>

int main(void) {
int i;

for(i = 0; i < 5; ++i) {
int resultat = pow(2, i);
printf("%d\n", resultat);
}

return 0;
}


Résultat :
Quote
1
2
4
8
16

(Tout est normal)

- Sur AVR (avec avr-gcc 4.3.3 (WinAVR 20100110)) :
Code: [Select]
#include <math.h>

void setup() {
 Serial.begin(9600);
 for(int i = 0; i < 5; ++i) {
   int resultat = pow(2, i);
   Serial.println(resultat);
 }
}

void loop() {

}


Résultat :
Quote
1
2
3
7
15

(Houston, we've had a problem)

En utilisant des double :
Code: [Select]
#include <math.h>

void setup() {
 Serial.begin(9600);
 for(int i = 0; i < 5; ++i) {
   double resultat = pow(2, i);
   Serial.println((double)resultat);
   Serial.println((int)resultat);
 }
}

void loop() {

}


Résultat :
Quote
1.00
1
2.00
2
4.00
3
8.00
7
16.00
15


A partir de 4.00 tout part en brioche ...
Ça sent le bug avec le cast double -> int ou au niveau du Serial.println()
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

AspiGeek

Moi aussi Skywodd je pensais que ça partait en sucette à partir de pow(2,2)...

Mais c'est pire que ça... c'est vraiment lié au nombre de boucle par exemple ce code marchera car 2 boucles même si initialisé à 6
Quote
for(int i=6; i<8 ; i++){ code }


dès qu'on dépasse 2 boucles tous les résultats sont faux même les deux premiers  XD
Quote
for(int i=6; i<9 ; i++){ code }


Je laisse tomber... suivant si on rajoute des prints dans mon tout premier code pourtant bon jusqu'à présent j'obtiens aussi des résultats différents...

Je déclare forfait  :smiley-red:


B@tto

Et comment expliquer que pour i=0 ça marche et pas avec i=1 ?

AspiGeek

Je ne marque pas le sujet résolu, je laisse courir le topic peut être qu'un jour une personne pourra apporter davantage d'informations sur l'origine du problème.
En attendant la solution rappelée par patg_ est de loin la meilleure et la plus propre...et surtout pas de problème de résultat  ;)

Go Up