2010-02-02 3 views
1

(1) J'ai rencontré plusieurs cas où epsilon est ajouté à une variable non négative pour garantir une valeur non nulle. Donc, je me demande pourquoi ne pas ajouter la valeur minimale que le type de données peut représenter à la place d'epsilon? Quels sont les problèmes de différence que ces deux peuvent résoudre?précision machine et valeur max et min d'un type double précision

(2) Je remarque aussi que l'inverse de la valeur maximale d'un type à double précision est plus grande que sa valeur min, et inverse de sa valeur minimale est inf, beaucoup plus grand que sa valeur max. Est-il utile de calculer les inverses de ses valeurs max et min? (3) Pour un très petit nombre positif de type double, pour calculer sa réciproque, à quel point il est petit quand son réciproque commence à ne plus avoir de sens? Est-il préférable de mettre une limite supérieure sur la réciproque? Combien coûte le lien?

Merci et salutations sont ajoutés

Répondre

2

Vous devez comprendre comment les nombres à virgule flottante sont représentés dans la CPU. Dans le type de données, 1 bit est réservé pour le signe, c'est-à-dire s'il s'agit d'un nombre positif ou négatif (oui vous pouvez avoir des nombres positifs et négatifs en virgule flottante), alors un nombre de bits est réservé au mantisse,) ce sont les chiffres significatifs dans le nombre à virgule flottante et finalement un nombre de bits est réservé à l'exposant. La valeur du nombre à virgule flottante est maintenant:

-1^signe * significand * 2^exposant

  1. Cela signifie que le plus petit nombre est une valeur très faible, à savoir les smalles significand avec l'exposant le plus bas . L'erreur d'arrondi est cependant beaucoup plus grande et dépend de l'ampleur du nombre, à savoir le plus petit nombre avec un exposant donné. L'epsilon est la différence entre 1,0 et la plus grande valeur représentable suivante. C'est pourquoi epsilon est utilisé dans un code qui est robuste pour les erreurs d'arrondi, et vous devriez vraiment faire évoluer l'epsilon avec l'ampleur des nombres avec lesquels vous travaillez si vous le faites correctement. La plus petite valeur représentable n'est pas vraiment utile en temps normal.

  2. Vous voyez la différence entre le minimum normalisé et dénormalisé. Le problème est qu'en raison de la façon dont le significand est utilisé, il est possible de faire un exposant négatif plus grand qu'un exposant positif, disons que le motif binaire du significand est tous des zéros excepté le dernier bit, qui est un, alors l'exposant est effectivement abaissé par le nombre de bits dans le significand. Pour le maximum, vous ne pouvez pas faire cela, même si vous définissez le significand à tous ceux, l'exposant effectif sera toujours l'exposant qui est donné. c'est-à-dire penser à la différence entre 0.000001e-10 et 9.999999e + 10, le premier est beaucoup plus petit que le second est grand. Le premier est en fait 1e-16 tandis que le second est environ 1e + 11.

  3. Cela dépend de la précision du nombre à virgule flottante bien sûr. Dans le cas de la double précision, la différence entre la valeur maximale et la plus petite suivante est déjà énorme (sur le modèle de 10^292), de sorte que vos erreurs d'arrondi seront très importantes. Si la valeur est trop petite, vous obtiendrez simplement inf, comme vous l'avez déjà vu. Vraiment, il n'y a pas de réponse stricte, cela dépend entièrement de la précision des chiffres dont vous avez besoin. Étant donné que l'erreur d'arrondi est environ epsilon * magnitude, l'inverse de (1/epsilon) a déjà une erreur d'arrondi d'environ 1.0 si vous avez besoin de chiffres précis à 1e-3 alors même epsilon serait trop grand pour diviser.

Voir ces pages wikipedia sur IEEE754 et Machine epsilon pour quelques informations d'arrière-plan.

1
  1. Epsilons pour tester l'égalité entre les deux valeurs qui doivent être égaux, mais ne sont pas en raison d'erreurs d'arrondi. Alors que vous pourriez utiliser la plus petite valeur positive pour epsilon, ce ne serait pas optimal, parce que c'est tout simplement trop petit. Les erreurs d'arrondi provoquées par l'arithmétique en virgule flottante dépassent presque toujours cette plus petite valeur, donc une epsilon plus grande est nécessaire. Quelle est la taille dépend de votre précision souhaitée.

  2. Je ne comprends pas la question. Les réciproques sont-elles utiles pour quoi? Je ne peux pas penser à aucune raison pour laquelle ils seraient utiles. En général, diviser par de très petites valeurs est une mauvaise idée car cela entraînera des erreurs d'arrondi très importantes. Je ne suis pas sûr de ce que vous voulez dire en ajoutant une limite supérieure. Évitez simplement de diviser par de petites valeurs autant que possible.

+0

Merci Poita_. Pour 3, voir mon dernier post http://stackoverflow.com/questions/2185296/inverse-distance-weighted-value-and-machine-precision – Tim

4

Epsilon

Epsilon est la plus petite valeur qui peut être ajouté à 1,0 et produire un résultat qui est à distinguer de 1,0. Comme l'a suggéré Poita_, ceci est utile pour traiter les erreurs d'arrondi. La situation est assez simple: un nombre à virgule flottante normal a une précision qui reste fixe, quelle que soit l'ampleur du nombre. Pour le dire légèrement différemment, il calcule toujours le même nombre de chiffres significatifs. Par exemple, une implémentation typique de double aura environ 15 chiffres significatifs (ce qui se traduit par Epsilon = ~ 1e-15). Si vous travaillez avec un nombre compris entre 10 et 200, le plus petit changement qu'il peut représenter sera environ 10 à 215. Si vous travaillez avec un nombre dans la plage 10e + 200, le plus petit changement qu'il peut représenter sera d'environ 1e + 185.

L'utilisation significative d'Epsilon nécessite normalement de l'adapter à la plage des nombres avec lesquels vous travaillez, et de l'utiliser pour définir une plage que vous acceptez probablement comme étant due à des erreurs d'arrondi, donc si deux nombres cette gamme, vous supposez qu'ils sont probablement vraiment égaux. Par exemple, avec Epsilon de 1e-15, vous pouvez décider de traiter les nombres qui se situent entre 1 et 14 l'un de l'autre comme égaux (c'est-à-dire que le chiffre significatif a été perdu pour arrondir).

Le plus petit nombre qui peut être représenté sera normalement considérablement plus petit que cela. Avec ce même double typique, il va généralement être autour de 1e-308. Cela équivaudrait à Epsilon si vous utilisiez des nombres à virgule fixe au lieu de nombres à virgule flottante. Par exemple, à un moment donné, plusieurs personnes utilisaient un point fixe pour divers graphiques. Une version type était un nombre entier de bits de 16 bits divisé en quelque chose comme 10 bits avant le point décimal et six bits après le point décimal. Un tel nombre peut représenter des nombres d'environ 0 à 1024, avec environ deux chiffres (décimaux) après le point décimal. Alternativement, vous pouvez le traiter comme signé, en cours d'exécution (environ) -512 à +512, encore avec environ deux chiffres après la virgule décimale.

Dans ce cas, le facteur d'échelle est fixé, de sorte que la plus petite différence qui peut être représenté entre deux nombres est également fixé - à savoir la différence entre 1024 et le prochain plus grand nombre est exactement la même que la différence entre 0 et le prochain grand nombre.

Réciproques

Je ne sais pas exactement pourquoi vous êtes concernés par calcul inverse des très grands nombres ou extrêmement petites. Le point flottant IEEE utilise des dénormaux, ce qui signifie que les nombres proches des limites de la plage perdent de la précision. Fondamentalement, un nombre est divisé en un exposant et un significand. L'exposant contient la grandeur du nombre, et le significand contient les chiffres significatifs. Chacun est représenté avec un nombre de bits spécifié. Dans le cas habituel, les nombres sont normalisés, ce qui signifie qu'ils sont vaguement semblables à la notation scientifique que nous avons tous appris à l'école.En notation scientifique, vous ajustez toujours le significand et l'exposant de façon à ce qu'il y ait exactement une place avant la virgule, donc (par exemple) 140 devient 1.4e2, 20030 devient 2.003e4, et ainsi de suite. Pensez-y comme la forme «normalisée» d'un nombre à virgule flottante. Supposons, cependant, que vous êtes limité à un exposant ayant 2 chiffres, donc il ne peut aller de -99 à +99. Supposez également que vous pouvez avoir un maximum de 15 chiffres significatifs. Dans ces limites, vous pourriez produire un nombre comme 0,00001002e-99. Cela vous permet de représenter un nombre inférieur à 1e-99, au détriment de perdre de la précision - au lieu de 15 chiffres de précision, vous avez utilisé 5 chiffres de votre significande pour représenter la magnitude, donc il vous reste seulement 10 chiffres qui sont vraiment importants.

Sauf qu'il est en binaire au lieu de décimal, le point flottant IEEE fonctionne à peu près de cette façon. A l'approche de la fin de la plage, les nombres ont de moins en moins de précision, jusqu'à ce que (à la toute fin de la plage) il ne reste qu'un peu de précision. Si vous prenez ce nombre qui a seulement un peu de précision, et prenez sa réciprocité, vous obtenez un nombre extrêmement élevé - mais puisque vous avez seulement commencé avec un peu de précision, le résultat ne peut avoir qu'un peu de précision en tant que bien. Bien qu'un peu mieux que pas de résultat du tout, il est encore assez proche de sens. Vous avez atteint la limite de ce que le nombre de bits peut représenter; à propos de la seule façon de remédier au problème est d'utiliser plus de bits.

Il n'y a pas vraiment de point à partir duquel un réciproque (ou un autre calcul) "n'a plus de sens". Ce n'est pas vraiment une ligne dure où un résultat a du sens, et un autre ne le fait pas. Plutôt, c'est une pente, où un résultat peut avoir 15 chiffres de précision, un autre 10 et un tiers seulement 1. Ce qui "a du sens" ou non est la plupart du temps comment vous interprétez ce résultat. Pour obtenir des résultats significatifs, vous devez avoir une bonne idée du nombre de chiffres dans votre résultat final.