CTFE pow()
Don via Digitalmars-d
digitalmars-d at puremagic.com
Fri Jan 2 05:33:39 PST 2015
On Friday, 2 January 2015 at 08:52:47 UTC, Daniel Murphy wrote:
> "Xinok" wrote in message
> news:pbjttgrpwhsffoovpida at forum.dlang.org...
>
>> I'm wondering if there's any added benefit to implementing
>> these as intrinsic functions instead? In this way,
>> implementing them in CTFE should be trivial and the extra
>> knowledge given to the compiler could enable extra
>> optimizations that wouldn't be possible otherwise. For
>> example, the compiler understands multiplication and division
>> so, in certain cases, it can replace these operations with
>> bit-shifting which is faster.
>
> I was just about to suggest this. Another easy way might be to
> just add get/set mantissa/exponent intrinsics and use those in
> the ctfe versions.
Right. The problem with allowing casts between integers and
floating point, is that then someone can create a pointer to some
of the bits of the float. And that's a can of worms. It enables
behaviour that is both complicated, and useless.
BTW in the existing CTFE you can cast int <-> float and long <->
double.
So you can implement pow for 64 bit floats already. It's only
80-bit reals that are a problem, because there is no integer type
that is large enough. So it's really an X86-specific problem.
I did suggest allowing the specific casts for getting and setting
the exponent and significand, eg:
ushort exponent = (cast(ushort *)cast(void*)&f)[4];
ulong significand = *(cast(ulong *)cast(void *)&f);
which would give you everything you need. It's really an
intrinsic with very very ugly syntax.
But Iain was pretty unhappy with that idea, IIRC. I think
treatment of real is very difficult for GDC already.
More information about the Digitalmars-d
mailing list