floating point verification using is?

bearophile bearophileHUGS at lycos.com
Fri Dec 18 13:15:30 PST 2009


4th try, getting there, this helps if in your compiler real == double:

import std.traits: isFloatingPoint;
import std.c.stdio: printf;

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
            ubyte[T.sizeof] data;
    }
    static FPData fnan, fpd;
    fpd.f = x;
    return fnan.data == fpd.data;
}

void main() {
    printf("%d\n", isInitNaN(2.5f));
    printf("%d\n", isInitNaN(2.5));
    printf("%d\n", isInitNaN(2.5L));

    float xf;
    printf("%d\n", isInitNaN(xf));
    xf = 2.5;
    printf("%d\n", isInitNaN(xf));

    double xd;
    printf("%d\n", isInitNaN(xd));
    xd = 2.5;
    printf("%d\n", isInitNaN(xd));

    float xr;
    printf("%d\n", isInitNaN(xr));
    xr = 2.5;
    printf("%d\n", isInitNaN(xr));
}


More information about the Digitalmars-d-learn mailing list