英語版
このページの英語版を見る

std.math.traits

これは std.math.
数値のイントロスペクションのためのいくつかの関数が含まれている。
Authors:
Walter Bright, Don Clugston, Conversion of CEPHES math library to D by Iain Buclaw and David Nadlinger
pure nothrow @nogc @trusted bool isNaN(X)(X x)
if (isFloatingPoint!X);
x がNaN かどうかを判定する。
Parameters:
X x は浮動小数点数である。
Returns:
true xがNanの場合。
Examples:
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));
pure nothrow @nogc @trusted bool isFinite(X)(X x);
xが有限かどうかを判定する。
Parameters:
X x は浮動小数点数である。
Returns:
true もしxが有限なら
Examples:
assert( isFinite(1.23f));
assert( isFinite(float.max));
assert( isFinite(float.min_normal));
assert(!isFinite(float.nan));
assert(!isFinite(float.infinity));
pure nothrow @nogc @trusted bool isNormal(X)(X x);
xが正規化されているかどうかを判定する。
正規化された数値はゼロ、サブノーマル、無限、NANであってはならない。
Parameters:
X x 浮動小数点数である。
Returns:
true xが正規化されている場合。
Examples:
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));
pure nothrow @nogc @trusted bool isSubnormal(X)(X x);
xが準正規かどうかを判定する。
サブノーマル(「非正規数」とも呼ばれる)は、指数が0、仮数ビットが0である。 であり、最上位仮数ビットが0である。
Parameters:
X x 浮動小数点数である。
Returns:
true xが非正規数である。
Examples:
import std.meta : AliasSeq;

static foreach (T; AliasSeq!(float, double, real))
{{
    T f;
    for (f = 1.0; !isSubnormal(f); f /= 2)
        assert(f != 0);
}}
pure nothrow @nogc @trusted bool isInfinity(X)(X x)
if (isFloatingPoint!X);
xが±∞かどうかを判定する。
Parameters:
X x は浮動小数点数である。
Returns:
true xが±∞の場合。
Examples:
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));
pure nothrow @nogc @trusted bool isIdentical(real x, real y);
xの2進表現はyと同じか?
Examples:
assert( isIdentical(0.0, 0.0));
assert( isIdentical(1.0, 1.0));
assert( isIdentical(real.infinity, real.infinity));
assert( isIdentical(-real.infinity, -real.infinity));

assert(!isIdentical(0.0, -0.0));
assert(!isIdentical(real.nan, -real.nan));
assert(!isIdentical(real.infinity, -real.infinity));
pure nothrow @nogc @trusted int signbit(X)(X x);
eの符号ビットがセットされていれば1を、セットされていなければ0を返す。
Examples:
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));
pure nothrow @nogc @trusted R copysign(R, X)(R to, X from)
if (isFloatingPoint!R && isFloatingPoint!X);

pure nothrow @nogc @trusted R copysign(R, X)(X to, R from)
if (isIntegral!X && isFloatingPoint!R);
Parameters:
R to 使用する数値
X from 使用する符号値
Returns:
toにfromの符号ビットを加えた値。
Examples:
writeln(copysign(1.0, 1.0)); // 1.0
writeln(copysign(1.0, -0.0)); // -1.0
writeln(copysign(1UL, -1.0)); // -1.0
writeln(copysign(-1.0, -1.0)); // -1.0

writeln(copysign(real.infinity, -1.0)); // -real.infinity
assert(copysign(real.nan, 1.0) is real.nan);
assert(copysign(-real.nan, 1.0) is real.nan);
assert(copysign(real.nan, -1.0) is -real.nan);
pure nothrow @nogc @safe F sgn(F)(F x)
if (isFloatingPoint!F || isIntegral!F);
x < 0 の場合は-1 を返す、 xifx == 0,1 if x > 0x==NAN ならNAN を返す。
Examples:
writeln(sgn(168.1234)); // 1
writeln(sgn(-168.1234)); // -1
writeln(sgn(0.0)); // 0
writeln(sgn(-0.0)); // 0
pure nothrow @nogc @safe bool isPowerOf2(X)(const X x)
if (isNumeric!X);
数値が2のべき乗であるかどうかを調べる。
2のべき乗になるのは正の数だけであることに注意。この 関数" は常にfalse を返す。 xが負かゼロの場合、この関数は常に
Parameters:
X x テストする番号
Returns:
true もし xが2のべき乗であるかどうかを調べる。
Examples:
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));
Examples:
assert( isPowerOf2(1));
assert( isPowerOf2(2));
assert( isPowerOf2(1uL << 63));

assert(!isPowerOf2(-4));
assert(!isPowerOf2(0));
assert(!isPowerOf2(1337u));