Sourcestd/math/traits.d
isNaN(X)(Xx)Xx | a floating point number. |
assert(isNaN(float.init));assert(isNaN(-double.init));assert(isNaN(real.nan));assert(isNaN(-real.nan));assert(!isNaN(cast(float) 53.6));assert(!isNaN(cast(real)-53.6));
isFinite(X)(Xx);Xx | a floating point number. |
assert(isFinite(1.23f));assert(isFinite(float.max));assert(isFinite(float.min_normal));assert(!isFinite(float.nan));assert(!isFinite(float.infinity));
isNormal(X)(Xx);Xx | a floating point number. |
float f = 3;double d = 500;real e = 10e+48;assert(isNormal(f));assert(isNormal(d));assert(isNormal(e));f = d = e = 0;assert(!isNormal(f));assert(!isNormal(d));assert(!isNormal(e));assert(!isNormal(real.infinity));assert(isNormal(-real.max));assert(!isNormal(real.min_normal/4));
isSubnormal(X)(Xx);Xx | a floating point number. |
import std.meta : AliasSeq;staticforeach (T; AliasSeq!(float,double,real)){{ T f;for (f = 1.0; !isSubnormal(f); f /= 2)assert(f != 0);}}
isInfinity(X)(Xx)Xx | a floating point number. |
assert(!isInfinity(float.init));assert(!isInfinity(-float.init));assert(!isInfinity(float.nan));assert(!isInfinity(-float.nan));assert(isInfinity(float.infinity));assert(isInfinity(-float.infinity));assert(isInfinity(-1.0f / 0.0f));
isIdentical(realx, realy);// We're forcing the CTFE to run by assigning the result of the function to an enumenum test1 =isIdentical(1.0,1.0);enum test2 =isIdentical(real.nan,real.nan);enum test3 =isIdentical(real.infinity,real.infinity);enum test4 =isIdentical(real.infinity,real.infinity);enum test5 =isIdentical(0.0, 0.0);assert(test1);assert(test2);assert(test3);assert(test4);assert(test5);enum test6 = !isIdentical(0.0, -0.0);enum test7 = !isIdentical(real.nan, -real.nan);enum test8 = !isIdentical(real.infinity, -real.infinity);assert(test6);assert(test7);assert(test8);
signbit(X)(Xx);assert(!signbit(float.nan));assert(signbit(-float.nan));assert(!signbit(168.1234f));assert(signbit(-168.1234f));assert(!signbit(0.0f));assert(signbit(-0.0f));assert(signbit(-float.max));assert(!signbit(float.max));assert(!signbit(double.nan));assert(signbit(-double.nan));assert(!signbit(168.1234));assert(signbit(-168.1234));assert(!signbit(0.0));assert(signbit(-0.0));assert(signbit(-double.max));assert(!signbit(double.max));assert(!signbit(real.nan));assert(signbit(-real.nan));assert(!signbit(168.1234L));assert(signbit(-168.1234L));assert(!signbit(0.0L));assert(signbit(-0.0L));assert(signbit(-real.max));assert(!signbit(real.max));
copysign(R, X)(Rto, Xfrom)copysign(R, X)(Xto, Rfrom)Rto | the numeric value to use |
Xfrom | the sign value to use |
writeln(copysign(1.0, 1.0));// 1.0writeln(copysign(1.0, -0.0));// -1.0writeln(copysign(1UL, -1.0));// -1.0writeln(copysign(-1.0, -1.0));// -1.0writeln(copysign(real.infinity, -1.0));// -real.infinityassert(copysign(real.nan, 1.0)isreal.nan);assert(copysign(-real.nan, 1.0)isreal.nan);assert(copysign(real.nan, -1.0)is -real.nan);
sgn(F)(Fx)x ifx == 0,1 ifx > 0, andNAN if x==NAN.writeln(sgn(168.1234));// 1writeln(sgn(-168.1234));// -1writeln(sgn(0.0));// 0writeln(sgn(-0.0));// 0
isPowerOf2(X)(const Xx)x is negative or zero.Xx | the number to test |
x is an integer power of two.import std.math.exponential : pow;assert(isPowerOf2(1.0L));assert(isPowerOf2(2.0L));assert(isPowerOf2(0.5L));assert(isPowerOf2(pow(2.0L, 96)));assert(isPowerOf2(pow(2.0L, -77)));assert(!isPowerOf2(-2.0L));assert(!isPowerOf2(-0.5L));assert(!isPowerOf2(0.0L));assert(!isPowerOf2(4.315));assert(!isPowerOf2(1.0L / 3.0L));assert(!isPowerOf2(real.nan));assert(!isPowerOf2(real.infinity));
assert(isPowerOf2(1));assert(isPowerOf2(2));assert(isPowerOf2(1uL << 63));assert(!isPowerOf2(-4));assert(!isPowerOf2(0));assert(!isPowerOf2(1337u));