| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : feqrel; |
| |
| assert(pow(2.0, 5) == 32.0); |
| assert(pow(1.5, 9).feqrel(38.4433) > 16); |
| assert(pow(real.nan, 2) is real.nan); |
| assert(pow(real.infinity, 2) == real.infinity); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| assert(pow(2, 3) == 8); |
| assert(pow(3, 2) == 9); |
| |
| assert(pow(2, 10) == 1_024); |
| assert(pow(2, 20) == 1_048_576); |
| assert(pow(2, 30) == 1_073_741_824); |
| |
| assert(pow(0, 0) == 1); |
| |
| assert(pow(1, -5) == 1); |
| assert(pow(1, -6) == 1); |
| assert(pow(-1, -5) == -1); |
| assert(pow(-1, -6) == 1); |
| |
| assert(pow(-2, 5) == -32); |
| assert(pow(-2, -5) == 0); |
| assert(pow(cast(double) -2, -5) == -0.03125); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| assert(pow(2, 5.0) == 32.0); |
| assert(pow(7, 3.0) == 343.0); |
| assert(pow(2, real.nan) is real.nan); |
| assert(pow(2, real.infinity) == real.infinity); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : isClose; |
| |
| assert(isClose(pow(2.0, 3.0), 8.0)); |
| assert(isClose(pow(1.5, 10.0), 57.6650390625)); |
| |
| // square root of 9 |
| assert(isClose(pow(9.0, 0.5), 3.0)); |
| // 10th root of 1024 |
| assert(isClose(pow(1024.0, 0.1), 2.0)); |
| |
| assert(isClose(pow(-4.0, 3.0), -64.0)); |
| |
| // reciprocal of 4 ^^ 2 |
| assert(isClose(pow(4.0, -2.0), 0.0625)); |
| // reciprocal of (-2) ^^ 3 |
| assert(isClose(pow(-2.0, -3.0), -0.125)); |
| |
| assert(isClose(pow(-2.5, 3.0), -15.625)); |
| // reciprocal of 2.5 ^^ 3 |
| assert(isClose(pow(2.5, -3.0), 0.064)); |
| // reciprocal of (-2.5) ^^ 3 |
| assert(isClose(pow(-2.5, -3.0), -0.064)); |
| |
| // reciprocal of square root of 4 |
| assert(isClose(pow(4.0, -0.5), 0.5)); |
| |
| // per definition |
| assert(isClose(pow(0.0, 0.0), 1.0)); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : isClose; |
| |
| // the result is a complex number |
| // which cannot be represented as floating point number |
| import std.math.traits : isNaN; |
| assert(isNaN(pow(-2.5, -1.5))); |
| |
| // use the ^^-operator of std.complex instead |
| import std.complex : complex; |
| auto c1 = complex(-2.5, 0.0); |
| auto c2 = complex(-1.5, 0.0); |
| auto result = c1 ^^ c2; |
| // exact result apparently depends on `real` precision => increased tolerance |
| assert(isClose(result.re, -4.64705438e-17, 2e-4)); |
| assert(isClose(result.im, 2.52982e-1, 2e-4)); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| assert(powmod(1U, 10U, 3U) == 1); |
| assert(powmod(3U, 2U, 6U) == 3); |
| assert(powmod(5U, 5U, 15U) == 5); |
| assert(powmod(2U, 3U, 5U) == 3); |
| assert(powmod(2U, 4U, 5U) == 1); |
| assert(powmod(2U, 5U, 5U) == 2); |
| } |
| |
| @safe unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : feqrel; |
| import std.math.constants : E; |
| |
| assert(exp(0.0) == 1.0); |
| assert(exp(3.0).feqrel(E * E * E) > 16); |
| } |
| |
| @safe unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.traits : isIdentical; |
| import std.math.operations : feqrel; |
| |
| assert(isIdentical(expm1(0.0), 0.0)); |
| assert(expm1(1.0).feqrel(1.71828) > 16); |
| assert(expm1(2.0).feqrel(6.3890) > 16); |
| } |
| |
| @safe unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.traits : isIdentical; |
| import std.math.operations : feqrel; |
| |
| assert(isIdentical(exp2(0.0), 1.0)); |
| assert(exp2(2.0).feqrel(4.0) > 16); |
| assert(exp2(8.0).feqrel(256.0) > 16); |
| } |
| |
| @safe unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : isClose; |
| |
| int exp; |
| real mantissa = frexp(123.456L, exp); |
| |
| assert(isClose(mantissa * pow(2.0L, cast(real) exp), 123.456L)); |
| |
| assert(frexp(-real.nan, exp) && exp == int.min); |
| assert(frexp(real.nan, exp) && exp == int.min); |
| assert(frexp(-real.infinity, exp) == -real.infinity && exp == int.min); |
| assert(frexp(real.infinity, exp) == real.infinity && exp == int.max); |
| assert(frexp(-0.0, exp) == -0.0 && exp == 0); |
| assert(frexp(0.0, exp) == 0.0 && exp == 0); |
| } |
| |
| @safe pure unittest |
| { |
| import std.math.exponential; |
| |
| assert(ilogb(1) == 0); |
| assert(ilogb(3) == 1); |
| assert(ilogb(3.0) == 1); |
| assert(ilogb(100_000_000) == 26); |
| |
| assert(ilogb(0) == FP_ILOGB0); |
| assert(ilogb(0.0) == FP_ILOGB0); |
| assert(ilogb(double.nan) == FP_ILOGBNAN); |
| assert(ilogb(double.infinity) == int.max); |
| } |
| |
| @safe pure unittest |
| { |
| import std.math.exponential; |
| |
| assert(ilogb(0) == FP_ILOGB0); |
| assert(ilogb(0.0) == FP_ILOGB0); |
| assert(ilogb(double.nan) == FP_ILOGBNAN); |
| } |
| |
| @nogc @safe pure nothrow unittest |
| { |
| import std.math.exponential; |
| |
| import std.meta : AliasSeq; |
| static foreach (T; AliasSeq!(float, double, real)) |
| {{ |
| T r; |
| |
| r = ldexp(3.0L, 3); |
| assert(r == 24); |
| |
| r = ldexp(cast(T) 3.0, cast(int) 3); |
| assert(r == 24); |
| |
| T n = 3.0; |
| int exp = 3; |
| r = ldexp(n, exp); |
| assert(r == 24); |
| }} |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : feqrel; |
| import std.math.constants : E; |
| |
| assert(feqrel(log(E), 1) >= real.mant_dig - 1); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.algebraic : fabs; |
| |
| assert(fabs(log10(1000.0L) - 3) < .000001); |
| } |
| |
| @safe pure unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.traits : isIdentical, isNaN; |
| import std.math.operations : feqrel; |
| |
| assert(isIdentical(log1p(0.0), 0.0)); |
| assert(log1p(1.0).feqrel(0.69314) > 16); |
| |
| assert(log1p(-1.0) == -real.infinity); |
| assert(isNaN(log1p(-2.0))); |
| assert(log1p(real.nan) is real.nan); |
| assert(log1p(-real.nan) is -real.nan); |
| assert(log1p(real.infinity) == real.infinity); |
| } |
| |
| @safe unittest |
| { |
| import std.math.exponential; |
| |
| import std.math.operations : isClose; |
| |
| assert(isClose(log2(1024.0L), 10)); |
| } |
| |
| @safe @nogc nothrow unittest |
| { |
| import std.math.exponential; |
| |
| assert(logb(1.0) == 0); |
| assert(logb(100.0) == 6); |
| |
| assert(logb(0.0) == -real.infinity); |
| assert(logb(real.infinity) == real.infinity); |
| assert(logb(-real.infinity) == real.infinity); |
| } |
| |
| @safe pure nothrow @nogc unittest |
| { |
| import std.math.exponential; |
| |
| assert(scalbn(0x1.2345678abcdefp0L, 999) == 0x1.2345678abcdefp999L); |
| assert(scalbn(-real.infinity, 5) == -real.infinity); |
| assert(scalbn(2.0,10) == 2048.0); |
| assert(scalbn(2048.0f,-10) == 2.0f); |
| } |
| |