Fixing the imaginary/complex mess
Georg Wrede
georg.wrede at iki.fi
Mon May 4 03:16:49 PDT 2009
Don wrote:
> Walter Bright wrote:
>> Don wrote:
>>> I don't think anyone expects to be able to divide an integer by an
>>> imaginary, and then assign it to an integer. I was astonished that
>>> the compiler accepted it.
>>
>> There actually is a reason - completeness. Mathematically, there is a
>> definite answer to it, so why not fill in all the entries for all the
>> combinations?
>
> In the case complex = int/complex, there's no problem. It's the case int
> = int/complex that doesn't make sense.
> And that's fundamentally because cast(real)(2 + 3i) doesn't have a
> definite answer.
> There's no mathematical operation to convert a complex number to a real.
> Normally, to get a real result, you need to do something like
> multiplying by the complex conjugate. You CAN take the real part of a
> complex number, and you can also take the modulus (which makes a lot of
> sense if you're using polar represantation).
>
> Of course, cast() is not a mathematical operation, it's a D operation,
> so we can define it however we like. But defining it
> cast(real)z = z.re;
> is an arbitrary decision, which introduces lots of complexity to the
> language, and the many compiler bugs are a consequence.
> It's confusing for newbies (there's been questions on D.learn asking, "I
> can get the real part of a complex number with cast(real), but how do I
> get the imaginary part? cast(ireal) gives me an ireal, not a real!").
>
> Since D supports the very nice .re syntax, there's really no reason to
> define cast(real) at all. z.re is better in 100% of use cases. There are
> *NO* use cases for cast(real); any use of cast(real) is a bug. We should
> kill it.
Walter, could the error message then include "Please use z.re or z.im to
get the parts, instead of a cast." or something. Otherwise we have to
explain to all users separately what's going on, /and/ that the omission
of implementing the cast in D isn't an omission.
More information about the Digitalmars-d
mailing list