if (abs (a-b) < EPS) . . .
Ils ont naïvement choisi le même nombre 1e-8 pour tous leurs projets, créant ainsi une place potentielle pour des erreurs graves. De plus, ils ont essayé de comparer deux doubles comme ceci:
if (a < b) . . .
ne pas comprendre pourquoi je les ai grondés quand j'ai vu de telles absurdités. Je ne parle même pas de l'horreur une constante comme 0x400921fb54442d18 (juste un nombre ) que l'on peut voir dans certains programmes plus anciens ou sur l'écran du débogueur.
Une fois dans le processus de débogage, un collègue a découvert que l'expression avec double ne change pas lorsqu'il essaie d'ajouter deux nombres, puis il a commencé à pécher sur une erreur dans le compilateur ou le débogueur, jusqu'à ce que j'explique dans quels cas la somme de deux nombres restera égale à un seul des termes ...
Les astuces de permutation de nombres sont également effrayantes pour beaucoup, et sur StackOverflow, j'ai souvent vu des questions perplexes de la part des utilisateurs sur les raisons pour lesquelles un petit changement dans une expression conduit à des résultats différents et pourquoi l'optimisation du code peut conduire à une réponse complètement fausse. Une fois, l'un des utilisateurs a déclaré ostensiblement qu'il avait trouvé une erreur dans le processeur en convertissant un entier de 64 bits en un nombre à double précision, puis en arrière - et en obtenait un autre nombre. Il ne savait apparemment pas comment au moins 11 bits sont perdus avec une telle conversion. Et une telle ignorance se trouve même parmi ceux qui sont sûrs qu'il sait juste comment tout fonctionne.
Même sur Habré, il y a souvent des articles dans lesquels les auteurs "exposent" le comportement incompréhensible des nombres à virgule flottante et font passer leur découverte comme quelque chose de nouveau et d'inconnu, de non évident et de mystérieux. Il est étrange de voir de tels articles écrits par des programmeurs apparemment professionnels. Je ne les publierai pas, veuillez les rechercher vous-même.
Il semblerait que divers matériels de formation devraient résoudre le problème, mais non. En règle générale, le lecteur est effrayé par les formules et les mots incompréhensibles, que l'auteur lui lance immédiatement: nombre normalisé , unité cachée , exposant biaisé- puis, sans expliquer les raisons pour lesquelles une solution particulière est apparue dans la norme IEEE-754, une présentation sèche de la théorie commence. Les conférences vidéo sur ce sujet ne brillent pas non plus de variété: tout le monde semble analyser le même exemple primitif, où tout se passe rapidement et magnifiquement ... et l'étudiant ne devinera jamais que presque 100% des compilateurs travaillent avec l'arithmétique flottante avec des erreurs. C'est compréhensible, ces enseignants eux-mêmes ne savent pas ce qui vient et comment cela fonctionne, et ne disent donc que ce qu'ils comprennent eux-mêmes, et il est tout à fait évident qu'ils ont eux-mêmes découvert hier seulement le monde de l'arithmétique en virgule flottante, mais ils sont déjà pressés confus parlez de lui. Je ne blâme pas, mais je pense qu'un tel comportement en public est inacceptable.
J'ai donc décidé d'essayer de corriger la situation et de créer, dans un sens, un procèsformation. Il s'agit d'un cours vidéo qui plonge en douceur le spectateur dans le monde de l'arithmétique en virgule flottante. Les quatre premières leçons nous regardons le système de nombres décimaux et comment les circonstances nous forcent à créer un ou un autre système de nombres, aboutissant finalement à un système à virgule flottante sous cette forme. D'où vient la normalisation et pourquoi est-elle nécessaire? D'où vient le problème d'associativité? Comment et pourquoi la précision est-elle perdue et que faire à ce sujet? Qu'est-ce qu'il est absolument interdit de faire et pourquoi? Pourquoi les nombres dénormalisés apparaissent-ils dans un tel système et de quoi s'agit-il? Ensuite, les 4 leçons suivantes montrent comment toutes ces connaissances s'intègrent parfaitement dans l'arithmétique binaire et d'où vient l'idée du bit caché. Lorsque la première "formule terrible" apparaît à l'écran,le spectateur a déjà l'image nécessaire de l'arithmétique en virgule flottante dans sa tête et comprend facilement la logique d'une telle formule ... bien sûr, s'il a effectué les exercices correctement. Toutes ces 8 leçons sont la première partie du cours, c'est pour les débutants. Le second sera destiné aux programmeurs avancés et est actuellement en cours de développement.
Pourquoi la vidéo et non le texte? L'explication est simple: j'ai essayé différents formats et j'ai eu du mal à lire pour les débutants. Quiconque sait lire attentivement ouvrira le manuel et lira le texte avec des formules, comprendra et comprendra. Pour ceux qui ont du mal à lire, qui ont peur des choses difficiles et qui trouvent plus facile d'étudier le matériel autour d'une tasse de thé, une immersion fluide au format vidéo avec voix off convient. Beaucoup d'eau? Oui, c'est possible, mais le cours est conçu même pour ceux qui veulent programmer, mais qui n'étaient pas amis avec les mathématiques à l'école. Par conséquent, ce que «l'eau» pour vous n'est pas de l'eau, mais ce que vous savez déjà bien de l'école, et beaucoup de mes élèves ne le sont pas. Soyez condescendant envers eux, nous avons tous commencé quelque part. Et la vidéo peut également être considérée comme une préparation à la lecture de manuels sérieux. D'accord, c'est bien d'ouvrir un manuel et de comprendre ce qui y est écrit beaucoup plus rapidement,puisque l'image désirée est déjà dans la tête.
À propos de moi: ancien professeur professionnel, 11 ans dans une université, enseigné les mathématiques et la programmation, ces dernières années j'ai développé des bibliothèques mathématiques pour le calcul haute performance. Je comprends bien ce que veut mon public cible, et je comprends bien ce qui est demandé sur ce sujet dans le monde de la programmation, et donc je crois que j'ai le droit de créer de tels cours, et vous pouvez voir par vous-même que des conférences de qualité similaire (en termes de contenu ) sur vous ne trouverez pas le russe maintenant. Vérifiez-le! Les quatre premières leçons, dont vous apprendrez déjà beaucoup de choses intéressantes, sont totalement gratuites. Si vous le souhaitez, vous pouvez passer par le reste, ils sont encore plus intéressants, mais moyennant des frais. Le travail de quelqu'un d' autre doit être respecté: je ne suis pasJe vends des connaissances, mais j'ai besoin de soutien pour continuer mon travail éducatif, donc mon temps vaut de l'argent. En général, vous pouvez tirer des conclusions sur la qualité de mon travail à partir de mes autres articles sur Habré.
Pour ceux qui rejoignent notre communauté VK, je peux offrir une réduction de 50% si vous contactez le PM. Veuillez vous inscrire à ZealComputing School (c'est gratuit) et regarder les 4 premières leçons. Ou ils sont sur YouTube (le premier est ici - et plus loin sur les liens de la description). Oui, vous n'avez pas besoin de regarder la vidéo d'introduction vers laquelle je crée un lien, c'est juste une publicité.
Résumé des leçons payantes
Leçon n ° 5 : Passons au système de nombres binaires pour la première fois. Nous construisons un beau et simple modèle à virgule flottante 6 bits qui est très proche du format IEEE-754. C'est la leçon la plus importante et la plus difficile. Les quatre leçons précédentes ont été conçues pour montrer d'où viennent certaines choses en arithmétique en virgule flottante, et maintenant vous comprenez comment ces choses apparaissent magnifiquement au format IEEE-754 en utilisant un exemple jouet et compréhensible.
Leçon numéro 6: Présentation de l'arrondi. Ce n'est pas aussi évident que dans les mathématiques habituelles. Vous apprendrez ce qu'il est difficile de voir dans les exemples les plus simples fournis par d'autres professeurs de vidéo. À savoir: il est parfois difficile de convertir un nombre du système de nombres décimaux au format IEEE-754 à tel point que certains compilateurs ne peuvent pas le faire correctement. J'expliquerai en détail pourquoi tout est si simple en théorie, mais pas en pratique.
Leçon numéro 7: Ici vous maîtrisez parfaitement les formats binary32 et binary64 (float et double), montrez comment vous pouvez afficher la représentation binaire des nombres en C ++ (dans d'autres langues c'est également possible, mais pas dans tout, là je vous renvoie à Google ou Yandex et montre à quel point c'est simple, par exemple, trouvez une solution Java). Après cette leçon, la structure des nombres à virgule flottante (si vous avez bien fait les exercices) est tout à fait claire pour vous et ne peut pas soulever des questions auxquelles on n'a pas répondu dans les leçons précédentes.
Leçon numéro 8: Un guide pratique sur l'utilisation de l'arithmétique en virgule flottante. Certaines des caractéristiques déjà décrites et de nouveaux points: la perte de commutativité, d'associativité, des manifestations inattendues de la soi-disant «équanimité». Et le conseil le plus important! Ces conseils vous aideront à éviter presque 100% de toutes les erreurs dans les tâches non critiques typiques. Vient ensuite la discussion sur la double erreur d'arrondi, la perte catastrophique de chiffres significatifs: quand et comment elle se produit. En général, toutes les pratiques simples qui ne nécessitent pas de mathématiques avancées sont décrites dans cette leçon.
Qu'est-ce qui est inclus dans le cours? Et rien de plus n'est nécessaire! Vous pouvez me poser des questions sur les leçons, mais je suis sûr qu'elles ne se poseront pas. Chaque leçon contient des exercices complets avec des réponses, donc ma participation en général n'est pas requise, d'où le prix bas. Un cours complet avec instructeur, communication, atelier encadré et conférences en direct coûterait dix fois plus cher.
Bon apprentissage!