Opération flottante incorrecte ? [Résolu]

steph12358 150 Messages postés jeudi 22 avril 2004Date d'inscription 10 décembre 2009 Dernière intervention - 10 déc. 2008 à 16:58 - Dernière réponse : cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention
- 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 ?
Afficher la suite 

5 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 11 déc. 2008 à 14:18
+3
Utile
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;
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 10 déc. 2008 à 18:27
0
Utile
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++
Commenter la réponse de BruNews
steph12358 150 Messages postés jeudi 22 avril 2004Date d'inscription 10 décembre 2009 Dernière intervention - 11 déc. 2008 à 09:36
0
Utile
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
Commenter la réponse de steph12358
steph12358 150 Messages postés jeudi 22 avril 2004Date d'inscription 10 décembre 2009 Dernière intervention - 12 déc. 2008 à 08:49
0
Utile
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
Commenter la réponse de steph12358
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 12 déc. 2008 à 14:06
0
Utile
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.
Commenter la réponse de cs_rt15

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.