On Fri, 18 Dec 2009 21:47:22 -0500, bearophile <bearophileh...@lycos.com> wrote:

Unfortunately the asm produced by ldc shows the call to the array equality function still. Fifth try:


bool isInitNaN(T)(T x) if (isFloatingPoint!T) {
    union FPData {
        T f;

        static if (T.sizeof == uint.sizeof) {
            uint data;
        } else static if (T.sizeof == ulong.sizeof) {
            ulong data;
        } else static if (T.sizeof == 10) {
            ulong data1;
            ushort data2;
        } else static if (T.sizeof == 12) {
            ulong data1;
            uint data2;
        } else static if (T.sizeof == 16) {
            ulong data1;
            ulong data2;
        } else {
            ubyte[T.sizeof] data;
        }
    }

    static FPData fnan, fpd;
    fpd.f = x;

    static if (T.sizeof == 10 || T.sizeof == 12 || T.sizeof == 16)
        return fnan.data1 == fpd.data1 && fnan.data2 == fpd.data2;
    else
        return fnan.data == fpd.data;
}

Bye,
bearophile

Are you still working on this? :) I think this proves my point. The compiler does not provide an easy way to compare floats bitwise, so this means convoluted hard-to-write code. When we have two operators that do equality -- and one of those means bitwise compare in all other contexts -- I think this is a no-brainer.

-Steve

Reply via email to