On Mon, Oct 14, 2019 at 3:46 PM Andrew Barnert via Python-ideas
On Oct 13, 2019, at 18:39, Steven D'Aprano
wrote: Even when the class can be identified as equivalent to its set of values, such as for numeric types, there are all sorts of complexities that will only lead to confusion:
from numbers import Real 1.0 in Real # okay, unproblematic 2+3j in complex # also okay 1 in complex # mathematically true, but isinstance-wise false float('INF') in Real # isinstance-wise true, but mathematically false.
I agree with your conclusion, but I think this is the wrong way to argue it.
`1 in complex` is _not_ mathematically true. Simplifying a bit, the elements of the algebra of complex numbers are ordered pairs of real numbers, and `1` is not a pair. When you’re working in, say, complex analysis, you just assume the usual morphism that maps every real to a unique complex (and some complexes to a unique real), and you can loosely multiply a real by a complex and so on. But when you’re working on the actual algebras or the sets/types beneath them, you can’t do that. `R` is not a subset of `C`, and `1 in C` is just not true. In other words, the distinction in Python—that 1 and 1+0j are in some sense “the same number” but in another sense not even the same type of number—is exactly the same as in math; you don’t need anything extra to justify it.
Mathematically, what's the difference between '1' and '1+0j' (or '1+0i')? Everything I've seen has said that a complex number with its imaginary part zero is equivalent to a real number, which would mean that '1' is as valid a way of representing that number as any other. It's the same as considering 42 to be rational, because it can be written as 42/1. You're absolutely right that Python's floats aren't actually representing reals (aside from inf/nan, they're all rationals), but I don't see a problem with calling 1 a member of the Complex numbers, as Python does:
isinstance(1, numbers.Complex) True
Explain the difference? ChrisA