Classe implémentant un nombre réel de haute précision. Plus de détails...
Fonctions membres publiques | |
| HPReal () | |
| Constructeur par défaut sans initialisation. | |
| HPReal (double avalue) | |
| Crée un HP real avec la valeur value et la correction correction. | |
| HPReal (double avalue, double acorrection) | |
| Crée un HP real avec la valeur value et la correction correction. | |
| Real | value () const |
| Valeur interne. Généralement, vous devez utiliser toReal(). | |
| Real | correction () const |
| Correction interne. | |
| void | operator+= (Real v) |
| Ajoute un Real tout en préservant l'erreur. | |
| void | operator+= (HPReal v) |
| Ajoute un HPReal v tout en préservant l'erreur (réduction). | |
| Real | toReal () const |
| Convertit l'instance en un Real. | |
| HPReal | reduce (HPReal b) const |
| Ajoute un HPReal v tout en préservant l'erreur (réduction). | |
| void | operator*= (Real v) |
| Multiplie un Real tout en préservant l'erreur. | |
| void | operator*= (HPReal v) |
| Multiplie un HPReal v tout en préservant l'erreur (réduction). | |
| void | operator/= (Real v) |
| Divise un Real tout en préservant l'erreur. | |
| void | operator/= (HPReal v) |
| Divise un HPReal v tout en préservant l'erreur (réduction). | |
| std::istream & | assign (std::istream &i) |
| Lit un HPReal à partir du flux i. La paire est lue sous la forme de deux valeurs de type Real. | |
| std::ostream & | print (std::ostream &o) const |
| Écrit l'instance dans le flux o lisible par assign(). | |
| std::ostream & | printPretty (std::ostream &o) const |
| Écrit l'instance dans le flux 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 nombre réel de 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 (opérateur+=()), la réduction (reduce()) et la conversion en Real (toReal()). D'autres opérations telles que la division ou la multiplication ne sont pas possibles.
Pour être conforme au type 'Real' classique, le constructeur par défaut de cette classe n'effectue aucune initialisation.
La méthode toReal() permet de convertir le HPReal en un Real classique. L'utilisation typique est la suivante :
Évolution 12/18/18 :
Correction de l'erreur de l'algorithme de base pour HPReal statique _doTwoSum(Real a, Real b)
Real sum_error = (a - (value-approx_b) + (b-approx_b));
est devenu (conformément à la Ref 1)
Real sum_error = (a - (value-approx_b)) + (b-approx_b);
Correction de l'erreur dans HPReal statique _doQuickTwoSum(Real a,Real b)
il est nécessaire de tester si a>b et d'inverser a et b si ce n'est pas le cas (voir Ref 2, 3, 4)
Modification de Accumulate et Reduce, Accumulate et Reduce étaient basés sur la Ref 1, qui est basée sur la Ref 4
Ajout des produits tels que proposés dans la Ref 2 (conformément à la Ref 5) de HPReal*Real ou HPReal*HPReal (nous prenons la même valeur de p pour la fonction SPLIT() que dans la Ref 2, 4, 5)
Notez que le produit Real*Real dans la Ref 4 (p.4) n'est pas écrit de la même manière que ceux dans la Ref 2 (p.2) ou 5 (p.3)
+++++++++++++++++
Globalement, les algorithmes de réduction ou les erreurs accumulées uniquement par addition sont moins bons
L'algorithme 6 de DD_TWOSUM [Ref 2] est également moins bon :
ou
Des tests sur des millions de valeurs positives ainsi que négatives ont été effectués pour l'addition, la multiplication et la division dans différents ordres.
Je n'ai pas réussi à montrer de différence de résultats dans un cas simple entre l'algorithme proposé pour la somme et celui initialement codé.
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)
Définition à la ligne 158 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inline |
Constructeur par défaut sans initialisation.
Définition à la ligne 165 du fichier arccore/src/base/arccore/base/HPReal.h.
Référencé par operator*=(), operator+=(), operator/=(), reduce(), et zero().
|
inlineexplicit |
Crée un HP real avec la valeur value et la correction correction.
Définition à la ligne 168 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inline |
Crée un HP real avec la valeur value et la correction correction.
Définition à la ligne 174 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 316 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 329 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 308 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 250 du fichier arccore/src/base/arccore/base/HPReal.h.
| std::istream & Arcane::HPReal::assign | ( | std::istream & | i | ) |
Lit un HPReal à partir du flux i. La paire est lue sous la forme de deux valeurs de type Real.
Définition à la ligne 26 du fichier arcane/src/arcane/utils/HPReal.cc.
|
inline |
Correction interne.
Définition à la ligne 183 du fichier arccore/src/base/arccore/base/HPReal.h.
Référencé par toReal().
Définition à la ligne 284 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 292 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inline |
Multiplie un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 216 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal().
|
inline |
Multiplie un Real tout en préservant l'erreur.
Définition à la ligne 210 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inline |
Ajoute un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 192 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal(), et reduce().
|
inline |
Ajoute un Real tout en préservant l'erreur.
Définition à la ligne 186 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inline |
Divise un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 228 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal().
|
inline |
Divise un Real tout en préservant l'erreur.
Définition à la ligne 222 du fichier arccore/src/base/arccore/base/HPReal.h.
| std::ostream & Arcane::HPReal::print | ( | std::ostream & | o | ) | const |
Écrit l'instance dans le flux o lisible par assign().
Définition à la ligne 36 du fichier arcane/src/arcane/utils/HPReal.cc.
| std::ostream & Arcane::HPReal::printPretty | ( | std::ostream & | o | ) | const |
Écrit l'instance dans le flux o sous la forme (x,y).
Définition à la ligne 46 du fichier arcane/src/arcane/utils/HPReal.cc.
Définition à la ligne 266 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 273 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 258 du fichier arccore/src/base/arccore/base/HPReal.h.
Ajoute un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 204 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal(), et reduce().
Référencé par operator+=(), et reduce().
Définition à la ligne 337 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inline |
Convertit l'instance en un Real.
Définition à la ligne 198 du fichier arccore/src/base/arccore/base/HPReal.h.
Références correction(), et value().
|
inline |
Valeur interne. Généralement, vous devez utiliser toReal().
Définition à la ligne 180 du fichier arccore/src/base/arccore/base/HPReal.h.
Référencé par toReal().
|
inlinestatic |
Valeur zéro.
Définition à la ligne 246 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal().
|
private |
Définition à la ligne 303 du fichier arccore/src/base/arccore/base/HPReal.h.
|
private |
Définition à la ligne 302 du fichier arccore/src/base/arccore/base/HPReal.h.