Pages: [1]   Go Down
Author Topic: Problème d'arithmetique  (Read 612 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

$300:20 58 FC 60
Offline Offline
Newbie
*
Karma: 1
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

$300:20 58 FC 60
Offline Offline
Newbie
*
Karma: 1
Posts: 26
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

un test rapide (gcc) :
Code:
#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
« Last Edit: August 20, 2010, 01:20:00 am by flaith » Logged

France
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3508
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
unsigned int var = (unsigned int)164 * (unsigned int)200 / (unsigned int)200;

Pour avoir le bon résultat, il faut faire:
Code:
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:
unsigned int var = (unsigned int)(164.0 * 200.0 / 200.0);
« Last Edit: August 20, 2010, 05:54:05 am by fdufnews » Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 3
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

Pages: [1]   Go Up
Jump to: