[Python-ideas] checking for identity before comparing built-in objects

Mark Dickinson dickinsm at gmail.com
Fri Oct 12 22:46:00 CEST 2012


On Fri, Oct 12, 2012 at 8:42 PM, Tim Peters <tim.peters at gmail.com> wrote:
> In part it's to preserve various identities, such as that
> sqrt(conjugate(z)) is the same as conjugate(sqrt(z)).  When z is +0,
> that becomes
>
>     sqrt(conjugate(+0)) same_as conjugate(sqrt(+0))
>
> which is
>
>     sqrt(-0) same_as conjugate(+0)
>
> which is
>
>     sqrt(-0) same as -0
>
> Conviced?

Not really. :-)  In fact, it's exactly that paper that made me think
sqrt(-0.0) -> -0.0 is suspect.

The way I read it, the argument from the paper implies that
cmath.sqrt(complex(0.0, -0.0)) should be complex(0.0, -0.0), which I
have no problem with---it makes things nice and neat:  quadrants 1 and
2 in the complex plane map to quadrant 1, and quadrants 3 and 4 to
quadrant 4, with the signs of the zeros making it clear what
'quadrant' means in all (non-nan) cases.  But I don't see how to get
from there to math.sqrt(-0.0) being -0.0.

It's exactly the mismatch between the real and complex math that makes
no sense to me:  math.sqrt(-0.0) should resemble
cmath.sqrt(complex(-0.0, +/-0.0)).  But the latter, quite reasonably,
is complex(0.0, +/-0.0) (at least according to both Kahan and C99
Annex G), while the former is specified to be -0.0 in IEEE 754.

-- 
Mark



More information about the Python-ideas mailing list