2016-11-02 1 views
0

J'écris du code C++/C qui utilise le type float pour faire des sommes. Je sais que je pourrais utiliser le double ou le long double mais en ce moment je suis en train de tester le flotteur. Je compare 2 implémentations, une seule thread où la somme entière est effectuée en une fois, et une autre implémentation threadée où des sommes partielles sont faites et ensuite additionnées à la fin lorsque tous les threads sont terminés. J'obtiens des différences de l'ordre de grandeur de 0,0001 même avec de très petites séries de tests (disons 20 nombres en tout, juste pour tester). Cela me surprend. Il est compréhensible d'avoir des différences mais je m'attendais à ce qu'elles soient plus petites. On peut suspecter un bug, cependant, les 2 implémentations donnent des résultats cohérents jusqu'à 3 décimales. Que pensez-vous, est-ce raisonnable, ou devrais-je chercher un bug? Quelle implémentation est la plus précise?Précision lors de la division de la somme en sommes partielles dans les applications filetées

+1

Il est difficile de dire sans avoir vu votre code source. – duDE

+0

Il est difficile de dire sans connaître l'ampleur des nombres sommés et la somme; Si tous les chiffres concernés sont dans les milliers, alors une différence de 0,0001 est le meilleur que vous pouvez espérer. – dmuir

+0

L'ordre de grandeur est 0,1 aucun des nombres n'est supérieur à environ 0,9 –

Répondre

2

La valeur totale pour les nombres flottants dépend de l'ordre de sommation. Vous avez probablement rencontré ce problème.

On pourrait fournir une meilleure précision (diminuer les erreurs numériques) si le processus de sommation commence à partir de valeurs d'amplitude plus petites.

Des approches plus avancées existent - Kahan summation etc

+0

Merci, très intresting, je n'étais pas au courant (honte ...). Je suppose que c'est difficile à réaliser à long terme, car cela me forcerait à toujours réordonner les données, mais cela vaut vraiment la peine d'être gardé à l'esprit. Merci encore. –

+0

@ tony_s_99 La sommation de Kahan ne nécessite pas de réorganisation – MBo

0

Je comprends que vous souhaitez utiliser flotteur pour vos tests. Mais pour confirmer que vous avez un bug ou non, je voudrais juste changer vos variables pour doubler le faire un essai et vérifier le résultat. Si le résultat est double, cela signifie que vous n'avez aucun bug. Si le résultat pour le double diffère aussi beaucoup, vous avez un bug.
Ensuite, après avoir fait un test, vous pouvez revenir à flotter. En passant, je pense qu'il est possible d'obtenir une telle différence, même avec seulement 20 numéros.

+0

Merci, je vais essayer. –