64 lines
1.9 KiB
D
64 lines
1.9 KiB
D
// Compile this module without -O
|
|
|
|
import std.stdio: writeln, writefln;
|
|
import std.string: format;
|
|
import std.math: NaN, getNaNPayload;
|
|
|
|
void show(T)() {
|
|
static string toHex(T x) {
|
|
string result;
|
|
auto ptr = cast(ubyte*)&x;
|
|
foreach_reverse (immutable i; 0 .. T.sizeof)
|
|
result ~= format("%02x", ptr[i]);
|
|
return result;
|
|
}
|
|
|
|
enum string name = T.stringof;
|
|
writeln("Computed extreme ", name, " values:");
|
|
|
|
T zero = 0.0;
|
|
T pos_inf = T(1.0) / zero;
|
|
writeln(" ", name, " +oo = ", pos_inf);
|
|
|
|
T neg_inf = -pos_inf;
|
|
writeln(" ", name, " -oo = ", neg_inf);
|
|
|
|
T pos_zero = T(1.0) / pos_inf;
|
|
writeln(" ", name, " +0 (pos_zero) = ", pos_zero);
|
|
|
|
T neg_zero = T(1.0) / neg_inf;
|
|
writeln(" ", name, " -0 = ", neg_zero);
|
|
|
|
T nan = zero / pos_zero;
|
|
writefln(" " ~ name ~ " zero / pos_zero = %f %s", nan, toHex(nan));
|
|
writeln();
|
|
|
|
writeln("Some ", T.stringof, " properties and literals:");
|
|
writeln(" ", name, " +oo = ", T.infinity);
|
|
writeln(" ", name, " -oo = ", -T.infinity);
|
|
writeln(" ", name, " +0 = ", T(0.0));
|
|
writeln(" ", name, " -0 = ", T(-0.0));
|
|
writefln(" " ~ name ~ " nan = %f %s", T.nan, toHex(T.nan));
|
|
writefln(" " ~ name ~ " init = %f %s", T.init, toHex(T.init));
|
|
writeln(" ", name, " epsilon = ", T.epsilon);
|
|
writeln(" ", name, " max = ", T.max);
|
|
writeln(" ", name, " -max = ", -T.max);
|
|
writeln(" ", name, " min_normal = ", -T.min_normal);
|
|
writeln("-----------------------------");
|
|
}
|
|
|
|
void main() {
|
|
show!float;
|
|
show!double;
|
|
show!real;
|
|
|
|
writeln("Largest possible payload for float, double and real NaNs:");
|
|
immutable float f1 = NaN(0x3F_FFFF);
|
|
writeln(getNaNPayload(f1));
|
|
|
|
immutable double f2 = NaN(0x3_FFFF_FFFF_FFFF);
|
|
writeln(getNaNPayload(f2));
|
|
|
|
immutable real f3 = NaN(0x3FFF_FFFF_FFFF_FFFF);
|
|
writeln(getNaNPayload(f3));
|
|
}
|