Expliquer la précision en virgule flottante aux clients [clôturé]

23

Quelle est la meilleure façon d'expliquer le problème d'arrondi à virgule flottante aux clients ?

je sais

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

ainsi que les entrées dans la FAQ C ++ et diverses autres pages destinées aux développeurs et aux scientifiques, mais existe-t-il une page Web, un article ou une explication, destiné aux clients "réguliers" avec une formation mathématique ou scientifique limitée? (pour lesquels les références ci-dessus tombent à plat).

Si elle était maintenue ou provenait d'une institution ou d'une société bien connue et reconnue, tant mieux, étant donné que, comme certains d'entre vous l'ont peut-être vécu, il peut être un peu compliqué de l'expliquer vous-même.

Eric Grange
la source
1
Je ne m'embêterais pas ...
John Shaft
1
C'est une question vraiment fantastique, +10 si je le pouvais. Un problème fréquent pour les développeurs.
Cody Gray
2
Ce n'est pas un problème de détail, c'est de répondre à la question de savoir pourquoi l'ajout de ce qui ressemble à des nombres de précision à 2 chiffres décimaux, vous vous retrouvez avec un 5,9999999 et non un 6, et pourquoi vous devez spécifier la précision d'arrondi quand il est "évident" que le résultat ne devrait pas '' t avoir plus de deux chiffres décimaux. Ou pourquoi parfois 2 moins 2 n'est pas toujours nul et ne ressemble pas à un imbécile en train de le faire.
Eric Grange
9
@Eric Grange: si vos clients considèrent ces problèmes de précision comme un bug, alors, il est un bug et vous devez trouver un moyen de le réparer (peut - être par ne pas utiliser float). Ils ne se soucient pas d'où vient ce problème de précision. Ils ne se soucient pas du fonctionnement de votre logiciel. Ils veulent juste que ça marche.
David
3
@Eric: L'utilisation de virgule flottante est un détail d'implémentation. Je répète ma question, qui ne demande rien d'expliqué dans la question, et que je n'ai évidemment pas précisé (excuses): quel est le contexte, et pourquoi discutez-vous de l'utilisation de la virgule flottante avec un client?
Tom Anderson

Réponses:

8

Je trouve qu'un moyen simple d'expliquer cela est de le démontrer . Discutez de la façon dont la division xpar un nombre, puis la multiplication par le même nombre devraient vous ramener à xnouveau - amenez le client à accepter que cela devrait toujours être le cas. Faites ensuite l'ancien (100 / 3) * 3sur une calculatrice; montrer que la valeur ne retourne pas à 100, comme vous vous en doutez, lorsque la plupart des gens voient des mathématiques apparemment simples "s'effondrer", puis ont tendance à "prendre" le risque de nombres à virgule flottante où la précision est importante (bien que dans une approche intuitive plutôt qu'au niveau bas dans lequel l'article que vous pointez va).

Malheureusement, la plupart des calculatrices à moitié décentes (certainement toutes les calculatrices scientifiques que j'ai vues et plus que quelques-unes de base) sont capables de gérer cela aujourd'hui - je suppose qu'elles stockent des chiffres supplémentaires au-delà de ce qui peut être affiché et arrondi - alors faites-le vérifiez à quel point votre calculatrice est intelligente avant de le faire devant votre client.

Scott
la source
1
Oui, presque toutes les calculatrices stockent au moins 2 chiffres supplémentaires, vous devez donc ajouter quelques multiplications dans le mélange, ce qui brouille l'explication, et IME leur fait penser que vous essayez de les tromper. La racine carrée nécessite moins d'opérations, mais la racine carrée est déjà en dehors du domaine quotidien des clients réguliers.
Eric Grange
2
@Scott J'ai essayé quelques calculatrices ici, aucune n'a présenté de problèmes avec (100/3) * 3, même (100/3) * 3-100 n'a pas présenté de problèmes .... Excel a bien compris.
Eric Grange
9
Prenons l'exemple de l'argent, qui a une précision limitée parfaite. Expliquez que vous divisez un dollar, puis chaque personne reçoit 33 cents et un sou est perdu en arrondissant. N'importe qui peut comprendre cela.
Inca
4
Ne vous embêtez pas avec la calculatrice. Divisez 1 par 3 sur du papier, en gardant trois chiffres significatifs.
David Thornley
5
@omegacentauri si vous pensez que l'explication aide, je suppose que vous ne parlez pas souvent aux clients.
jhocking
5

Je ne pense pas qu'il y ait de raccourcis. Vous devez soit:

  • Comprenez ce qu'est la virgule flottante et comment elle se comporte.

Ou, si cela est trop exigé, vous devez simplement:

  • Acceptez que l'ordinateur ne vous donne pas de résultats numériques exacts.

Peut - être un exemple avec des nombres irrationnels aide (même si les problèmes de virgule flottante appliquent aux nombres rationnels ainsi): sqrt(2) ~ 1.414. Alors 1.414^2 = 1.999396. Peu importe le nombre de chiffres que vous prenez, vous ne reviendrez jamais tout à fait à l'original 2. Ok, 4 chiffres significatifs corrects peuvent être acceptables, mais réfléchissez à ce qui se passe lorsque ce type d '"erreurs d'arrondi" s'accumule. C'est là que se trouve le vrai danger.

Joonas Pulakka
la source
2
Personnellement, je sais et je comprends, mais pour certaines personnes, le terme "virgule flottante" est déjà un terme étranger, vous avez donc besoin de plus que des explications mathématiques ou scientifiques pour expliquer que ce qu'ils peuvent calculer directement dans leur tête, leurs ordinateurs et logiciels coûteux ont du mal à bien faire les choses ;) La racine carrée est également en dehors du domaine quotidien des clients réguliers.
Eric Grange
5

Tout d'abord, déterminez de quoi ils se plaignent. Les transactions financières doivent être effectuées avec précision, avec le bon nombre de décimales et les bonnes règles d'arrondi. Cela signifie généralement maintenir des nombres entiers d'unités monétaires et s'assurer que l'arithmétique est bien faite.

Alternativement, ils peuvent se plaindre d'affichages surexactes et réduire le nombre de chiffres significatifs en sortie peut être tout ce qui est nécessaire.

Pour les nombres en général, vous pouvez toujours essayer de trouver un x décimal à trois chiffres tel que x * 3 soit 10. Cela montre les principes de base.

Il reste deux problèmes. La première est que certains nombres peuvent être exprimés exactement en décimal mais pas en binaire (3,15, par exemple). Cela va être difficile à expliquer aux personnes non techniques, et votre meilleur pari est d'essayer de l'éviter en ne fournissant pas suffisamment de chiffres significatifs pour qu'il apparaisse. L'autre est le client qui en sait un peu, assez pour savoir que l'arithmétique informatique n'est pas toujours exacte et pas assez pour réaliser que l'arithmétique décimale n'est pas toujours exacte. J'en ai discuté avec quelques-uns et je n'ai rien d'utile à signaler.

David Thornley
la source
3

Les nombres à virgule flottante dans les ordinateurs utilisent le binaire, donc tout comme nous avons un système de nombres avec des colonnes un, des dizaines, des centaines et des dixièmes, des centièmes, les nombres à virgule flottante dans les ordinateurs ont en fait un, deux, quatre et deux moitiés, des quarts et huitièmes colonnes. Si le client est familier avec les pieds / pouces, rappelez-lui comment vous utilisez généralement les fractions de base 2 d'un pouce pour la mesure.

Essayez maintenant de stocker 10 cents comme une combinaison de moitiés, trimestres, huitièmes de dollar. Cela ne fonctionne tout simplement pas:

.00011001100110011. . . (se répète à l'infini )

C'est la même chose que de prendre un ruban à mesurer impérial standard et d'essayer de mesurer un dixième de pouce. Vous ne pouvez pas le faire avec précision. Il n'y a pas de représentation de 1/10 comme X / Y où X et Y sont des nombres entiers et Y est une puissance de 2.

C'est pourquoi nous avons les types de données décimaux qui utilisent 4 bits pour stocker chaque chiffre décimal , nous sommes donc de retour à la représentation en base 10. Le compromis est dans l'espace et la performance (environ 100% de performance, d'après ce que j'ai lu).

Scott Whitlock
la source
1

Dites-leur que, tout comme leur compte bancaire ne peut pas contenir 4,4423425908459032890413 ... dollars (c'est soit 4,44 $ soit 4,45 $, rien entre les deux), l'ordinateur ne peut pas facilement stocker un numéro avec une précision arbitraire. Les imperfections de stockage conduisent à des imperfections de calculs.

(Il triche légèrement, mais devrait leur donner une idée du problème.)

quant_dev
la source
2
Hélas, cette explication ne fonctionne pas, car le problème de précision peut se produire lors de la sommation de nombres qui n'ont tous que deux chiffres de précision pour commencer.
Eric Grange
1
Deux chiffres décimaux . Oui, je suis d'accord, un client curieux y repérera des trous. Mais alors vous pouvez les frapper avec la discussion sur la représentation binaire - ils l'ont demandé ;-)
quant_dev
Eh bien, déjà en essayant d'expliquer la virgule flottante, l'IME commence immédiatement à penser que vous essayez de les embrouiller, ce qui pourrait être atténué si cela venait en termes simples et compréhensibles, ou d'une institution ou d'une société bien connue. :)
Eric Grange
1
@Eric Math est difficile, allons jouer au baseball: P
quant_dev
1
Demandez s'il est plus précis de mesurer quelque chose au 1/10 "ou au millimètre près. Ce dernier est plus précis, mais les objets qui sont un multiple précis de 0,1" ne seront pas un multiple précis de 1 mm à moins qu'ils ne soient également multiple précis de 5 "(précisément 127 mm). L'ajout de la taille de deux objets de 2,54 mm mesurés à 0,1" près donnera une taille combinée de 0,2 "; l'ajout des tailles arrondies au millimètre près donnera 6 mm même si le la taille réelle doit être de
5,08 mm
1

2/3

Demandez-leur d'écrire la réponse exacte à deux divisée par 3.
Puisque la réponse «continue pour toujours», vous pouvez le signaler.

L'utilisation de 1/3 fonctionnerait également, mais 2/3 est peut-être un meilleur exemple car l'arrondi vous donne (par exemple) .6666667 alors que .3333333 semble pouvoir être tronqué.

Michael Durrant
la source
0

Lors des calculs, les ordinateurs utilisent généralement des approximations de nombres (comme plutôt que d'utiliser 1000000.7, ils utilisent 1000000) car l'utilisation d'approximations est beaucoup plus rapide. Le problème est que lorsque vous effectuez des calculs avec des approximations, vous obtenez des approximations. Habituellement, cela fonctionne assez bien, mais parfois cela conduit à des résultats inattendus.


la source
Je ne comprends pas vraiment ce que vous dites ici. "Parce que l'utilisation d'approximations est beaucoup plus rapide"? Parfois, l'arithmétique entière est au moins aussi rapide, et c'est précis. Parfois, il n'y a pas d'alternative (comme pour imprimer la racine carrée de 2).
David Thornley
Eh bien, vous essayez d'expliquer à un spécialiste du marketing pourquoi les ordinateurs ne peuvent pas réellement représenter des nombres irrationnels, ou fondamentalement n'importe quel nombre dans le grand schéma des choses (oh et alors vous voudrez peut-être lui donner une brève conférence sur l'irrationalité de \ pi: quelque chose sur La série de Fourier pourrait être mignonne). Approximatif est un mot que les gens peuvent comprendre. Vous approchez cela du point de vue de quelqu'un qui sait que tous les nombres ne sont pas égaux.
0

Certains calculs sont effectués selon une règle légale. Par exemple, si vous souhaitez calculer le montant de l'impôt sur le revenu à payer sur un revenu annuel imposable de 79.245,18 € en Allemagne, il n'y a qu'une seule bonne réponse. Vous vous trompez ou vous vous trompez. Si vous avez raison, vous n'avez pas besoin d'expliquer le fonctionnement de l'arithmétique à virgule flottante. Si vous vous trompez, vous n'avez pas besoin d'expliquer comment fonctionne l'arithmétique à virgule flottante, vous devez corriger votre code cassé.

Parfois, vous affichez des résultats qui ne semblent pas corrects. Par exemple, si vous convertissez 13 297,46 $ US en UK £ avec deux chiffres décimaux, puis reconvertissez ce montant de UK £ en US $, vous pourriez ne pas obtenir 13 297,46 $ US mais 13 297,45 $ US ou 13 297,47 $ US. Cela n'a rien à voir avec l'arithmétique à virgule flottante. C'est un problème inévitable et vous feriez mieux de pouvoir expliquer pourquoi il est inévitable. (Vous devez également savoir pourquoi le problème ne se produit pas lorsque vous convertissez de UK £ en US $ et vice-versa).

Il existe d'autres résultats possibles qui ne semblent pas corrects. Si vous convertissez des nombres en pourcentages, les pourcentages doivent totaliser 100%, mais ils pourraient ne pas l'être. Si vous affichez quatre pourcentages avec deux décimales, les quatre pourcentages affichés peuvent totaliser 99,99% ou 100,01%. Rien à voir avec l'arithmétique à virgule flottante. Vous devriez toujours pouvoir expliquer pourquoi.

Ensuite, il existe des situations où l'utilisation imprudente de l'arithmétique à virgule flottante conduit à des résultats inappropriés. Par exemple, a + b + c n'est généralement pas identique à b + c + a. Si cela pose problème, il n'y a rien à expliquer, c'est quelque chose que vous corrigez.

gnasher729
la source