jcecchi
Messages postés117Date d'inscriptionsamedi 12 janvier 2002StatutMembreDernière intervention14 janvier 20033 23 sept. 2002 à 11:32
salut,
en fait si tu augmentes la precision de ton printf, tu verras que dblTampon ne vaut pas 50.000 mais 49.999999999999822. (essaye avec printf("%.15f", dblTampon).
Ensuite pourquoi tu as une fois 50.000 et une fois 49, c'est tout simple :
-printf lui arrondi a la precision demande (par defaut 6 chiffre apres la virgule) ce qui te donne 49.999999. Le septieme chiffre etant 9 il rajoute 0.0000001 pour arrondir ce qui te donne 50.000000.
-Lorsque tu ecris TriTime[i] = dblTampon la il n'y a pas d'arrondi, ton programme supprime purement et simplement tout ce qui est apres la virgule, tu obtiens donc TriTime[i] = 49.
brozman
Messages postés12Date d'inscriptionmardi 16 avril 2002StatutMembreDernière intervention21 juillet 2006 20 sept. 2002 à 07:33
Salut,
Je comprends rien a ton code mais a mon avis tu te fais des noeuds dans les types de variables, par exemple dans :
ValueTempo = (double)Temps1 * nMesure/nbre;
Si nMesure ou nbre sont de type entier, ta variable ValueTempo sera calcule comme un entier,
il faut que tu fasses :
ValueTempo = double(Temps1 )* double(nMesure/nbre);
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 20 sept. 2002 à 17:26
Je sais que je suis con mais là c'est Xfile :
Voici un exemple exploitable qui met le pb en évidence :
faites copier/coller , Compilez le en VC++ ou autre en mettant les bonnes biblio... j'y comprend rien. pour moi int(50.0000) ca fait 50 et pas 49 ou alors c'est ce qu'on appelle les maths très modernes. Je dois faire une connerie. J'ai fait en sorte de convertir comme vous me l'avez dit mais ca change apparament rien.
// tempo2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
typedef unsigned char byte;
void Calcul(long Temps1,long nMesure,long BaseTemps2,int nbre)
{
byte TriTime[6]={0,0,0,0,0,0};
int i, intTempo;
double dblTempo,ValueTempo;
double dblTampon;
ValueTempo = double(Temps1) * double(nMesure/nbre);
for(i=(byte)BaseTemps2;i<6;i++)
{
switch(i)
{
case 0: intTempo = 1000; break;
case 1: intTempo = 1000; break;
case 2: intTempo = 60; break;
case 3: intTempo = 60; break;
case 4: intTempo = 24; break;
case 5: intTempo = 24; break;
}
cmarsc
Messages postés455Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention18 décembre 2003 21 sept. 2002 à 08:30
salut,
Lorsque tu as des arguments de types LONG DOUBLE que tu veux convertir
en INT tu perds de la précision à chaque conversion aussi
il serait préférable d'employer des long double(s) puis convertir à la fin en INT
parce que dans ton exemple tu divises un DOUBLE par un INT (nbre)
ValueTempo = double(Temps1) * double(nMesure/nbre)
bien que tu ai converti en DOUBLE cela pose des problèmes par la suite
puis conversion de DOUBLE en byte
TriTime[i] = (byte)dblTampon;
for(i=(byte)BaseTemps2;i<6;i++)
si on abuse des conversions de type (cast) on s'expose à des chiffres inexacts parfois (faire transiter des valeurs par des variables temporaires peuvent également contribuer aux erreurs)
pourquoi l'un marche et pas l'autre ?
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 21 sept. 2002 à 10:14
Bon on vas dire que je suis très très con. J'ai beau tout remanier j'arrive toujour pas a comprendre ni pourquoi ni comment obtenir un résultat correct. Je suppose que vous avez fait des essais avant d'avancer vos commentaires ? Y'aurait-il une âme charitable qui veuille bien me donner une solution qui marche ?????
Merci d'avance. Car là je me suis acheter un gros couteau et je suis au bord du suicide ... j'ai déjà tué le chien du voisin ... et bouffer les canaris du 4eme...
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 21 sept. 2002 à 10:19
Bon on vas dire que je suis très très con. J'ai beau tout remanier j'arrive toujour pas a comprendre ni pourquoi ni comment obtenir un résultat correct. Je suppose que vous avez fait des essais avant d'avancer vos commentaires ? Y'aurait-il une âme charitable qui veuille bien me donner une solution qui marche ?????
Merci d'avance. Car là je me suis acheter un gros couteau et je suis au bord du suicide ... j'ai déjà tué le chien du voisin ... et bouffer les canaris du 4eme...
Voici mon nouveau code qui ne marche toujour pas...
// tempo2.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
typedef unsigned char byte;
typedef unsigned long ULONG;
BarthOlivier
Messages postés132Date d'inscriptionmercredi 6 mars 2002StatutMembreDernière intervention27 novembre 20121 24 sept. 2002 à 18:59
Tu veux donc dire que 50 vaut en fait 49.999999 ? et pourquoi dans ces cas là 60 ne vaut pas 59.99999 ?
Tu fait comment dans ces cas là pour faire des calculs précis avec cette imprecision ? (ce n'est pas mon cas mais pour certain ca doit plutot etre non négligeable non .... ?)
jcecchi
Messages postés117Date d'inscriptionsamedi 12 janvier 2002StatutMembreDernière intervention14 janvier 20033 24 sept. 2002 à 19:17
dans ton cas 60 vaut 60.0000000000057, tu perds de la precision des le premier calcul :
ValueTempo /= intTempo;
Si tu veux faire du calcul precis, va falloir chercher des librairies specialisees (sinon je ne me trompe pas BOOST www.boost.org peux faire ca en C++).