begin process at 2012 05 30 00:44:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

opération flottante incorrecte ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

opération flottante incorrecte ?

mercredi 10 décembre 2008 à 16:58:52 | opération flottante incorrecte ?

steph12358

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 ?


mercredi 10 décembre 2008 à 18:27:38 | Re : opération flottante incorrecte ?

BruNews

Administrateur CodeS-SourceS

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++

jeudi 11 décembre 2008 à 09:36:06 | Re : opération flottante incorrecte ?

steph12358

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


jeudi 11 décembre 2008 à 14:18:43 | Re : opération flottante incorrecte ?

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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 :

#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;
}


vendredi 12 décembre 2008 à 08:49:31 | Re : opération flottante incorrecte ?

steph12358

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

vendredi 12 décembre 2008 à 14:06:14 | Re : opération flottante incorrecte ?

rt15

Membre Club Administrateur CodeS-SourceS
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.


Cette discussion est classée dans : int, float, opération, flottante, incorrecte


Répondre à ce message

Sujets en rapport avec ce message

équation et tableaux [ par cabarrus ] je ne trouve pas l'erreur dans mon programme?#include#includeint deltanul(int);float deltainf(float);float deltasup(float);void main(void){float a,b,c dépassement capacité d'un float et int [ par golum ] result=scanf("%f",&coef); if (result !=0 && coef !=0)Voila si j'entre un nombre délirant style 9999999999999999999999999999999999999999999999999999999 arondir un float en int [ par guillaume21 ] je voudrai convertir un float en int (le cast tronque mais n'arrondi pas) sans utiliser la "bidouille" :inr i;float f;char car[6];sprintf(car,"%6.0f", Probl avec float et int [ par David2907 ] Après un calcul, comment faire pour afficher un resultat sans virgule ou un resultat avec virugule???Merci pb incrementation variable. [ par conan76 ] Voila j'ai passé l'après midi a chercher d'ou vient mon problème sans succès.je tente même de faire des affichages console avant et après incrémentati pourquoi ca marche pas :'( [ par xboxut ] salut j ai un probleme avec une fonction pour initialiser des particules,pouvez vous me dire pourquoi il ne marche pas et comment le faire marcher#inc comment tester un type de donné en C++ [ par Armandopoulos ] Salut !!en VC++Je voudrai bien savoir comment tester un type de donné (par ex. int , float , long , char) entré par l utilisateur au clavier.J ai pens C++ -> Java [ par christouilhe ] Bonjour à vous tous.J'ai une question à vous poser ...Il se trouve que je dois retranscrire un programme C++ en Java, mais il y a une fonction que je connection BDD en C [ par naru ] Bjr J'ai un code dans lequel je dois modifier le chemin de la bdd, et rentrer les paramètres de l'utilisteur (login/pass). Seulement, je ne vois pas Problème d'entrée (cin >>) dans un tableau de float [ par Oeil_de_taupe ] Hello tout le monde,désolé de vous importuné. Mais j'ai fait une toute petite source pour apprendre à allouer de la mémoire pour une variable puis de


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,276 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales