Fixing the imaginary/complex mess
Don
nospam at nospam.com
Thu Apr 30 21:16:11 PDT 2009
Andrei Alexandrescu wrote:
> Don wrote:
>> D currently allows some conversions between complex/imaginary types
>> and real types, which are highly dubious.
>>
>> Given creal z, ireal y, these casts are legal:
>> real x = cast(real)z;
>> x = cast(real)y; // always sets x==0, regardless of the value of y.
>> But I believe that should not be legal.
>>
>> For the first case, it should be written as: real x = z.re;
>> (which is shorter and clearer), and the second case is probably a bug,
>> and should be x = y.im; (unless the intention really was to set x=0!).
>>
>> By the same logic, we could have sqrt(-1)==0, since the real part is 0.
>>
>> The most important effect of disallowing these casts would be to fix a
>> host of bugs and wierd behaviour. All the A op= B operations involve a
>> cast to A. If those nonsensical casts become illegal, the nonsensical
>> op= operations become illegal automatically.
>>
>> Eg, ireal y;
>> y *= y; // mathematically nonsense, y*y is real, so can't be stored in
>> a pure imaginary type!
>>
>> There are a few segfault/ICE bugs (eg 718, 2839) which involve
>> int/=complex, an operation which never makes any sense anyway.
>>
>> I think we're just making problems for ourselves by allowing these
>> useless operations. I think they should be killed.
>> Does anyone object? (If not, I'll create a patch to do it; it's not
>> very difficult).
>
> Since you're looking into this already, I suggest we move for the kill
> and eliminate built-in complex.
I'd like to actually eliminate these operations from D1. Otherwise, I
can't see the related D1 bugs ever getting fixed. Any code which relies
on these operations is broken; I think there's an excellent chance that
there isn't any code using it.
Also, these operations would not be provided by a library class, so I
think it's a useful intermediate step.
We can't remove the complex types until we have a library solution.
More information about the Digitalmars-d
mailing list