Tentative d'explication du problème...
Il y a bien un problème de précision, la fonction 'pow' consiste en gros à calculer x*x*x...x*x avec le bon nombre de x (la fonction pow le fait de manière plus intelligente mais mathématiquement c'est ça).
Dans le cas de ta boucle, à chaque itération le calcul ce fait avec juste un x de plus, donc il est possible de garder la valeur de la boucle précédente et de juste la multiplier par x à chaque fois. Ce qui donne une simple multiplication à chaque itérations au lieu d'un appel à fonction très couteuse. Ce qui donne comme boucle :
float temp = 1;
for(byte i=1; i<3 ; i++)
{
temp *= 2.0;
int resultat = temp;
Serial.println(resultat);
}
Ok, et le rapport avec la choucroute ? C'est tout simple, les multiplications ne forment plus une seule opération comme dans le cas de pow et donc les garanties de précision ne sont plus les même. Dans le cadre du standard IEEE 754, pour de petites boucles il n'y a pas de problèmes. Les arrondis sont fais de telle manière que ça marche.
Le problème est donc double (ici c'est une supposition)
- l'optimiseur de GCC fais la transformation car il doit penser être dans le cadre du standard (c'est le cas de la grande majorité des plateformes classiques)
- la lib math software de l'AVR ne doit pas respecter complètement le standard car les règle d'arrondis sont complexe et donc coûteuse en instructions.
Donc à chaque tour de boucle tu accumule un peu plus d'erreur et donc avec une seule itération sa va, mais avec deux ça ne marche plus...
PS: je précise que c'est une supposition. J'ai vu des compilateur faire cette optimisation sur UltraSPARC notamment, je ne sais pas si GCC en est capable, et je ne connais pas le comportement de la lib math software.
Ça explique bien ce que tu observe mais il faudrais regarder le code assembleur généré pour être sur.