Go Down

Topic: Problème d'arithmetique (Read 662 times) previous topic - next topic

tuxtof

bonsoir

j'ai un comportement bizarre que je n'arrive pas a m'expliquer

j'avais commencer par me retrouver avec la chose suivante

int var = 164 * 200 / 200; qui me donnait un -163 du au dépassement de limite même si je ne m'expliqe pas la valeur exacte

ensuite j'ai fait
unsigned int = 164 * 200 / 200; qui me donne 65373 et la je comprend plus

une bonne âme peut t'il tenter de m'expliquer

merci d'avance

flaith

int (entier signé) valeur : de -32 768 à 32 767
unsigned int (entier non signé) valeur : de 0 à 65 535
Ce qui est bizarre c'est le comportement, normalement cela devrait être codé sur 32bits et no sur 16bits, soit :
int : -2 147 483 648 à 2 147 483 647
uint : 0 à 4 294 967 295
:o

flaith

#2
Aug 20, 2010, 08:18 am Last Edit: Aug 20, 2010, 08:20 am by flaith Reason: 1
un test rapide (gcc) :
Code: [Select]
#include <stdio.h>

int main()
{
     int i;
     unsigned int j;

     i = 164 * 200 / 200;
     j = 164 * 200 / 200;

     printf("i = %i\n",i);
     printf("j = %u\n",j);
     return 0;
}


me donne 164 pour les deux  :-?
Y'a un truc pas net  :o

fdufnews

#3
Aug 20, 2010, 11:35 am Last Edit: Aug 20, 2010, 12:54 pm by fdufnews Reason: 1
Le type int est un 16bits sur la plateforme arduino
164 = 0xA4
200 = 0xC8

0xA4 x 0xC8 = 0x8020  // valeur négative
0x8020 / 0xC8 = 0xFF5D

Ce résultat, évalué comme un int donne -163
Ce résultat évalué comme un unsigned int donne 65373

Quote
unsigned int = 164 * 200 / 200; qui me donne 65373 et la je comprend plus

Dans ce cas là, seul le résultat est unsigned. Les éléments du calcul ont le type par défaut int.
il faudrait faire ça
Code: [Select]
unsigned int var = (unsigned int)164 * (unsigned int)200 / (unsigned int)200;

Pour avoir le bon résultat, il faut faire:
Code: [Select]
unsigned int var = (unsigned int)(164L * 200L / 200L);
Le calcul est réalisé en long donc pas de perte de précision et le résultat est converti dans le bon type
Une variante avec le calcul en flottant:
Code: [Select]
unsigned int var = (unsigned int)(164.0 * 200.0 / 200.0);

tuxtof

Ok je commence à comprendre

mais alors comment l'espace de calcul est défini quand il ya  plusieurs variable de type différent

par ex

Code: [Select]

unsigned int steps = 200;
unsigned int delta = 200;
int i = 164;

byte var = i * delta / steps;


qu'elle va être l'espace de calcul ?? dans tous les cas je veux stocké 164 dans var.

Go Up