Numéro d'article: 69333 - Dernière mise à jour: mardi 16 août 2005 - Version: 2.2

Comment faire pour travail autour des problèmes de précision/comparaison en

A noterCet article s'applique à un système d'exploitation différent de celui que vous utilisez. Le contenu de l'article qui ne vous concerne peut-être pas est désactivé.
Agrandir tout | Réduire tout

Résumé

Pour tester fiable si deux variables à virgule flottante ou expressions sont égale (à l'aide au format IEEE ou MBF), vous devez soustraire les deux variables comparées et vérifier si leur différence est inférieure à une valeur choisie dans les limites de précision pour simple ou double précision. AUCUN AUTRE TEST ÉGALITÉ N'ÊTRE FIABLE. Les formules suivantes tester fiable Si X et Y sont identiques :

  1. Pour simple précision, vous devez tester si la différence de X et Y est inférieure aux valeur 7 décimales inférieures à X ou Y. Diviser X ou Y par 10 ^ 7 pour rechercher la valeur de comparaison. Par exemple :
          ' To try this example in VBDOS.EXE:
          ' 1. From the File menu, choose New Project.
          ' 2. Copy the code example to the Code window.
          ' 3. Press F5 to run the program.
    
          IF ABS(X! - Y!) <= (X! / 10^7) THEN
             PRINT "Equal within 7 digits"
          ENDIF
    						
  2. De double précision, vous devez tester si la différence de X et Y est inférieure aux valeur 15 décimales inférieures à X ou Y. Diviser X ou Y par 10 ^ 15 pour rechercher la valeur de comparaison. Par exemple :
          ' To try this example in VBDOS.EXE:
          ' 1. From the File menu, choose New Project.
          ' 2. Copy the code example to the Code window.
          ' 3. Press F5 to run the program.
    
          IF ABS(X# - Y#) <= (X# / 10^15) THEN
             PRINT "Equal within 15 digits"
          ENDIF
    						
Le format de nombres à virgule flottante IEEE se trouve dans le standard et professionnel éditions de Microsoft Visual Basic pour MS-DOS, version 1.0 ; dans Microsoft QuickBasic pour MS-DOS (QB87.EXE coprocesseur version uniquement), les versions 3.0, 4.0 4.0b et 4.5 ; dans le compilateur Basic de Microsoft pour MS-DOS et Microsoft OS/2, versions 6.0 et 6.0b ; et dans Microsoft base professionnel développement système (PDS) pour MS-DOS et Microsoft OS/2, versions 7.0 et 7.1.

MBF (format binaire Microsoft) se trouve dans Microsoft QuickBasic pour MS-DOS (version de coprocesseur non QB.EXE uniquement), les versions 1.0, 1.01, 2.0, 2.01 et 3.0 et Microsoft GW-Basic interprète pour MS-DOS, versions 3.2, 3.22 et 3.23.

Les informations contenues dans cet article sont également inclus dans le fichier d'aide fourni avec le standard et professionnel éditions de Microsoft Visual Basic pour MS-DOS, version 1.0.

Plus d'informations

Remarque : les chiffres significatifs dans un nombre calculé peuvent être perdues en raison d'à la suivante : plusieurs calculs, notamment addition de nombres présent séparée de valeur, ou la soustraction de nombres similaire dans valeur. Lorsqu'un nombre résultats de plusieurs calculs, vous devrez peut-être modifier votre test d'égalité d'utiliser moins de chiffres significatifs pour refléter la perte mathématique de chiffres significatifs. Si votre test de l'argument précision utilise trop de chiffres significatifs, vous pouvez échouer à découvrir que nombres comparés égalité sont effectivement égaux dans la limite de précision possible.

Dans les base produits répertoriés ci-dessus qui utilisent au format à virgule flottante IEEE, calculs intermédiaires sont effectuées dans un registre de temporaire 64 bits interne, qui possède plus d'octets de précision que sont stockés dans des variables simple précision ou double précision. Cela entraîne souvent une instruction IF renvoyer une erreur les états que le calcul intermédiaire n'est pas égal à l'expression est comparée. Par exemple :
   X = 25
   Y = 60.1
   IF 1502.5 = (X * Y) THEN PRINT "equal"
				
en cours d'exécution du code ci-dessus pas imprimera égal ». En revanche, la méthode suivante utilisant une variable de l'espace réservé imprimera « égale, mais est toujours pas une fiabilité technique comme un test d'égalité :
   Z = 25 * 60.1
   IF 1502.5 = Z THEN PRINT "equal"
				
Remarque diffuse explicite de type numérique (! pour simple précision, # de double précision) affectent la précision dans laquelle les calculs sont stockés et imprimés. N'importe quel type de conversion vous exécutez, vous pouvez toujours voir inattendus arrondis résultats :
   PRINT 69.82! + 1    ' Single precision, prints 70.82.
   PRINT 69.82# + 1    ' Double precision, prints 70.81999999999999.
				
pour une représentation numérique exacte décimal (base 10), comme pour les calculs de dollars et cents, vous devez utiliser les devises (@) type de données trouvé dans Visual Basic for MS-DOS, version 1.0 et base PDS pour MS-DOS, versions 7.0 et 7.1. Le type de données CURRENCY contient exactement jusqu'à 19 chiffres, avec 4 chiffres après la décimale.

Référence :

Normes L'IEEE et le MBF tente d'équilibrer la précision et la précision de plage numérique et la vitesse. La précision mesure le nombre bits significatifs de précision ne sont pas perdus dans les calculs. Précision correspond le nombre de bits dans la mantisse, qui détermine combien de chiffres décimaux peut être représentés.

À la fois au format IEEE et MBF stocker des nombres de la 1.x de formulaire à la puissance d'y (où x et y sont des nombres 2 base; x est la mantisse et y est l'exposant).

MBF simple précision a 24 bits de mantisse et double précision a de mantisse 56 bits. Tous les calculs MBF sont effectués dans seulement 24 ou 56 bits.

IEEE simple précision a 24 bits de mantisse et double précision a 53 bits de mantisse. Cependant, toutes les simple précision et de double précision IEEE calculs dans Visual Basic for MS-DOS, version 1.0 ; QuickBasic pour MS-DOS, versions 3.0/4.x ; de compilateur pour MS-DOS, versions 6.0 et 6.0b ; Basic et base PDS pour MS-DOS, versions 7.0 et 7.1re effectués dans un Registre 64 bits temporaire pour plus de précision. Par conséquent, les calculs IEEE sont plus précis que calculs MBF, en dépit permet de MBF de représenter plusieurs bits dans double précision.

La plupart des nombres dans la notation décimale (base 10) n'ont pas une représentation exacte dans le format de stockage à virgule flottante binaire (base 2) utilisé dans types de données simple précision et de double précision. À la fois au format IEEE et MBF ne peut pas exactement représentent (et devez arrondir) tous les numéros ne sont pas du 1.x de formulaire à la puissance d'y (où x et y sont des nombres 2 base). Les numéros peuvent être représentés exactement sont réparties sur un très grand nombre. Une densité élevée des nombres représentable est près 1.0 et de-1.0, mais moins et moins représentable numéros se produisent que les numéros d'aller vers 0 ou infini.

Les limitations ci-dessus souvent provoquer Basic pour des résultats en virgule flottante différents de ceux vous pouvez l'imaginer. Plus d'informations sur ce sujet se trouvent dans la Base de connaissances en interrogeant sur les mots suivants :
Floating point format et QuickBasic
Le format de point flottant IEEE est documenté dans les manuels suivants :

  1. Pages 16-21 de « Microsoft QuickBasic 4.0 : base référence du langage » pour QuickBasic pour MS-DOS, versions 4.0 et 4.0b. Notez que les manuels 4.0 peut-être une correction de page 19 pour le MHex $ exemple de code, comme expliqué dans un article distinct trouvé dans la Base de connaissances Microsoft. en interrogeant sur les mots suivants :
    MHex $ et 19
  2. Pages 12-17 de « Microsoft QuickBasic 4.5 : base langage référence" pour QuickBasic pour MS-DOS, version 4.5. Notez que ce manuel facultatif doit être commandée séparément avec une carte de commande fournie avec la version 4.5.
  3. Pages 702-705 de la « Microsoft Basic 7.0 : Guide du programmeur » pour Microsoft base PDS pour MS-DOS, versions 7.0 et 7.1.
Le format de point flottant MBF est documenté dans un article distinct qui se trouve dans la Base de connaissances en interrogeant sur les mots suivants :
conversion MBF et et exposant

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic for MS-DOS
  • Microsoft QuickBasic 4.0
  • Microsoft QuickBASIC 4.0b
  • Microsoft QuickBasic 4.5 pour MS-DOS
  • Microsoft BASIC Compiler 6.0
  • Microsoft BASIC Compiler 6.0b
  • Microsoft BASIC Professional Development System 7.0
  • Microsoft BASIC Professional Development System 7.1
  • Microsoft GW-BASIC 3.2
  • Microsoft GW-BASIC 3.22
  • Microsoft GW-BASIC 3.23
Mots-clés : 
kbmt kbhowto KB69333 KbMtfr
Traduction automatiqueTraduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 69333  (http://support.microsoft.com/kb/69333/en-us/ )
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.
Retired KB ArticleExclusion de responsabilité concernant les contenus obsolètes dans la Base de connaissances
Cet article concerne des produits pour lesquels Microsoft n'offre plus de support. Il est par conséquent fourni « en l'état » et ne sera plus mis à jour.