begin process at 2012 05 28 10:51:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

Cast de double en long et vice-versa : question pas si triviale


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

Cast de double en long et vice-versa : question pas si triviale

lundi 1 septembre 2008 à 09:46:11 | Cast de double en long et vice-versa : question pas si triviale

BenGourion73

Bonjour,

Ma question est très simple. je souhaite gérer des nombres entiers mais avec le type double. Le hic, c'est que C++ a une facheuse tendance à parfois transformer 14.0 en 13.9999999999999. Or typiquement, cela compromet un test d'égalité avec un long même si celui-ci est casté en double... Ma solution actuel est de fixer un static const ECARTLNG qui vaut 1.10-16
et quand je teste un double à l'égalité avec long casté en double, je teste l'écart.

En code, ça donne ça :

double Toto = 13.9999999999999999  /// Au départ, Toto a été initialisé à 14.0 mais à un moment donné 14.0 est 
                                                                /// devenu 13.9999999999999999
long Bob = 14;

if (Toto = = (double)Bob) /// la clairement, ça va donner false alors que je souhaite true !
   return true;
else 
   return false

//// Ma solution  
const static double ECARTLNG 1e-16
if (Toto-(double)Bob > ECARTLNG)
   return false;
else
   return true;

là a priori, le test d'égalité va fonctionner mais n'y a t'il pas moyen de faire autrement  ?



Série d'instructions sur Toto
lundi 1 septembre 2008 à 11:55:56 | Re : Cast de double en long et vice-versa : question pas si triviale

buno

Administrateur CodeS-SourceS
Réponse acceptée !
Hello,
Il n'est pas conseillé de faire des tests d'égalité sur les flottants, justement à cause des arrondis dues à la précision machine.
Généralement, on teste si la différence entre les 2 valeurs est inférieures (en valeur absolue) à un certain epsilon:

if (fabs(x2 - x1)<epsilon)
  // on peut dire que les 2 valeurs sont égales
else
  // on peut dire que les 2 valeurs sont différentes

Donc ta solution est tout à fait valable.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
vendredi 5 septembre 2008 à 15:42:24 | Re : Cast de double en long et vice-versa : question pas si triviale

Stanel

Pour obtenir en "double" des entiers, il faut que les resultats soit ajustes avec les
functions floor (pour les valeurs > 0) ou ceil ( < 0). Exemple:

double a,b;

a=123456e0;
b=floor(sqrt(a)+0.5);
 



Cette discussion est classée dans : long, question, toto, return, double


Répondre à ce message

Sujets en rapport avec ce message

long double et VC++ [ par omi ] J'ai un leger probleme avec visual C++ 7.0 .N'y a t'il pas un moyen de lui faire accepter les long double car il les prend pour des double normaux cad Probleme String -> double et long [ par lebalrog ] Salut tout le monde!J'ai un prob urgent a resoudre (tres urgent meme)!je fais :ficin >> ligne;long r=atol(ligne);double a=atof(ligne);avec ligne="0,12 Conversion de double en long [ par morphi ] Bonjour,Un petit probleme posé lors du codade ..J'ai un double dvaleur = 1.00000, je le convertie en long par casting :lvaleur=(long)dvaleuret je me r Fonction racine carre puissance et factoriel [ par Samuel0210 ] Bonjour Voila, g creer 3 fonctions pour calculer la racine carre, la puissance et le factoriel de different nombres elles se compile sans erreur mé e cosinus [ par anek971 ] Bonjour ,ben avt de demander de l'aide j'ai chercher sur le forum mais ya pas le programme en c.Et en faite c juste pr une verification car mon progra Convertion long en double [ par kelsey ] J 'aimerai connaître la méthode permettant de transformer un long en double.Merci ptit probl with:WriteFile() et ReadFile() [ par oudkaramla ] salut tout le monde,J'ai un petit problem avec WriteFile() et ReadFile().lors de la compilation j'ai les deux suivantes erreures:********************* Convertion d'un unsigned long Double en string [ par yves_r ] Bonjour, J'ai besoin de convertir le résultat d'un calcul en string (char *). Si j'utilise sprintf( s, "%Ld", mon_double), j'obtient une chaine returnourner un entier long long [ par dlamalice ] Bonjour,j'ai codé une dll toute bete et j'aimerai que cette dernière me retour un long long (64bit) statique.Mais quand je compile la ligne return ne Précision d'un double ? [ par chuckboy ] Quand je fais toto = 1.173222385022386;Alors toto prend comme valeurs 1.1732223850224.L'enfoiré me coupe des décimals ... comment faire pour tout gard


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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 : 0,671 sec (3)

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