Classe implémentant un réel Haute Précision. Plus de détails...
#include <arcane/utils/HPReal.h>
Fonctions membres publiques | |
HPReal () | |
Constructeur par défaut sans initialisation. | |
HPReal (double avalue) | |
Créé un réel HP avec la valeur value et la correction correction. | |
HPReal (double avalue, double acorrection) | |
Créé un réel HP avec la valeur value et la correction correction. | |
Real | value () const |
Valeur interne. En général, il faut utiliser toReal() | |
Real | correction () const |
Correction interne. | |
void | operator+= (Real v) |
Ajoute un Real en conservant l'erreur. | |
void | operator+= (HPReal v) |
Ajoute un HPReal v en conservant l'erreur (réduction) | |
Real | toReal () const |
Converti l'instance en un Real. | |
HPReal | reduce (HPReal b) const |
Ajoute un HPReal v en conservant l'erreur (réduction) | |
void | operator*= (Real v) |
multiplie un Real en conservant l'erreur. | |
void | operator*= (HPReal v) |
multiplie un HPReal v en conservant l'erreur (réduction) | |
void | operator/= (Real v) |
multiplie un Real en conservant l'erreur. | |
void | operator/= (HPReal v) |
multiplie un HPReal v en conservant l'erreur (réduction) | |
std::istream & | assign (std::istream &i) |
Lit un HPReal sur le flot i. Le couple est lu sous la forme de deux valeurs de type Real. | |
std::ostream & | print (std::ostream &o) const |
Ecrit l'instance sur le flot o lisible par un assign() | |
std::ostream & | printPretty (std::ostream &o) const |
Ecrit l'instance sur le flot o sous la forme (x,y) | |
Fonctions membres publiques statiques | |
static HPReal | zero () |
Valeur zéro. | |
static HPReal | accumulate (Real a, HPReal b) |
static HPReal | reduce (HPReal a, HPReal b) |
static HPReal | product (HPReal a, HPReal b) |
static HPReal | product (Real a, HPReal b) |
static HPReal | div2 (HPReal a, HPReal b) |
static HPReal | div2 (Real b, HPReal a) |
Fonctions membres privées statiques | |
static HPReal | _doTwoSum (Real a, Real b) |
static HPReal | _doQuickTwoSum (Real a1, Real b1) |
static HPReal | _doTwoProducts (Real a, Real b) |
static HPReal | SPLIT (Real a) |
Attributs privés | |
Real | m_value |
Real | m_correction |
Classe implémentant un réel Haute Précision.
Cette classe est basée sur l'article:
Obtaining identical results with double precision global accuracy on different numbers of processors in parallel particle Monte Carlo simulations (Mathew A. Cleveland, Thomas A. Brunner, Nicholas A. Gentile, jeffrey A. Keasler) in Journal Of Computational Physics 251 (2013) 223-236.
Les opérations possibles sont l'accumulation (operator+=()), la réduction (reduce()) et la conversion vers un Real (toReal()). Il n'est pas possible de faire d'autres opérations telles que les divisions où les multiplications.
Pour se conformer au type 'Real' classique, le constructeur par défaut de cette classe ne fait aucune initialisation.
La méthode toReal() permet de convertir le HPReal en un Réel classique. Le fonctionnement typique est le suivant:
Evolution 12/18/18 :
Correction erreur de l'algorithme de base de static HPReal _doTwoSum(Real a, Real b)
Real sum_error = (a - (value-approx_b) + (b-approx_b));
est devenu (en accord avec la Ref 1)
Real sum_error = (a - (value-approx_b)) + (b-approx_b);
Correction erreur de static HPReal _doQuickTwoSum(Real a,Real b)
il faut tester si a>b et inverser a et b si cela n'est pas le cas (voir Ref 2,3,4)
Modification de Accumulate et de Reduce, Accumulate et de Reduce etaient basées sur la Ref 1 qui a pour base la Ref 4
Ajout des produits comme proposés dans la ref 2 (en accord avec la Ref 5) de HPReal*Real ou HPreal*HPreal (on prend la meme valeur de p pour la fonction SPLIT() que la Ref 2,4,5)
Attention le produit Real*Real de la Ref 4 (p.4) n'est pas ecrit de la meme facon que celui de la Ref 2 (p.2), 5 (p.3)
+++++++++++++++++
Globalement les algo de reductions ou les erreurs sont cumulées uniquement avec une addition sont moins bons
L'algo 6 de DD_TWOSUM [Ref 2] est aussi moins bon:
ou
Des tests sur des millions de valeurs positives comme négatives ont été effectués pour l'additon,la multiplication et la division dans des ordres différents.
Je n'ai pas réussi à faire apparaitre dans un cas simple une différence de resultat entre l'algo proposée pour la somme et celui code initialement.
Ref 1 Obtaining identical results with double precision global accuracy on different numbers of processors in parallel particle Monte Carlo simulations (Mathew A. Cleveland, Thomas A. Brunner, Nicholas A. Gentile, jeffrey A. Keasler) in Journal Of Computational Physics 251 (2013) 223-236.
Ref 2 Automatic Source-to-Source error compensation of floating-point programs L.Thevenoux, Ph langlois, Mathieu Martel HAL Id: hal-01158399
Ref 3 Numerical validation of compensated summation algorithms withs stochastic arithmetic S.Gaillat, F.Jézéquel , R.Picot Published in Electronic Notes in Theoritical Computer Science
ou
Numerical validation of compensated algorithms withs stochastic arithmetic S.Gaillat, F.Jézéquel , R.Picot Published in Applied Mathematics and Computation 329 (2018)339-363
Ref 4 Library for Double-Double and Quad-Double Arithmetic December 29, 2007 Yozo Hida Xiaoye Li D.H.Bailey
Ref 5 Accurate floating point Product and exponentation S.Graillat HAL ID: hal-00164607
Ref 6 A floating point technique for extending the avaible precision T.J.Dekker Numeri.Math 18, 224-242 (1971)
|
inline |
|
inlineexplicit |
std::istream & Arcane::HPReal::assign | ( | std::istream & | i | ) |
|
inline |
|
inline |
|
inline |
|
inline |
std::ostream & Arcane::HPReal::print | ( | std::ostream & | o | ) | const |
std::ostream & Arcane::HPReal::printPretty | ( | std::ostream & | o | ) | const |
|
inline |
|
inline |