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