Opération flottante incorrecte ?

Résolu
steph12358 Messages postés 149 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 10 décembre 2009 - 10 déc. 2008 à 16:58
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 12 déc. 2008 à 14:06
Bonjour tout le monde

Désolé pour la question super basique mai j'ai un soucis
Ce code fonctionnait dans mon projet jusqu'à ce que j'ajoute un contrôle écrit en pascal. Depuis
les syntaxes  (float)1500 ou (double)325 ne semblent plus fonctionner...

ex:
"  int res;
   int i;
   float d;

   i = 52;
   res = i;

   d = (float)i/(float)5 + (float)0.5;
   d = (int)(d*(float)5);
"
me renvoie un message signalant une opération en virgule flottante incorrecte...
Le pire c'est que ça passe à la compil et plante à l'exécution
Pourquoi ?

PS: 
100.0 c'est bien un double ? 100.f  c'est bien un flottant  ?
je travaille avec c++ builder. Est-ce dù à une option de l'environnement ?

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
11 déc. 2008 à 14:18
Salut,

A mon avis, l'erreur vient d'ailleurs...

Tu travailles en invite de commande sans débogueur ? Si oui, met des printf ou (mieux) récupère un débogueur. Va savoir, peut être que CodeGear propose encore de quoi faire du C++ gratuitement.

Sinon tu peux passer par div de stdlib.h :
<hr size="2" width="100%" />#include "stdio.h"
#include "stdlib.h"

int arrondi_magnet(int i)
{
  return (int)((float)i / 5.f + 0.5f) * 5;
}

int arrondi_magnet2(int i)
{
  div_t divresult;
  divresult = div(i, 5);
  if (divresult.rem >= 3)
    divresult.quot++;
  return divresult.quot * 5;
}

int main()
{
  int test;

  test = 33;

  printf("%i\n", arrondi_magnet(test));
  printf("%i\n", arrondi_magnet2(test));
  return 0;
}
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 déc. 2008 à 18:27
syntaxe correcte:
d = ((float) i) / 0.5f + 0.5f;
d = (int) (d * 0.5f);


la division pas 0.5 étant absurde et surtout couteuse, on écrira:
d = (float) (i + i);
d += 0.5f;

ciao...
BruNews, MVP VC++
0
steph12358 Messages postés 149 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 10 décembre 2009 1
11 déc. 2008 à 09:36
Salut BruNews

En fait j'essaye de faire une fonction d'arrondi à 5 pour faire une "grille
magnétique" dans une appli

j'ai essayé:

     //quelque soit la valeur de i de toute façon ça donne la même
     chose en débogage (en débogage avec 33)

int arrondi_magnet(int i)
{
float d;
int resultat;
      d = (((float)i)/5.0f) + 0.5f;
      d = (int)d;
      d = d * 5.0f;
      resultat = (int)d;
     return resultat;
}
"opération en virgule flottante incorrecte"

je caste le int en float, je le divise par un float, j'y ajoute une float récupère
le résultat dans un float...et ça plante!

Je sais, je sais... les constantes littérales c'est pas beau...
mais quand même j'aimerais savoir ce qui cloche

Cordialement
0
steph12358 Messages postés 149 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 10 décembre 2009 1
12 déc. 2008 à 08:49
Salut rt15

je pense effectivement que c'est une erreur due à une option de mon environnement de dévpt car on frole le paranormal.

Je dois trainer ce problème depuis longtemps sans le savoir.
Jusqu'à présent je n'avais travaillé qu'avec des entiers (int, long).

Je vais essayer ta solution.

Merci beaucoup
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 déc. 2008 à 14:06
Je serais surpris qu'il s'agisse d'un problème de configuration de l'environnement, bien que l'on puisse effectivement configurer la façon dont sont traitées les opérations à virgule flottantes.

S'il y a une erreur de calcul, il y a une erreur de calcul... Le fait de gérer l'erreur ou pas c'est un autre problème.

Si tu mets :


Set8087CW(0x133f);

Au lancement de ton prog, tu devrais ne plus avoir d'erreurs dûes à la FPU. En cas d'erreur de calcul (Division par zéro...) la FPU te renverra des valeurs particulière correpondant à l'infini, pas un nombre (NaN)... Mais tu n'auras plus de messages d'erreur.

Set8087CW affecte le mot de contrôle de la FPU à l'aide de l'instruction fldcw.
0
Rejoignez-nous