2009-08-06 9 views
2

Voici un problème qui m'a complètement dérouté eu depuis quelques heures ...Mathématiques à virgule flottante incorrecte?

Je dur une équation codée dans mon programme:

double s2; 

s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 

Chaque fois que je lance le programme, l'ordinateur crache 3 comme la réponse, mais en faisant le calcul à la main, je reçois 4. Encore plus loin, après avoir entré l'équation dans Matlab, j'obtiens aussi la réponse 4. Que se passe-t-il ici?

La seule chose que je peux penser de ce qui ne va pas ici serait d'arrondir l'erreur. Cependant, avec un maximum de 5 erreurs d'arrondi, couplé avec l'utilisation de maths à double précision, mon erreur maximale serait très très faible, donc je doute que ce soit le problème.

Quelqu'un peut-il offrir des solutions?

Merci à l'avance,

-Faken

Répondre

17

Vous n'êtes pas en train de faire des maths en virgule flottante, vous faites des maths entiers, ce qui va niveler les résultats des divisions. En C++, 5/4 = 1, pas 1.25 - parce que 5 et 4 sont tous deux des entiers, le résultat sera un entier, et donc la partie fractionnaire du résultat est rejetée.

D'autre part, 5,0/4,0 sera égal à env. 1.25 car au moins l'un de 5.0 et 4.0 est un nombre à virgule flottante donc le résultat sera également en virgule flottante.

+0

Hmm, merci pour votre aide. J'aurais dû venir ici plus tôt, eh bien. – Faken

+2

1,25 est représentable en base 2, tout comme 4.0 et 5.0. Cela devrait être exact. – dmckee

+2

Comme c'était un exemple arbitraire dmckee, j'ai décidé d'aller avec la déclaration plus sûre. :) – Amber

7

Vous confondez la division entière avec la division à virgule flottante. 3 est la bonne réponse avec une division entière. Vous obtiendrez 4 si vous convertissez ces valeurs en nombres à virgule flottante.

3

Une partie de ceci est évaluée en utilisant l'arithmétique entière. Essayez d'ajouter une décimale à vos chiffres, par ex. 6.0 au lieu de 6 pour indiquer au compilateur que vous ne voulez pas d'arithmétique entière.

+0

apposer un 'f' à eux devrait faire l'affaire aussi bien ... – Shog9

+1

En fait, ce serait un' .f', pas seulement 'f'. – GManNickG

3
s2 = -(0*13)/84+6/42-0/84+24/12+(6*13)/42; 

cède 3

s2 = -(0.*13.)/84.+6./42.-0./84.+24./12.+(6.*13.)/42.; 

fait ce que vous attendez.

Questions connexes