Classe implémentant un nombre réel de haute précision. Plus de détails...
#include <arccore/base/HPReal.h>
Fonctions membres publiques | |
| constexpr | HPReal () |
| Constructeur par défaut à 0.0. | |
| constexpr | HPReal (NoInitTag) |
| Constructeur SANS initialisation. | |
| constexpr | HPReal (double avalue) |
| Crée un HP real avec la valeur value et la correction correction. | |
| constexpr | HPReal (double avalue, double acorrection) |
| Crée un HP real avec la valeur value et la correction correction. | |
| constexpr Real | value () const |
| Valeur interne. Généralement, vous devez utiliser toReal(). | |
| constexpr Real | correction () const |
| Correction interne. | |
| constexpr void | operator+= (Real v) |
| Ajoute un Real tout en préservant l'erreur. | |
| constexpr void | operator+= (HPReal v) |
| Ajoute un HPReal v tout en préservant l'erreur (réduction). | |
| constexpr Real | toReal () const |
| Convertit l'instance en un Real. | |
| constexpr HPReal | reduce (HPReal b) const |
| Ajoute un HPReal v tout en préservant l'erreur (réduction). | |
| constexpr void | operator*= (Real v) |
| Multiplie un Real tout en préservant l'erreur. | |
| constexpr void | operator*= (HPReal v) |
| Multiplie un HPReal v tout en préservant l'erreur (réduction). | |
| constexpr void | operator/= (Real v) |
| Divise un Real tout en préservant l'erreur. | |
| constexpr 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 constexpr HPReal | zero () |
| Valeur zéro. | |
| static constexpr HPReal | accumulate (Real a, HPReal b) |
| static constexpr HPReal | reduce (HPReal a, HPReal b) |
| static constexpr HPReal | product (HPReal a, HPReal b) |
| static constexpr HPReal | product (Real a, HPReal b) |
| static constexpr HPReal | div2 (HPReal a, HPReal b) |
| static constexpr HPReal | div2 (Real b, HPReal a) |
Amis | |
| constexpr bool | operator< (const HPReal &a, const HPReal &b) |
| constexpr bool | operator> (const HPReal &a, const HPReal &b) |
| constexpr bool | operator== (const HPReal &a, const HPReal &b) |
| constexpr bool | operator!= (const HPReal &a, const HPReal &b) |
| constexpr HPReal | operator+ (const HPReal &a, const HPReal &b) |
| std::ostream & | operator<< (std::ostream &o, HPReal t) |
| std::istream & | operator>> (std::istream &i, HPReal &t) |
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 157 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineconstexpr |
Constructeur par défaut à 0.0.
Définition à la ligne 162 du fichier arccore/src/base/arccore/base/HPReal.h.
Référencé par operator*=(), operator+=(), operator/=(), reduce(), et zero().
|
inlineconstexpr |
Constructeur SANS initialisation.
Définition à la ligne 168 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineexplicitconstexpr |
Crée un HP real avec la valeur value et la correction correction.
Définition à la ligne 171 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineconstexpr |
Crée un HP real avec la valeur value et la correction correction.
Définition à la ligne 177 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 253 du fichier arccore/src/base/arccore/base/HPReal.h.
| std::istream & Arcane::HPReal::assign | ( | std::istream & | i | ) |
|
inlineconstexpr |
Correction interne.
Définition à la ligne 186 du fichier arccore/src/base/arccore/base/HPReal.h.
Référencé par toReal().
Définition à la ligne 287 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 295 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineconstexpr |
Multiplie un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 219 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal().
|
inlineconstexpr |
Multiplie un Real tout en préservant l'erreur.
Définition à la ligne 213 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineconstexpr |
Ajoute un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 195 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineconstexpr |
Ajoute un Real tout en préservant l'erreur.
Définition à la ligne 189 du fichier arccore/src/base/arccore/base/HPReal.h.
|
inlineconstexpr |
Divise un HPReal v tout en préservant l'erreur (réduction).
Définition à la ligne 231 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal().
|
inlineconstexpr |
Divise un Real tout en préservant l'erreur.
Définition à la ligne 225 du fichier arccore/src/base/arccore/base/HPReal.h.
| std::ostream & Arcane::HPReal::print | ( | std::ostream & | o | ) | const |
| std::ostream & Arcane::HPReal::printPretty | ( | std::ostream & | o | ) | const |
Définition à la ligne 269 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 276 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 261 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 207 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal(), et reduce().
Référencé par operator+=(), et reduce().
|
inlineconstexpr |
Convertit l'instance en un Real.
Définition à la ligne 201 du fichier arccore/src/base/arccore/base/HPReal.h.
Références correction(), et value().
|
inlineconstexpr |
Valeur interne. Généralement, vous devez utiliser toReal().
Définition à la ligne 183 du fichier arccore/src/base/arccore/base/HPReal.h.
Référencé par toReal().
|
inlinestaticconstexpr |
Valeur zéro.
Définition à la ligne 249 du fichier arccore/src/base/arccore/base/HPReal.h.
Références HPReal().
Définition à la ligne 317 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 321 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 305 du fichier arccore/src/base/arccore/base/HPReal.h.
|
friend |
Définition à la ligne 326 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 313 du fichier arccore/src/base/arccore/base/HPReal.h.
Définition à la ligne 309 du fichier arccore/src/base/arccore/base/HPReal.h.
|
friend |
Définition à la ligne 331 du fichier arccore/src/base/arccore/base/HPReal.h.