On Monday, 25 November 2013 at 22:54:03 UTC, Iain Buclaw wrote:
On 25 November 2013 21:44, IgorStepanov <wa...@mail.ru> wrote:
On Sunday, 24 November 2013 at 11:38:27 UTC, Iain Buclaw wrote:

https://github.com/D-Programming-Language/druntime/pull/663


This code is not portable only on CTFE part. (All those float manipulations
run at compile time)
I see three unportable aspects:
1. This code supports only 80bit real. What other formats we need to support? Can the compiler support operations on those (or more precise) formats? AFAIK dmd frontend perform all float operations in 80 bit real and
supports only x86.

The following IEEE 'real' formats are currently supported:
64 bit Big-endian  'double' (eg PowerPC)
128 bit Big-endian 'quadruple' (eg SPARC)
64 bit Little-endian 'double' (eg x86-SSE2)
80 bit Little-endian, with implied bit 'real80' (eg x87, Itanium). 128 bit Little-endian 'quadruple' (not implemented on any known processor!)

Non-IEEE 128 bit Big-endian 'doubledouble' (eg PowerPC) has partial support

At least support for these is a must:

version(LittleEndian)
{
    static assert(real.mant_dig == 53 || real.mant_dig==64
               || real.mant_dig == 113);
}
else
{
    static assert(real.mant_dig == 53 || real.mant_dig == 113);
}

128 bit doubledouble formats (real.mant_dig == 106) - are a future goal.


2. This code don't considers a float byte order. But compiler don't inform user code about float BO. There are LittleEndian/BigEndian versions for integers, but not for floats. You can add this versions on compiler and I'll
fix this aspect in druntime code.

There doesn't exist a machine where the most significant byte of a word is ordered differently to floats. See std.math if in doubt, as
this is already implemented.

3. FloatTraits. Yes, thay works only with x86. Please, get link to other supported float formats and I'll extend FloatTraits to those formats.


See std.math, which already has a cross-platform implementation of that template with the same name (that amazingly existed years ago).

I can't implement CTFE support of types more precise than x86 80bit real. A think, all IEEE floats will be successfully processed like float and double (with same algorithm). But until CTFE don't support float with real.mant_dig>64 I can't process this types. Resume: I'll modify FloatTraits, consider endianess and add assert(0) for too precise types.

Reply via email to