Negative Zero

Originally published by Howdy Pierce on November 17th 2017 6,483 reads
Bonjour Pierce Hacker photo de profil de midi

div>

@howdypierceHowdy Pierce

Président et fondateur

icône sociale facebookIcône sociale Twitter

Ma femme évoque l’histoire suivante chaque fois qu’elle veut faire valoir que Je suis pédant: Quand une de mes filles était en deuxième année, son professeur de mathématiques a dit à la classe que tout nombre divisé par zéro était un. J’ai envoyé un courriel passionné à l’enseignant, insistant sur le fait que le résultat devait être indéfini. Soi-disant, c’est la preuve que je suis parfois difficile à côtoyer.

Il s’avère que la blague pourrait être sur moi — même s’il est toujours difficile de soutenir la réponse de l’enseignant de deuxième année. J’ai récemment appris un tas de choses que je ne savais pas sur les mathématiques à virgule flottante:

  • Il y a une valeur pour zéro négatif, distincte de régulière (positive?) zéro. Ces deux zéros sont définis pour être égaux l’un à l’autre et pourtant ce sont des valeurs distinctes.
  • x ÷ 0,0, pour x ≠ ±0.0, n’est pas une erreur. Au lieu de cela, le résultat est soit l’infini positif, soit l’infini négatif, suivant la convention de signe habituelle.
  • Le cas de ±0,0 ÷ ±0,0 est une erreur (plus précisément, ce n’est pas un nombre ou NaN).
  • -0.0 + -0.0 = -0.0, -0.0 + 0.0 = 0.0, et -0,0 × 0,0 =-0,0

Ces règles découlent de la « Norme IEEE 754 pour l’Arithmétique à virgule flottante », qui normalise les représentations à virgule flottante sur toutes les plates-formes. La version la plus récente de la norme a été achevée en 2008 mais la version originale a été publiée en 1985, ce comportement n’est donc pas nouveau. Les règles ci-dessus sont vraies à la fois dans C (gcc) et Swift sur mon Mac, et également dans Swift sur un iPhone. Python sur Mac prend en charge le zéro négatif pour les flottants, mais lève une exception lorsque vous essayez de diviser par zéro un signe quelconque.

Il y a quelques corollaires surprenants à ces règles:

  • Car 0.0 et -0.0 doivent se comparer comme égaux, le test (x <0.0) ne renvoie pas true pour chaque nombre négatif — il échoue pour le zéro négatif. Par conséquent, pour déterminer le signe d’une valeur nulle, vous devez utiliser la fonction de signe intégrée à la plate-forme, par exemple Double.connectez-vous rapidement. Ou je suppose que vous pourriez manipuler la représentation brute du double, ce qui est très bien la réponse d’un programmeur C.
  • Si a = b ÷ c, cela ne suit pas nécessairement que b = a × c, car cela échoue également dans le cas où c est zéro de l’un ou l’autre signe.

Je ne suis pas un théoricien des nombres, mais je trouve les concepts ci-dessus surprenants.

Un problème immédiat: L’infini n’est pas un nombre, comme zéro ou 3,25 ou π. Au contraire, l’infini est un concept. Il est vrai que les nombres rationnels sont dénombrables à l’infini – mais l’infini n’est pas un membre de l’ensemble des nombres rationnels.

De plus, du point de vue de la théorie des nombres, la division par zéro est absurde. Vous pouvez comprendre pourquoi si vous êtes précis sur ce que signifie division. Techniquement, « division » est ”multiplication par l’inverse d’un nombre », où l’inverse satisfait : a × a^-1 = 1. Zéro est le seul nombre de l’ensemble des nombres réels qui n’a tout simplement pas d’inverse multiplicatif. Et puisque cet inverse n’existe pas, nous ne pouvons pas le multiplier.

Mais les personnes qui ont conçu des nombres à virgule flottante savaient sûrement tout cela. Je me suis donc demandé pourquoi le comportement décrit a été écrit dans la norme IEEE.

Pour commencer, considérons le problème que les mathématiques à virgule flottante tentent de résoudre. Les nombres réels sont infinis, et pourtant nous souhaitons représenter cet ensemble entier dans les limites de la mémoire finie de l’ordinateur. Avec un double 64 bits, il y a 2 ^ 64 symboles possibles, et les concepteurs de la norme IEEE essayaient de mapper ces symboles sur l’ensemble des nombres réels d’une manière à la fois utile pour les applications du monde réel et économiquement réalisable compte tenu des contraintes du silicium du début des années 80. Compte tenu des exigences de base, il est clair que des approximations allaient être utilisées.

Le raisonnement pour le zéro négatif semble dater d’un article de 1987 de William Kahan, un professeur de Berkeley qui est considéré comme le « père de la virgule flottante” et qui a plus tard remporté le prix Turing pour son travail dans la rédaction de l’IEEE 754. Il s’avère que l’existence du zéro négatif est intimement liée à la capacité de diviser par zéro.

Commençons par discuter de la raison habituelle pour laquelle la division par zéro n’est pas autorisée. Une approche naïve de la division par zéro est l’observation que:

En d’autres termes, à mesure que x devient plus petit, le résultat de 1 / x devient plus grand. Mais cela n’est vrai que lorsque x s’approche de 0 du côté positif (c’est pourquoi il y a ce petit signe plus ci-dessus). Exécuter la même expérience de pensée du côté négatif:

En conséquence, la limite générique de 1 / x lorsque x se rapproche de 0 n’est pas définie, car il y a une discontinuité (ce que Kahan appelle une fente) dans la fonction 1 / x.

p>

Cependant, en introduisant un zéro signé, Kahan et le comité de l’IEEE pourraient contourner la difficulté. Intuitivement, le signe d’un zéro est pris pour indiquer la direction à partir de laquelle la limite est approchée. Comme l’indique Kahan dans son article de 1987:

Plutôt que de considérer +0 et -0 comme des valeurs numériques distinctes, considérez leur bit de signe comme une variable auxiliaire qui transmet un bit d’information (ou de désinformation) sur toute variable numérique qui prend 0 comme valeur. Habituellement, cette information n’est pas pertinente; la valeur de 3 + x n’est pas différente pour x: = + 0 que pour x: = -0 …. Cependant, quelques opérations arithmétiques extraordinaires sont affectées par le signe de zéro ; par exemple 1/(+0) = +∞ mais 1/(-0) =–∞.

J’ai fait ma paix avec le concept en adoptant une rationalisation proposée par mon partenaire Mike Perkins : Les 2^64 symboles disponibles sont clairement inadéquats pour représenter l’ensemble de l’ensemble des nombres réels. Ainsi, les concepteurs de l’IEEE ont mis de côté quelques-uns de ces symboles pour des significations spéciales. En ce sens, ∞ ne signifie pas vraiment « infini » — au contraire, cela signifie « un nombre réel qui est plus grand que ce que nous pouvons représenter autrement dans notre ensemble de symboles à virgule flottante. »Et donc +0 ne signifie pas vraiment « zéro », mais plutôt « un nombre réel qui est plus grand que le vrai 0 mais plus petit que tout nombre positif que nous pouvons représenter. »

Incidemment, en faisant des recherches sur ce problème, j’ai découvert que même Kahan n’aime pas l’idée du zéro négatif:

Signé zéro — eh bien, le zéro signé était une douleur dans le cul que nous pourrions éliminer si nous utilisions le mode projectif. S’il n’y avait qu’un infini et un zéro, vous pourriez très bien faire; alors vous ne vous souciiez pas du signe de zéro et vous ne vous souciiez pas du signe de l’infini. Mais si, d’un autre côté, vous avez insisté sur ce que j’aurais considéré comme le choix le moins élevé de deux infinis, alors vous allez vous retrouver avec deux zéros signés. Il n’y avait vraiment pas de moyen de contourner cela et tu étais coincé avec ça. » (D’après une interview de Kahan réalisée en 2005.)

Je ne suis pas certain que l’écriture d’un article de blog dix ans plus tard compense un mauvais prof de deuxième année. Pour sa part, ma fille, maintenant au lycée, a juste roulé des yeux quand j’ai commencé à parler de division par zéro au dîner. Alors peut-être que cette chose « difficile à côtoyer” est héréditaire.

Kahan, W., « Branch Cuts for Complex Elementary Functions, or Much Ado About Nothing’s Sign Bit”, The State of the Art in Numerical Analysis, (Éd. Iserles et Powell), Clarendon Press, Oxford, 1987, disponible ici.

Tags

Join Hacker Noon

Create your free compte pour débloquer votre expérience de lecture personnalisée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *