Somme exacte en double précision

Certaines sommes en double précision sont entâchées d’erreurs d’arrondi (round-off error) qui peuvent fausser significativement les résultats. Je vous présente un algorithme qui compense ces erreurs.

La fonction en VBA

Public Function SommeExacte(ByVal s As Double, ByVal x As Double, ByRef c As Double) As Double
'Algorithme de Shewchuk / Knuth - TwoSum()
  Dim y As Double, z As Double
   y = s + x
   z = y - x
   c = c - ((z - s) + ((y - z) - x))
   SommeExacte = y
End Function

On passe en argument à cette fonction la somme courante (s), la valeur à ajouter (x) et le troisième argument est la variable passée en référence qui contiendra la correction à appliquer après les sommes.
La fonction retourne la somme non corrigée.

Test
Pour tester l’efficacité de la correction, on compare le résultat obtenu avec celui de la somme en type décimal. Pour rappel, le type decimal n’est pas la solution universelle car la plage des nombres est limitée et sa vitesse est lente.

Public Function TestSomme()
   Const cNbBoucle As Long = 1000000
   Dim v As Variant, i As Long
   Dim x As Double, s As Double, c As Double
 
   v = CDec(0)
   x = 0.1
   c = 0
   For i = 1 To cNbBoucle
      s = SommeExacte(s, x, c)
      v = v + x
   Next i
   Debug.Print "Somme (decimal):" & v, "Somme:" & s, "Somme exacte:" & (s + c)
End Function

La somme naïve en double précision (s = s + x) reste beaucoup plus rapide que la somme exacte qui sera donc réservée aux cas l’exigeant.

@+

Philippe

Laisser un commentaire