Arcane  4.2.3.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
Référence de la classe Arcane::HPReal

Classe implémentant un nombre réel de haute précision. Plus de détails...

#include </__w/arcaneframework.github.io/arcaneframework.github.io/framework/arccore/src/base/arccore/base/HPReal.h>

Graphe de collaboration de Arcane::HPReal:

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)

Fonctions membres privées statiques

static constexpr HPReal _doTwoSum (Real a, Real b)
static constexpr HPReal _doQuickTwoSum (Real a1, Real b1)
static constexpr HPReal _doTwoProducts (Real a, Real b)
static constexpr HPReal SPLIT (Real a)

Attributs privés

Real m_value
Real m_correction

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)

Description détaillée

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 :

HPReal r(0.0);
for( Integer i=0, n=x.size(); i<n; ++i ){
// Accumule la valeur
r += x[i];
}
Real final_r = r.toReal();
Vue modifiable d'un tableau d'un type T.
constexpr Integer size() const noexcept
Retourne la taille du tableau.
constexpr HPReal()
Constructeur par défaut à 0.0.
Int32 Integer
Type représentant un entier.
double Real
Type représentant un réel.

É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 :

static HPReal accumulate(Real a,MYHPReal b)
{
HPReal x(_doTwoSum(a,b.value()));
Real d= x.correction() + b.correction();
HPReal u(_doQuickTwoSum(x.value(),d));
return _doQuickTwoSum(u.value(),u.correction());
}

ou

{
HPReal x(_doTwoSum(a.value(),b.value()));
HPReal y(_doTwoSum(a.correction(),b.correction()));
Real d= x.correction() + y.value();
HPReal u(_doQuickTwoSum(x.value(),d));
Real w=y.correction()+u.correction();
return _doQuickTwoSum(u.value(),w);
}
constexpr Real value() const
Valeur interne. Généralement, vous devez utiliser toReal().
constexpr Real correction() const
Correction interne.
constexpr HPReal reduce(HPReal b) const
Ajoute un HPReal v tout en préservant l'erreur (réduction).

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é.

Références

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.

Documentation des constructeurs et destructeur

◆ HPReal() [1/4]

Arcane::HPReal::HPReal ( )
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().

Voici le graphe des appelants de cette fonction :

◆ HPReal() [2/4]

Arcane::HPReal::HPReal ( NoInitTag )
inlineconstexpr

Constructeur SANS initialisation.

Définition à la ligne 168 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ HPReal() [3/4]

Arcane::HPReal::HPReal ( double avalue)
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.

◆ HPReal() [4/4]

Arcane::HPReal::HPReal ( double avalue,
double acorrection )
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.

Documentation des fonctions membres

◆ _doQuickTwoSum()

constexpr HPReal Arcane::HPReal::_doQuickTwoSum ( Real a1,
Real b1 )
inlinestaticconstexprprivate

Définition à la ligne 352 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ _doTwoProducts()

constexpr HPReal Arcane::HPReal::_doTwoProducts ( Real a,
Real b )
inlinestaticconstexprprivate

Définition à la ligne 367 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ _doTwoSum()

constexpr HPReal Arcane::HPReal::_doTwoSum ( Real a,
Real b )
inlinestaticconstexprprivate

Définition à la ligne 344 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ accumulate()

constexpr HPReal Arcane::HPReal::accumulate ( Real a,
HPReal b )
inlinestaticconstexpr

Définition à la ligne 253 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ assign()

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 27 du fichier HPReal.cc.

◆ correction()

Real Arcane::HPReal::correction ( ) const
inlineconstexpr

Correction interne.

Définition à la ligne 186 du fichier arccore/src/base/arccore/base/HPReal.h.

Référencé par toReal().

Voici le graphe des appelants de cette fonction :

◆ div2() [1/2]

constexpr HPReal Arcane::HPReal::div2 ( HPReal a,
HPReal b )
inlinestaticconstexpr

Définition à la ligne 287 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ div2() [2/2]

constexpr HPReal Arcane::HPReal::div2 ( Real b,
HPReal a )
inlinestaticconstexpr

Définition à la ligne 295 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator*=() [1/2]

void Arcane::HPReal::operator*= ( HPReal v)
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().

Voici le graphe d'appel pour cette fonction :

◆ operator*=() [2/2]

void Arcane::HPReal::operator*= ( Real v)
inlineconstexpr

Multiplie un Real tout en préservant l'erreur.

Définition à la ligne 213 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator+=() [1/2]

void Arcane::HPReal::operator+= ( HPReal v)
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.

Références HPReal(), et reduce().

Voici le graphe d'appel pour cette fonction :

◆ operator+=() [2/2]

void Arcane::HPReal::operator+= ( Real v)
inlineconstexpr

Ajoute un Real tout en préservant l'erreur.

Définition à la ligne 189 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator/=() [1/2]

void Arcane::HPReal::operator/= ( HPReal v)
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().

Voici le graphe d'appel pour cette fonction :

◆ operator/=() [2/2]

void Arcane::HPReal::operator/= ( Real v)
inlineconstexpr

Divise un Real tout en préservant l'erreur.

Définition à la ligne 225 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ print()

std::ostream & Arcane::HPReal::print ( std::ostream & o) const

Écrit l'instance dans le flux o lisible par assign().

Définition à la ligne 37 du fichier HPReal.cc.

◆ printPretty()

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 47 du fichier HPReal.cc.

◆ product() [1/2]

constexpr HPReal Arcane::HPReal::product ( HPReal a,
HPReal b )
inlinestaticconstexpr

Définition à la ligne 269 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ product() [2/2]

constexpr HPReal Arcane::HPReal::product ( Real a,
HPReal b )
inlinestaticconstexpr

Définition à la ligne 276 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ reduce() [1/2]

constexpr HPReal Arcane::HPReal::reduce ( HPReal a,
HPReal b )
inlinestaticconstexpr

Définition à la ligne 261 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ reduce() [2/2]

HPReal Arcane::HPReal::reduce ( HPReal b) const
inlineconstexpr

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().

Voici le graphe d'appel pour cette fonction :
Voici le graphe des appelants de cette fonction :

◆ SPLIT()

constexpr HPReal Arcane::HPReal::SPLIT ( Real a)
inlinestaticconstexprprivate

Définition à la ligne 375 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ toReal()

Real Arcane::HPReal::toReal ( ) const
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().

Voici le graphe d'appel pour cette fonction :

◆ value()

Real Arcane::HPReal::value ( ) const
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().

Voici le graphe des appelants de cette fonction :

◆ zero()

constexpr HPReal Arcane::HPReal::zero ( )
inlinestaticconstexpr

Valeur zéro.

Définition à la ligne 249 du fichier arccore/src/base/arccore/base/HPReal.h.

Références HPReal().

Voici le graphe d'appel pour cette fonction :

◆ operator!=

bool operator!= ( const HPReal & a,
const HPReal & b )
friend

Définition à la ligne 317 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator+

HPReal operator+ ( const HPReal & a,
const HPReal & b )
friend

Définition à la ligne 321 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator<

bool operator< ( const HPReal & a,
const HPReal & b )
friend

Définition à la ligne 305 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator<<

std::ostream & operator<< ( std::ostream & o,
HPReal t )
friend

Définition à la ligne 326 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator==

bool operator== ( const HPReal & a,
const HPReal & b )
friend

Définition à la ligne 313 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator>

bool operator> ( const HPReal & a,
const HPReal & b )
friend

Définition à la ligne 309 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ operator>>

std::istream & operator>> ( std::istream & i,
HPReal & t )
friend

Définition à la ligne 331 du fichier arccore/src/base/arccore/base/HPReal.h.

Documentation des données membres

◆ m_correction

Real Arcane::HPReal::m_correction
private

Définition à la ligne 339 du fichier arccore/src/base/arccore/base/HPReal.h.

◆ m_value

Real Arcane::HPReal::m_value
private

Définition à la ligne 338 du fichier arccore/src/base/arccore/base/HPReal.h.


La documentation de cette classe a été générée à partir des fichiers suivants :