Opération flottante incorrecte ?

Résolu
Signaler
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
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 ?
A voir également:

5 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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;
}
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
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++
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009
1
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
Messages postés
149
Date d'inscription
jeudi 22 avril 2004
Statut
Membre
Dernière intervention
10 décembre 2009
1
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
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
14
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.