[Python-Dev] Why is nan != nan? (original) (raw)

Mark Dickinson dickinsm at gmail.com
Thu Mar 25 14:17:44 CET 2010


On Thu, Mar 25, 2010 at 12:36 PM, Jesus Cea <jcea at jcea.es> wrote:

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1

On 03/25/2010 07:54 AM, Georg Brandl wrote:

float('nan') in [float('nan')] False Sure, but just think of it as having two different nans there.  (You could imagine thinking of the id of the nan as part of the payload.) That's interesting.  Thinking of each value created by float('nan') as a different nan makes sense to my naive mind, and it also explains nicely the behavior present right now.  Each nan comes from a different operation and therefore is a "different" non-number. Infinites are "not equal" for a good reason, for example.

Well, that depends on your mathematical model. The underlying mathematical model for IEEE 754 floating-point is the doubly extended real line: that is, the set of all real numbers augmented with two extra elements "infinity" and "-infinity", with the obvious total order. This is made explicit in section 3.2 of the standard:

"The mathematical structure underpinning the arithmetic in this standard is the extended reals, that is, the set of real numbers together with positive and negative infinity."

This is the same model that one typically uses in a first course in calculus when studying limits of functions; it's an appropriate model for dealing with computer approximations to real numbers and continuous functions. So the model has precisely two infinities, and 1/0, 2/0 and (1/0)**(1/0) all give the same infinity. The decision to make 1/0 "infinity" rather than "-infinity" is admittedly a little arbitrary. For floating-point (but not for calculus!), it makes sense in the light of the decision to have both positive and negative floating-point zeros; 1/(-0) is -infinity, of course.

Other models of "reals + one or more infinities" are possible, of course, but they're not relevant to IEEE 754 floating point. There's a case for using a floating-point model with a single infinity, especially for those who care more about algebraic functions (polynomials, rational functions) than transcendental ones; however, IEEE 754 doesn't make provisions for this.

Mark



More information about the Python-Dev mailing list