Astuces de recherche...
Home
- Accueil & nouveautés
- Les newsgroups VB
- Téléchargements
- L'équipe
- Nous contacter
- Liens
Rubriques
- Toutes les questions
- Affichage & graphismes
- Algorithmique
- API
- Base de registre
- Bases de données
- Contrôles
- Date & heure
- Déploiement
- Divers
- Erreurs & problèmes
- Fichiers & dossiers
- Généralités
- Impression
- Internet & mails
- Math
- Multimédia
- Réseaux
- Structures de données
- Texte & strings
- VB .Net
- VB Script
- VBA
- Windows

Question 146

Comment vérifier l'égalité de deux nombres réels ?

Préambule
D'une façon générale, il n'est pas conseillé de tester l'égalité de 2 nombre réels en VB en utilisant l'opérateur de comparaison "=". En effet, de par leur nature et la façon dont ils sont stockés en interne, on ne manipule en VB qu'une approximation de ces nombres. Par exemple, le résultat de 1/3 n'est pas représentable en VB, puisqu'il s'agit la d'un nombre à développement décimal illimité. Il en va de même par exemple pour racine de deux, dont la valeur "1,4142135623731" n'est qu'une approximation.
Quelques rappels
Il y a 2 types possibles en VB pour déclarer un nombre réel ("nombre à virgule") : Single et Double. Ces 2 types permettent le stockage de nombre réels, respectivement en simple et double précision. Le type interne de représentation est dit "à virgule flottante". A noter l'existence du type Currency, qui permet de manipuler de grands nombres à virgule; Currency ("monnaie" en anglais) utilise une représentation à virgule fixe, avec un maximum de 4 chiffres après la virgule.
On retrouvera les précisions des différents types de VB sur cette page : Data Type Summary
Comment tester l'égalité ?
Le plus fiable et le plus pratique est d'utiliser une fonction spéciale, qui testera si la différence entre les 2 valeurs n'excède pas une certaine quantité, que l'on fixera lors de l'appel.

Voici un exemple d'une telle fonction :

Public Function CompareDouble(dblValue1 As Double, dblValue2 As Double, dblPrecision As Double) As Boolean

    If Abs(dblValue1 - dblValue2) <= dblPrecision Then
        CompareDouble = True
    Else
        CompareDouble = False
    End If
End Function

Private Sub Command1_Click()
    Dim v1 As Double, v2 As Double

    v1 = Sqr(2) ' la valeur est 1,4142135623731
    v2 = 1.4142135

    If CompareDouble(v1, v2, 0.000001) Then
        MsgBox "v1 et V2 sont (presque) égaux"
    Else
        MsgBox "v1 et v2 ne sont PAS égaux"
    End If

End Sub

Cette fonction permet de tester "l'égalité" (ou plus exactement la proximité), avec une précision choisie.

Le choix de la précision sera fonction de la nature des grandeurs physiques que l'on manipule. Voici quelques exemples :
  • Pour tester si des masses (représentant le poids d'individus, exprimées en Kilos) sont égales, une précision de 1e-2 (0.01) est plus que suffisante, puisqu'avec cette valeur on compare déjà avec une précision au décigramme.
  • Pour tester des distances routières exprimées en kilomètres, une précision de 1e-2 serait suffisante (résolution de 10 mètres) alors qu'une précision de 1e-5 serait absurde (résolution au centimètre!)
Au passage, on remarquera que le choix de l'unité choisie pour les calculs est importante: Il serait stupide choisir comme unité le kilomètre pour mesurer des tailles d'individus (on choisira le centimètre), de même qu'il serait inadéquat de choisir la tonne pour mesurer le poids des mêmes individus.

Remarques générales
  • Afin de ne pas perdre de précisions lors des calculs intermédiaires, il est recomandé d'utiliser en entrée des types plus précis que les types de sortie. Ainsi, pour une sortie en Single, on devrait choisir des entrées en Double.
  • Le type Currency peut sembler une bonne solution pour manipuler de grands nombres avec précision. L'inconvénient de ce type est qu'il est purement VB, c'est à dire qu'il n'a pas d'équivalents dans d'autres langages tels que C, etc. Attention donc aux éventuels problèmes de portabilité.
  • Le Switch de compilation "Allow Unrounded Floating Point Operation" autorise le compilateur a effectuer les comparaisons entre nombre réeles sans effectuer les éventuels arrondis vers le type le plus approprié. Ceci peut parfois accélérer certaines opérations impliquant des nombre réels, mais peut aussi provoquer des comportements innatendus, la précision interne étant maintenue à un niveau plus élevé que prévu. Les détails de fonctionnement et des explications supplémentaires sont disponibles sur cette page Allow Unrounded Floating Point Operation.

Date de publication : 25 février 2007
Dernière modification : 25 février 2007
Rubriques : Math
Mots-clés : comparaison, arithmétique, double, précision, flottants, double, single, currency,calculs,calcul, égalité