Add public examples to all functions in std.math

This commit is contained in:
Jack Stouffer 2018-04-04 08:31:50 -04:00
parent 77624187be
commit dfa8ccd2a2

View file

@ -5027,8 +5027,8 @@ else
* $(TABLE_SV * $(TABLE_SV
* $(TR $(TH x) $(TH y) $(TH remainder(x, y)) $(TH n) $(TH invalid?)) * $(TR $(TH x) $(TH y) $(TH remainder(x, y)) $(TH n) $(TH invalid?))
* $(TR $(TD $(PLUSMN)0.0) $(TD not 0.0) $(TD $(PLUSMN)0.0) $(TD 0.0) $(TD no)) * $(TR $(TD $(PLUSMN)0.0) $(TD not 0.0) $(TD $(PLUSMN)0.0) $(TD 0.0) $(TD no))
* $(TR $(TD $(PLUSMNINF)) $(TD anything) $(TD $(NAN)) $(TD ?) $(TD yes)) * $(TR $(TD $(PLUSMNINF)) $(TD anything) $(TD -$(NAN)) $(TD ?) $(TD yes))
* $(TR $(TD anything) $(TD $(PLUSMN)0.0) $(TD $(NAN)) $(TD ?) $(TD yes)) * $(TR $(TD anything) $(TD $(PLUSMN)0.0) $(TD -$(NAN)) $(TD ?) $(TD yes))
* $(TR $(TD != $(PLUSMNINF)) $(TD $(PLUSMNINF)) $(TD x) $(TD ?) $(TD no)) * $(TR $(TD != $(PLUSMNINF)) $(TD $(PLUSMNINF)) $(TD x) $(TD ?) $(TD no))
* ) * )
* *
@ -5054,6 +5054,33 @@ real remquo(real x, real y, out int n) @trusted nothrow @nogc /// ditto
assert(0, "remquo not implemented"); assert(0, "remquo not implemented");
} }
///
@safe @nogc nothrow unittest
{
version(Posix)
{
assert(remainder(5.1, 3.0).feqrel(-0.9) > 16);
assert(remainder(-5.1, 3.0).feqrel(0.9) > 16);
assert(remainder(0.0, 3.0) == 0.0);
assert(remainder(1.0, 0.0) is -real.nan);
assert(remainder(-1.0, 0.0) is -real.nan);
}
}
///
@safe @nogc nothrow unittest
{
version(Posix)
{
int n;
assert(remquo(5.1, 3.0, n).feqrel(-0.9) > 16 && n == 2);
assert(remquo(-5.1, 3.0, n).feqrel(0.9) > 16 && n == -2);
assert(remquo(0.0, 3.0, n) == 0.0 && n == 0);
}
}
/** IEEE exception status flags ('sticky bits') /** IEEE exception status flags ('sticky bits')
These flags indicate that an exceptional floating-point condition has occurred. These flags indicate that an exceptional floating-point condition has occurred.
@ -5303,12 +5330,40 @@ void resetIeeeFlags() @trusted nothrow @nogc
IeeeFlags.resetIeeeFlags(); IeeeFlags.resetIeeeFlags();
} }
///
@safe unittest
{
resetIeeeFlags();
real a = 3.5;
a /= 0.0L;
assert(a == real.infinity);
assert(ieeeFlags.divByZero);
resetIeeeFlags();
assert(!ieeeFlags.divByZero);
}
/// Returns: snapshot of the current state of the floating-point status flags /// Returns: snapshot of the current state of the floating-point status flags
@property IeeeFlags ieeeFlags() @trusted pure nothrow @nogc @property IeeeFlags ieeeFlags() @trusted pure nothrow @nogc
{ {
return IeeeFlags(IeeeFlags.getIeeeFlags()); return IeeeFlags(IeeeFlags.getIeeeFlags());
} }
///
@safe nothrow unittest
{
resetIeeeFlags();
real a = 3.5;
a /= 0.0L;
assert(a == real.infinity);
assert(ieeeFlags.divByZero);
a *= 0.0L;
assert(isNaN(a));
assert(ieeeFlags.invalid);
}
/** Control the Floating point hardware /** Control the Floating point hardware
Change the IEEE754 floating-point rounding mode and the floating-point Change the IEEE754 floating-point rounding mode and the floating-point
@ -5343,18 +5398,9 @@ Example:
// NaN-s with other payload are valid: // NaN-s with other payload are valid:
real z = y * real.nan; // ok real z = y * real.nan; // ok
// Changing the rounding mode: // The set hardware exceptions and rounding modes will be disabled when
fpctrl.rounding = FloatingPointControl.roundUp; // leaving this scope.
assert(rint(1.1) == 2);
// The set hardware exceptions will be disabled when leaving this scope.
// The original rounding mode will also be restored.
} }
// Ensure previous values are returned:
assert(!FloatingPointControl.enabledExceptions);
assert(FloatingPointControl.rounding == FloatingPointControl.roundToNearest);
assert(rint(1.1) == 1);
---- ----
*/ */
@ -5701,6 +5747,21 @@ private:
} }
} }
///
@safe unittest
{
FloatingPointControl fpctrl;
fpctrl.rounding = FloatingPointControl.roundDown;
assert(lrint(1.5) == 1.0);
fpctrl.rounding = FloatingPointControl.roundUp;
assert(lrint(1.4) == 2.0);
fpctrl.rounding = FloatingPointControl.roundToNearest;
assert(lrint(1.5) == 2.0);
}
@safe unittest @safe unittest
{ {
void ensureDefaults() void ensureDefaults()
@ -6172,6 +6233,19 @@ bool isIdentical(real x, real y) @trusted pure nothrow @nogc
} }
} }
///
@safe @nogc pure nothrow unittest
{
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));
}
/********************************* /*********************************
* Return 1 if sign bit of e is set, 0 if not. * Return 1 if sign bit of e is set, 0 if not.
*/ */
@ -6213,8 +6287,12 @@ int signbit(X)(X x) @nogc @trusted pure nothrow
} }
/********************************* /**
* Return a value composed of to with from's sign bit. Params:
to = the numeric value to use
from = the sign value to use
Returns:
a value composed of to with from's sign bit.
*/ */
R copysign(R, X)(R to, X from) @trusted pure nothrow @nogc R copysign(R, X)(R to, X from) @trusted pure nothrow @nogc
if (isFloatingPoint!(R) && isFloatingPoint!(X)) if (isFloatingPoint!(R) && isFloatingPoint!(X))
@ -6229,13 +6307,27 @@ if (isFloatingPoint!(R) && isFloatingPoint!(X))
return to; return to;
} }
// ditto /// ditto
R copysign(R, X)(X to, R from) @trusted pure nothrow @nogc R copysign(R, X)(X to, R from) @trusted pure nothrow @nogc
if (isIntegral!(X) && isFloatingPoint!(R)) if (isIntegral!(X) && isFloatingPoint!(R))
{ {
return copysign(cast(R) to, from); return copysign(cast(R) to, from);
} }
///
@safe pure nothrow @nogc unittest
{
assert(copysign(1.0, 1.0) == 1.0);
assert(copysign(1.0, -0.0) == -1.0);
assert(copysign(1UL, -1.0) == -1.0);
assert(copysign(-1.0, -1.0) == -1.0);
assert(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);
}
@safe pure nothrow @nogc unittest @safe pure nothrow @nogc unittest
{ {
import std.meta : AliasSeq; import std.meta : AliasSeq;
@ -6372,6 +6464,14 @@ real NaN(ulong payload) @trusted pure nothrow @nogc
} }
} }
///
@safe @nogc pure nothrow unittest
{
real a = NaN(1_000_000);
assert(isNaN(a));
assert(getNaNPayload(a) == 1_000_000);
}
@system pure nothrow @nogc unittest // not @safe because taking address of local. @system pure nothrow @nogc unittest // not @safe because taking address of local.
{ {
static if (floatTraits!(real).realFormat == RealFormat.ieeeDouble) static if (floatTraits!(real).realFormat == RealFormat.ieeeDouble)
@ -6433,6 +6533,14 @@ ulong getNaNPayload(real x) @trusted pure nothrow @nogc
return w; return w;
} }
///
@safe @nogc pure nothrow unittest
{
real a = NaN(1_000_000);
assert(isNaN(a));
assert(getNaNPayload(a) == 1_000_000);
}
debug(UnitTest) debug(UnitTest)
{ {
@safe pure nothrow @nogc unittest @safe pure nothrow @nogc unittest
@ -6627,6 +6735,13 @@ float nextUp(float x) @trusted pure nothrow @nogc
return x; return x;
} }
///
@safe @nogc pure nothrow unittest
{
assert(nextUp(1.0 - 1.0e-6).feqrel(0.999999) > 16);
assert(nextUp(1.0 - real.epsilon).feqrel(1.0) > 16);
}
/** /**
* Calculate the next smallest floating point value before x. * Calculate the next smallest floating point value before x.
* *
@ -6772,8 +6887,11 @@ T nextafter(T)(const T x, const T y) @safe pure nothrow @nogc
//real nexttoward(real x, real y) { return core.stdc.math.nexttowardl(x, y); } //real nexttoward(real x, real y) { return core.stdc.math.nexttowardl(x, y); }
/******************************************* /**
* Returns the positive difference between x and y. * Returns the positive difference between x and y.
*
* Equivalent to `fmax(x-y, 0)`.
*
* Returns: * Returns:
* $(TABLE_SV * $(TABLE_SV
* $(TR $(TH x, y) $(TH fdim(x, y))) * $(TR $(TH x, y) $(TH fdim(x, y)))
@ -6783,16 +6901,46 @@ T nextafter(T)(const T x, const T y) @safe pure nothrow @nogc
*/ */
real fdim(real x, real y) @safe pure nothrow @nogc { return (x > y) ? x - y : +0.0; } real fdim(real x, real y) @safe pure nothrow @nogc { return (x > y) ? x - y : +0.0; }
/**************************************** ///
@safe pure nothrow @nogc unittest
{
assert(fdim(2.0, 0.0) == 2.0);
assert(fdim(-2.0, 0.0) == 0.0);
assert(fdim(real.infinity, 2.0) == real.infinity);
assert(fdim(real.nan, 2.0) == 0.0);
assert(fdim(2.0, real.nan) == 0.0);
}
/**
* Returns the larger of x and y. * Returns the larger of x and y.
*/ */
real fmax(real x, real y) @safe pure nothrow @nogc { return x > y ? x : y; } real fmax(real x, real y) @safe pure nothrow @nogc { return x > y ? x : y; }
/**************************************** ///
@safe pure nothrow @nogc unittest
{
assert(fmax(0.0, 2.0) == 2.0);
assert(fmax(-2.0, 0.0) == 0.0);
assert(fmax(real.infinity, 2.0) == real.infinity);
assert(fmax(real.nan, 2.0) == 2.0);
assert(fmax(2.0, real.nan) is real.nan);
}
/**
* Returns the smaller of x and y. * Returns the smaller of x and y.
*/ */
real fmin(real x, real y) @safe pure nothrow @nogc { return x < y ? x : y; } real fmin(real x, real y) @safe pure nothrow @nogc { return x < y ? x : y; }
///
@safe pure nothrow @nogc unittest
{
assert(fmin(0.0, 2.0) == 0.0);
assert(fmin(-2.0, 0.0) == -2.0);
assert(fmin(real.infinity, 2.0) == 2.0);
assert(fmin(real.nan, 2.0) == 2.0);
assert(fmin(2.0, real.nan) is real.nan);
}
/************************************** /**************************************
* Returns (x * y) + z, rounding only once according to the * Returns (x * y) + z, rounding only once according to the
* current rounding mode. * current rounding mode.
@ -6801,7 +6949,17 @@ real fmin(real x, real y) @safe pure nothrow @nogc { return x < y ? x : y; }
*/ */
real fma(real x, real y, real z) @safe pure nothrow @nogc { return (x * y) + z; } real fma(real x, real y, real z) @safe pure nothrow @nogc { return (x * y) + z; }
/******************************************************************* ///
@safe pure nothrow @nogc unittest
{
assert(fma(0.0, 2.0, 2.0) == 2.0);
assert(fma(2.0, 2.0, 2.0) == 6.0);
assert(fma(real.infinity, 2.0, 2.0) == real.infinity);
assert(fma(real.nan, 2.0, 2.0) is real.nan);
assert(fma(2.0, 2.0, real.nan) is real.nan);
}
/**
* Compute the value of x $(SUPERSCRIPT n), where n is an integer * Compute the value of x $(SUPERSCRIPT n), where n is an integer
*/ */
Unqual!F pow(F, G)(F x, G n) @nogc @trusted pure nothrow Unqual!F pow(F, G)(F x, G n) @nogc @trusted pure nothrow
@ -6852,6 +7010,15 @@ if (isFloatingPoint!(F) && isIntegral!(G))
return p; return p;
} }
///
@safe pure nothrow @nogc unittest
{
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 @safe pure nothrow @nogc unittest
{ {
// Make sure it instantiates and works properly on immutable values and // Make sure it instantiates and works properly on immutable values and
@ -6970,7 +7137,16 @@ if (isIntegral!I && isFloatingPoint!F)
return pow(cast(real) x, cast(Unqual!F) y); return pow(cast(real) x, cast(Unqual!F) y);
} }
/********************************************* ///
@safe pure nothrow @nogc unittest
{
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);
}
/**
* Calculates x$(SUPERSCRIPT y). * Calculates x$(SUPERSCRIPT y).
* *
* $(TABLE_SV * $(TABLE_SV
@ -6998,7 +7174,7 @@ if (isIntegral!I && isFloatingPoint!F)
* $(TD no) $(TD no) ) * $(TD no) $(TD no) )
* $(TR $(TD -$(INFIN)) $(TD $(LT) 0.0, not odd integer) $(TD +0.0) * $(TR $(TD -$(INFIN)) $(TD $(LT) 0.0, not odd integer) $(TD +0.0)
* $(TD no) $(TD no) ) * $(TD no) $(TD no) )
* $(TR $(TD $(PLUSMN)1.0) $(TD $(PLUSMN)$(INFIN)) $(TD $(NAN)) * $(TR $(TD $(PLUSMN)1.0) $(TD $(PLUSMN)$(INFIN)) $(TD -$(NAN))
* $(TD no) $(TD yes) ) * $(TD no) $(TD yes) )
* $(TR $(TD $(LT) 0.0) $(TD finite, nonintegral) $(TD $(NAN)) * $(TR $(TD $(LT) 0.0) $(TD finite, nonintegral) $(TD $(NAN))
* $(TD no) $(TD yes)) * $(TD no) $(TD yes))
@ -7213,6 +7389,29 @@ if (isFloatingPoint!(F) && isFloatingPoint!(G))
return impl(x, y); return impl(x, y);
} }
///
@safe pure nothrow @nogc unittest
{
assert(pow(1.0, 2.0) == 1.0);
assert(pow(0.0, 0.0) == 1.0);
assert(pow(1.5, 10.0).feqrel(57.665) > 16);
// special values
assert(pow(1.5, real.infinity) == real.infinity);
assert(pow(0.5, real.infinity) == 0.0);
assert(pow(1.5, -real.infinity) == 0.0);
assert(pow(0.5, -real.infinity) == real.infinity);
assert(pow(real.infinity, 1.0) == real.infinity);
assert(pow(real.infinity, -1.0) == 0.0);
assert(pow(-real.infinity, 1.0) == -real.infinity);
assert(pow(-real.infinity, 2.0) == real.infinity);
assert(pow(-real.infinity, -1.0) == -0.0);
assert(pow(-real.infinity, -2.0) == 0.0);
assert(pow(1.0, real.infinity) is -real.nan);
assert(pow(0.0, -1.0) == real.infinity);
assert(pow(real.nan, 0.0) == 1.0);
}
@safe pure nothrow @nogc unittest @safe pure nothrow @nogc unittest
{ {
// Test all the special values. These unittests can be run on Windows // Test all the special values. These unittests can be run on Windows
@ -7353,6 +7552,17 @@ if (isUnsigned!F && isUnsigned!G && isUnsigned!H)
return result; return result;
} }
///
@safe pure nothrow @nogc unittest
{
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 pure nothrow @nogc unittest @safe pure nothrow @nogc unittest
{ {
ulong a = 18446744073709551615u, b = 20u, c = 18446744073709551610u; ulong a = 18446744073709551615u, b = 20u, c = 18446744073709551610u;
@ -7989,7 +8199,8 @@ private real polyImpl(real x, in real[] A) @trusted pure nothrow @nogc
lhs = First item to compare. lhs = First item to compare.
rhs = Second item to compare. rhs = Second item to compare.
maxRelDiff = Maximum allowable difference relative to `rhs`. maxRelDiff = Maximum allowable difference relative to `rhs`.
maxAbsDiff = Maximum absolute difference. Defaults to `1e-2`.
maxAbsDiff = Maximum absolute difference. Defaults to `1e-5`.
Returns: Returns:
`true` if the two items are approximately equal under either criterium. `true` if the two items are approximately equal under either criterium.
@ -8071,9 +8282,7 @@ bool approxEqual(T, U, V)(T lhs, U rhs, V maxRelDiff, V maxAbsDiff = 1e-5)
} }
} }
/** /// ditto
Returns $(D approxEqual(lhs, rhs, 1e-2, 1e-5)).
*/
bool approxEqual(T, U)(T lhs, U rhs) bool approxEqual(T, U)(T lhs, U rhs)
{ {
return approxEqual(lhs, rhs, 1e-2, 1e-5); return approxEqual(lhs, rhs, 1e-2, 1e-5);