Je rencontre des problèmes avec l'arithmétique en virgule flottante qui n'est pas précise. J'essaie de calculer un score basé sur une formule pondérée où chaque variable d'entrée pèse environ 20 fois la suivante significative. Les entrées sont cependant des nombres réels, donc j'ai fini par utiliser un double pour stocker le résultat. Le code ci-dessous a le problème de perdre la différence entre E1 et E2.Comment contourner les problèmes d'arrondi en arithmétique à virgule flottante en C++?
Ce code est sensible aux performances, j'ai donc besoin de trouver une réponse efficace à ce problème. J'ai pensé à multiplier mes entrées par une centaine puis en utilisant un int (puisque cela serait assez précis je pense), mais je doute que ce soit la meilleure solution, d'où la question.
#include <iostream>
int main()
{
double score1, score2;
float a = 2.75 ;
float b = 5.25 ;
float c = 5.25 ;
float d = 2.75 ;
float E1 = 3 ;
float E2 = 6 ;
score1 = 20 * b - 1 * a + 0.05 * d /* - 0.0025 * c*/ + 0.0001 * E1 ;
score2 = 20 * b - 1 * a + 0.05 * d /* - 0.0025 * c*/ + 0.0001 * E2 ;
std::cout << score1 << std::endl;
std::cout << score2 << std::endl;
std::cin.get();
return 0;
}
//ouputs:
//102.388
//102.388
virgule flottante est limitée, à savoir qu'il ne peut pas représenter tous les nombres à virgule flottante, il y a beaucoup d'informations à ce sujet. – Drakosha
Vous pourriez utiliser le double. Il y a une utilité limitée à se limiter à flotter (à part l'espace de stockage qui, sauf si vous êtes dans des situations très spécifiques, ne devrait pas poser de problème). –