DetailPage-MSS-KB

Base de connaissances

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

 

Sommaire

Résumé

Mathématiques à virgule flottante est un sujet complexe qui confuses nombreux programmeurs. Le didacticiel ci-dessous doit vous reconnaître programmation situations où erreurs en virgule flottante sont susceptibles de se produire et comment éviter les aider. Il doit vous à reconnaître cas provoqués par des limites inhérente aux mathématiques à virgule flottante par opposition à bogues du compilateur réel permettent également.

Plus d'informations

Décimal et des systèmes nombre binaire

En règle générale, nous compter les choses dans base 10. La base est complètement arbitraire. La raison uniquement que les personnes ont utilisé généralement base 10 est qu'ils ont des doigts 10, qui effectuées outils pratiques inventaire.

Le numéro 532.25 en décimal (base 10) signifie que suivantes :
   (5 * 10^2) + (3 * 10^1) + (2 * 10^0) + (2 * 10^-1) + (5 * 10^-2)
       500    +     30     +      2     +     2/10    +    5/100
   _________
   =  532.25
				

Dans le système de nombre binaire (base 2), chaque colonne représente une puissance de 2 au lieu de 10. Par exemple, le numéro 101.01 signifie suivantes :
   (1 * 2^2) + (0 * 2^1) + (1 * 2^0) + (0 * 2^-1) + (1 * 2^-2)
       4     +      0    +     1     +      0     +    1/4
   _________
   =  5.25  Decimal
				

Comment les entiers sont représentation de PC

Puisqu'il n'existe aucune partie fractionnelle au nombre entier, sa représentation de l'ordinateur est beaucoup plus simple que pour les valeurs à virgule flottante. Normales entiers sur des ordinateurs personnels (PC) sont 2 octets (16 bits) longue avec le bit de poids fort indiquant le signe. Entiers longs sont 4 octets. Les valeurs positives sont des nombres binaires simple. Par exemple :
    1 Decimal = 1 Binary
    2 Decimal = 10 Binary
   22 Decimal = 10110 Binary, etc.
				

Cependant, entiers négatifs sont représentés avec jeu de complément les deux. Pour obtenir les deux complément représentation pour un nombre négatif, prenez la représentation binaire pour la valeur absolue le nombre puis retourner les bits et ajoute 1. Par exemple :
   4 Decimal = 0000 0000 0000 0100
               1111 1111 1111 1011     Flip the Bits
   -4        = 1111 1111 1111 1100     Add 1
				

Notez que-1 décimal = 1111 1111 1111 1111 en binaire, qui explique pourquoi Basic traite-1 à VRAI logique (tous les bits = 1). C'est une conséquence de devoir ne pas opérateurs distincts pour la comparaison bit à bit et logiques. Souvent dans Basic, il est pratique d'utiliser le fragment de code ci-dessous lorsque votre programme s'être effectuer de comparaisons logiques. Cette aide considérablement lisibilité.
   CONST TRUE = -1
   CONST FALSE = NOT TRUE
				

Notez qu'ajouter n'importe quelle combinaison de deux compléter numéros ensemble à l'aide d'ordinaire arithmétique binaire produit le résultat correct.

Calcul en virgule flottante en complications

Chaque entier décimal peut être exactement représentée par un entier binaire ; toutefois, ce n'est pas vrai pour les nombres décimale. En fait, chaque numéro d'irrational dans base 10 sera également irrational dans n'importe quel système avec une base inférieure à 10.

Pour les binaires, en particulier, uniquement fractionnaire nombres qui peut être représenté dans le formulaire p/q, q étant une puissance entier de 2, peut être exprimé exactement, avec un nombre fini de bits.

Fractions décimales même courantes, telles que 0,0001 décimal, ne peut pas être représentées exactement dans binaire. (0,0001 est une fraction binaire extensible avec une période de 104 bits!)

Ceci explique pourquoi un exemple simple, comme suit
   SUM = 0
   FOR I% = 1 TO 10000
      SUM = SUM + 0.0001
   NEXT I%
   PRINT SUM                   ' Theoretically = 1.0.
				

va impression 1.000054 en sortie. L'erreur petite représentant 0,0001 dans binaire se propage à la somme.

Pour la même raison, vous devez toujours être très prudent lors des comparaisons sur les numéros de réel. L'exemple suivant illustre une erreur de programmation courantes :
   item1# = 69.82#
   item2# = 69.20# + 0.62#
   IF item1# = item2# then print "Equality!"
				

Ce ne pas impression égalité! car 69.82 ne peut pas être représentée exactement dans binaire, ce qui entraîne la valeur résultant de l'affectation doit être LÉGÈREMENT différente (en binaire) à celle qui est généré à partir de l'expression. Dans la pratique, vous devez toujours coder ces comparaisons de telle sorte que pour permettre une tolérance. Par exemple :
   IF (item1# < 69.83#) AND (item1# > 69.81#) then print "Equal"
				

Cela est impression égal ».

Format IEEE numéro

QuickBasic pour MS-DOS, version 3.0 a été fourni avec une version MBF (point de variable binaire Microsoft) et une version IEEE (Institute of Electrical and Electronics Engineers) pour les ordinateurs avec un coprocesseur mathématique. QuickBasic pour MS-DOS, versions 4.0 et versions ultérieures utilisent uniquement IEEE. Microsoft a choisi la norme IEEE pour représenter les valeurs à virgule flottante dans les versions actuelles de base trois raisons principales :
  1. Pour autoriser Basic à utiliser les coprocessors mathématique Intel, quel format utiliser IEEE. Les coprocessors série 80x87 Intel ne peut pas utiliser les nombres format binaire Microsoft.
  2. Pour rendre interlanguage appel entre Basic, C, Pascal, FORTRAN et MASM beaucoup plus facile. Sinon, les routines de conversion faudrait à utiliser pour envoyer des valeurs numériques d'une langue à un autre.
  3. Pour obtenir la cohérence. IEEE est la configuration acceptée norme pour les compilateurs C et FORTRAN.
Voici une comparaison rapide des représentations IEEE et MBF pour un nombre double précision :
               Sign Bits   Exponent Bits   Mantissa Bits
               ---------   -------------   -------------
   IEEE        1           11              52 + 1 (Implied)
    MBF        1            8              56
				

Pour plus d'informations sur les différences entre IEEE et MBF à virgule flottante représentation, la requête dans la Base de connaissances Microsoft sur les mots suivants :
   IEEE and floating and point and appnote
				

Notez que IEEE comporte plusieurs bits dédiés à la puissance, qui permet à représenter une plage de valeurs plus large. MBF comporte plusieurs bits de mantisse, qui permet qu'il soit plus précise dans sa plage plus étroite.

Concepts en générales

Il est très important de réaliser que tout système de calcul en virgule flottante binaire peut représenter uniquement un nombre fini de valeurs à virgule flottante dans forme exacte. Toutes les autres valeurs doivent être assimilées par la valeur représentable le plus proche. La norme IEEE spécifie la méthode d'arrondi des valeurs à la valeur représentable « plue. QuickBasic pour MS-DOS prend en charge la norme et arrondit conformément aux règles IEEE.

En outre, gardez à l'esprit que les numéros qui peuvent être représentés dans IEEE sont réparties sur un très grand nombre. Vous pouvez imaginer les sur une ligne de nombre. Il une haute densité de nombres représentable près 1.0 et étend de- mais moins et moins que vous vers 0 ou infini.

L'objectif de la norme IEEE qui est conçue pour Ingénierie des calculs, est d'optimiser la précision (pour obtenir fermer que possible le nombre). Précision fait référence au nombre de chiffres que vous pouvez représenter. La norme IEEE standard tente d'équilibrer le nombre de bits dédiés à la puissance avec le nombre de bits utilisés pour la partie décimale du nombre, pour conserver la précision et précision limites acceptables.

Détails IEEE

Nombres à virgule flottante sont représentés dans l'écran suivant, où [exposant] représente l'exposant binaire :
   X =  Fraction * 2^(exponent - bias)
				

[Fraction] est la partie fractionnelle normalisée du nombre normalisé car l'exposant est ajustée afin que le bit de début est toujours 1. Ainsi, il ne dispose doivent être stockées, et vous obtenez un peu plus de précision. C'est pourquoi il est un bit implicite. Vous pouvez considérer ce comme notation scientifique, dans laquelle vous manipulez l'exposant pour avoir un chiffre à gauche de la virgule, à l'exception dans binaire, vous pouvez toujours manipuler l'exposant ce qui le premier est 1, puisqu'il sont uniquement 1 et 0.

[Décalage] est la valeur décalage utilisée pour éviter d'avoir à stocker les exposants négatifs.

Le décalage des nombres simple précision est 127 et 1023 (décimal) pour les nombres de double précision.

Les valeurs est égal à tous les 0 et sont réservés toutes les 1 (binaire) pour représentant des cas spéciaux. Il existe autres spéciales cas, indiquant différentes conditions d'erreur.

Exemples de simple précision

2 = 1 * 2 ^ 1 = 0100 0000 0000 0000... 0000 0000 = 4000 0000 hexadécimal
Notez le bit de signe est zéro et l'exposant stockée est 128 ou 100 0 0000 dans binaire, 127 plus 1. La mantisse stockée est (1). 000 0000... 0000 0000, qui possède un début implicite 1 et binaire pointer, donc la mantisse réel est 1.

-2 =-1 * 2 ^ 1 = 1100 0000 0000 0000... 0000 0000 = C000 0000 hexadécimal
Identique +2 sauf que le bit de signe est défini. Cela est vrai pour toutes les IEEE format nombres à virgule flottante.

4 = 1 * 2 ^ 2 = 0100 0000 0000 1000... 0000 0000 = 4080 0000 hexadécimal
Même mantisse, exposant incrémente de 1 (valeur biaisé est 129 ou 100 1 0000 exprimée sous forme binaire.

6 = 1.5 * 2 ^ 2 = 0100 0000 0000 1100... 0000 0000 = 40 C 0 0000 hexadécimal
Même exposant, mantisse est supérieure à moitié-c'est de 100 (1). 0000... 0000 0000, c'est-à-dire, puisque c'est une fraction binaire, 1-1/2 (les valeurs des décimale chiffres sont 1/2 1/4, 1/8, etc..).

1 = 1 * 2 ^ 0 = 0011 1111 0000 1000... 0000 0000 = 3F80 0000 hexadécimal
Exposant même comme autres puissances de 2, mantisse est un inférieur à 2 à 127 ou 011 1 1111 exprimée sous forme binaire.

.75 = 1.5 * 2 ^ =-1 0011 1111 0000 0100... 0000 0000 = 3F40 0000 hexadécimal
L'exposant biaisé est 126, 1111 011 binaire de 0 et la mantisse est 100 (1). 0000... 0000 0000, qui est 1-1/2.

2.5 = 1,25 * 2 ^ 1 = 0100 0000 0000 0010... 0000 0000 = hexadécimal 0000 4020.
Exactement de la même que 2 sauf que le bit qui représente 1/4 est défini dans la mantisse.

0,1 = 1.6 * 2 ^-4 = 0011 1101 1100 1100... 1100 1101 = 3DCC CCCD hexadécimal
1/10è est une fraction extensible exprimée sous forme binaire. La mantisse est simplement timides de 1.6, et l'exposant biaisé indique que 1.6 est pour être divisés par 16 (il s'agit 1101 011 1 dans fichier binaire qui est 123 en décimal). La puissance de cette propriété a la valeur true est 123-127 = - 4, ce qui signifie que le facteur utilisé multiplier est 2 **-4 = 1/16. Notez que la mantisse stockée est arrondi dans le dernier bit. Ceci est une tentative pour représenter le nombre unrepresentable précisément que possible. (La raison que 1/10è et 1/100 ne sont pas exactement représentable dans fichier binaire est similaire à la sorte que 1/3 est pas exactement représentable en décimal.)

0 = 1.0 * 2 ^-128 = tous les zéros--un cas spécial.

Autres erreurs en communs

Voici les erreurs courantes à virgule flottante :
  1. Une erreur d'arrondi

    Cette erreur est générée lorsque tous les octets dans un nombre binaire en nombre ne peut pas être utilisés dans un calcul.

    Exemple : Ajout 0,0001 à 0.9900 (précision unique)

    Décimal 0,0001 seront représentés en tant que :
    10100011011011100010111 (1). * 2^(-14+Bias) (13 début 0 en binaire!)
    0.9900 seront représentés en tant que :
    11111010111000010100011 (1). * 2^(-1+Bias)
    Maintenant pour ajouter ces numéros, les points décimaux (binaires) doivent être alignés. Pour cela elles doivent être Unnormalized. Ici, est l'ajout résultant :
           .000000000000011010001101 * 2^0  <- Only 11 of 23 Bits retained
          +.111111010111000010100011 * 2^0
          ________________________________
           .111111010111011100110000 * 2^0
    
    						
    il est appelé une erreur d'arrondi, car certains ordinateurs arrondir lorsque le décalage pour une addition. D'autres simplement tronquent. Arrondir - désactiver les erreurs sont importants à prendre en compte lorsque vous ajoutez ou multiplication de deux valeurs très différentes.
  2. Deux soustrayant presque égal valeurs
           .1235
          -.1234
           _____
           .0001
    
    						
    il va être normalisé. Notez que bien que les numéros d'origine chaque avait quatre chiffres significatifs, le résultat ne comporte qu'un seul chiffre significatif.
  3. Dépassement de capacité et de dépassement de précision

    Cela se produit lorsque le résultat est trop grand ou trop petit pour être représentée par le type de données.
  4. Quantizing erreur

    Ce problème se produit avec les numéros qui ne peut pas être représentés dans forme exacte par la norme à virgule flottante.
  5. Division par un très petit nombre

    Cela peut déclencher une erreur « Division par zéro » ou peut produire résultats incorrects, comme dans l'exemple suivant :
          A = 112000000
          B = 100000
          C = 0.0009
          X = A - B / C
    
    						
    QuickBasic dans pour MS-DOS, X maintenant a la valeur 888887, au lieu de la réponse correcte, 900000.
  6. Erreur de sortie

    Ce type d'erreur se produit si les fonctions de sortie modifier les valeurs qu'ils travaillent avec.

Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual Basic 2.0 Édition Standard
  • Microsoft Visual Basic 3.0 Édition professionnelle
  • Microsoft Visual Basic 4.0 Édition Standard
  • Microsoft Visual Basic 1.0 Édition Standard
  • Microsoft Visual Basic 2.0 Édition professionnelle
  • Microsoft Visual Basic 4.0 Édition professionnelle
  • 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 Cinemania 97 Standard Edition
Mots-clés : 
kbmt KB42980 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: 42980  (http://support.microsoft.com/kb/42980/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.
Article KB retiré.Exclusion 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.
Partager
Options de support supplémentaire
Forums du support Microsoft Community
Nous contacter directement
Trouver un partenaire Microsoft Certified Partner
Microsoft Store