Historique des modifications - Message

Message #2783

Sujet: Bizzareries avec des f64 (donc les doubles)


Type Date Auteur Contenu
Dernière modification 31-07-2007 16:44:00 Jerry Kan

Nebu Ecris:

J = J+((dayspeed/86400.0)/1000.0)*dTime;

ton probleme fait a mon avis référence a des soucis de méthode numérique,
comme tu le sais sans doute, en informatique on ne peut pas se permettre d'ecrire les formules mathématiques directement, parce que lorsqu'on joue avec des flottant, l'ordinateur est incapable de faire mieux que des approximations
a mon avis avec de si gros chiffres, tu fait un truc du style
J = J + Di
avec Di tellement proche de zero que ca n'a pas de sens pour la machine

essayons de simplifier la formule parce que si tu l'écrit, chaque grosse opération de calcul va aggrandir la marge d'erreur

J = J + ( ( dayspeed / (86400.0*1000.0) )*dTime;

cette formule est mauvaise parce que la premiere division va générer une grosse marge d'erreur, et cette erreur va etre multipliée par dTime, pour ensuite faire une nouvelle grosse division (avec dayspeed) qui va faire exploser la marge d'erreur

J = J + dayspeed / ( dTime / 86400.0*1000.0 )

J= J + (dayspeed * dTime ) / ( 86400000 )

voila qui est deja plus propre et qui perdra moins en précision lors du calcul
(j'espere que je me goure pas dans la formule, bon au moins c'est ca l'idée)

maintenant, tu doit trouver comment pouvoir diviser par moins que 86400000, parce que ca commence a faire un tres gros chiffre, meme pour un pc, pour moi une soluce ce serai :

J= J + ( (dayspeed * dTime ) / ( 864 ) ) * 10 ^ -5

la ton pc a deja plus de chance de s'en sortir
mais note que c'est quand meme idiot de diviser par 10^ 5, tu va perdre enormement en précision, autant stocker ton truc dans deux variables J et H

quand H atteint un certain seuil, tu incrémente J,
voila j'espere que ca va t'aider et que je suis pas hors sujet

tu peux donner un ordre de grandeur pour les valeurs de tes varibles dTimes et dayspeed ?
si tu m'explique ce tu veux calculer, je veux bien m'y pencher dessus

Nebu Ecris:

La plus grosse bizzarerie se situe dans le fait que si je decompose mon calcul ainsi
f64 temp = ((dayspeed/86400.0)/1000.0)*dTime;
f64 temp2 = temp+J;
printf("", temp+J);
J = temp2;
Et bien J prend la bonne valeur.
Sans le printf...rien n'y fait, avec le printf...ca marche
Toute autre tentative a lamentablement échouée, et si j'insère la moindre ligne de code entre l'affectation temp2 et le printf, ca ne fonctionne plus...

ca sent le débordement non maitrisé non ?

Nebu Ecris:

Autre chose, si je desactive l'option /arch:SSE2 du compilo, ce code ne fonctionne plus.

ne fonctionne plus ? ou ne compile plus ?
Création du message 31-07-2007 16:42:39 Jerry Kan

Nebu Ecris:

J = J+((dayspeed/86400.0)/1000.0)*dTime;

ton probleme fait a mon avis référence a des soucis de méthode numérique,
comme tu le sais sans doute, en informatique on ne peut pas se permettre d'ecrire les formules mathématiques directement, parce que lorsqu'on joue avec des flottant, l'ordinateur est incapable de faire mieux que des approximations
a mon avis avec de si gros chiffres, tu fait un truc du style
J = J + Di
avec Di tellement proche de zero que ca n'a pas de sens pour la machine

essayons de simplifier la formule parce que si tu l'écrit, chaque grosse opération de calcul va aggrandir la marge d'erreur

J = J + ( ( dayspeed / (86400.0*1000.0) )*dTime;

cette formule est mauvaise parce que la premiere division va générer une grosse marge d'erreur, et cette erreur va etre multipliée par dTime, pour ensuite faire une nouvelle grosse division (avec dayspeed) qui va faire exploser la marge d'erreur

J = J + dayspeed / ( dTime / 86400.0*1000.0 )

J= J + (dayspeed * dTime ) / ( 86400000 )

voila qui est deja plus propre et qui perdra moins en précision lors du calcul
(j'espere que je me goure pas dans la formule, bon au moins c'est ca l'idée)

maintenant, tu doit trouver comment pouvoir diviser par moins que 86400000, parce que ca commence a faire un tres gros chiffre, meme pour un pc, pour moi une soluce ce serai :

J= J + ( (dayspeed * dTime ) / ( 864 ) ) * 10 ^ -5

la ton pc a deja plus de chance de s'en sortir
mais note que c'est quand meme idiot de diviser par 10^ 5, tu va perdre enormement en précision, autant stocker ton truc dans deux variables J et H

quand H atteint un certain seuil, tu incrémente J,
voila j'espere que ca va t'aider et que je suis pas hors sujet

tu peux donner un ordre de grandeur pour les valeurs de tes varibles dTimes et dayspeed ?
si tu m'explique ce tu veux calculer, je veux bien m'y pencher dessus

Nebu Ecris:

La plus grosse bizzarerie se situe dans le fait que si je decompose mon calcul ainsi
f64 temp = ((dayspeed/86400.0)/1000.0)*dTime;
f64 temp2 = temp+J;
printf("", temp+J);
J = temp2;
Et bien J prend la bonne valeur.
Sans le printf...rien n'y fait, avec le printf...ca marche
Toute autre tentative a lamentablement échouée, et si j'insère la moindre ligne de code entre l'affectation temp2 et le printf, ca ne fonctionne plus...

ca sent le débordement non maitrisé non ?

Nebu Ecris:

Autre chose, si je desactive l'option /arch:SSE2 du compilo, ce code ne fonctionne plus.

ne fonctionne plus ? ou ne compile plus ?

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
121 invités en ligne
membre en ligne: -
RSS Feed