Introduction
Imaginons que vous souhaitiez obtenir la racine cubique de -0.5.
Vous écrivez dès lors le code suivant : -0.5 ^ (1/3) ou Math.Pow(-0.5, 1/3)
Quelle n'est pas votre suprise d'apprendre que cela fait... NaN ! Pas très pratique quand on sait que cette racine existe pourtant bel et bien !
Pourquoi ce bug ?
En fait, quand vous avez un exposant inférieur à 1, Math.Pow utilise une formule contenant le logarithme. Or le logarithme n'est défini que pour les nombres positifs. Conclusion, pour les nombres négatifs, point de racine cubique.
Comment corriger ce bug ?
Il faut dès lors ruser... Voici ma solution (VB), qui consiste en fonction "v(n, x)"
Public Module MathModule
Public Function v(ByVal c As Double, ByVal x As Double) As Double
If x < 0 Then 'Si le nombre est négatif
v = -((-x) ^ (1 / c)) 'Chercher la racine du nombre positif
If Math.Round(v ^ c, 3) <> Math.Round(x, 3) Then
v = Double.NaN 'Et renvoyer NaN si cette racine ne s'applique pas
End If
Else
v = x ^ (1 / c)
End If
End Function
Public Function v(ByVal x As Double) As Double
v = x ^ (0.5)
End Function
End Module
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :