Wolfgang Thallergcc 15.1.0ada185d1 year agoHistory
203 lines · 5.5 KB · D
RawDownload
@safe unittest{    import std.numeric;     import std.math.trigonometry : sin, cos;     // Define a 16-bit floating point values    CustomFloat!16                                x;     // Using the number of bits    CustomFloat!(10, 5)                           y;     // Using the precision and exponent width    CustomFloat!(10, 5,CustomFloatFlags.ieee)     z;     // Using the precision, exponent width and format flags    CustomFloat!(10, 5,CustomFloatFlags.ieee, 15) w;     // Using the precision, exponent width, format flags and exponent offset bias     // Use the 16-bit floats mostly like normal numbers    w = x*y - 1;     // Functions calls require conversion    z = sin(+x)           + cos(+y);                     // Use unary plus to concisely convert to a real    z = sin(x.get!float)  + cos(y.get!float);            // Or use get!T    z = sin(cast(float) x) + cos(cast(float) y);           // Or use cast(T) to explicitly convert     // Define a 8-bit custom float for storing probabilities    alias Probability = CustomFloat!(4, 4, CustomFloatFlags.ieee^CustomFloatFlags.probability^CustomFloatFlags.signed );    auto p = Probability(0.5);} @safe unittest{    import std.numeric;     import std.math.operations : isClose;     // Average numbers in an array    double avg(in double[] a)    {        if (a.length == 0) return 0;        FPTemporary!double result = 0;        foreach (e; a) result += e;        return result / a.length;    }     auto a = [1.0, 2.0, 3.0];    assert(isClose(avg(a), 2));} @safe unittest{    import std.numeric;     import std.math.operations : isClose;    import std.math.trigonometry : cos;     float f(float x)    {        return cos(x) - x*x*x;    }    auto x = secantMethod!(f)(0f, 1f);    assert(isClose(x, 0.865474));} @safe unittest{    import std.numeric;     import std.math.operations : isClose;     auto ret = findLocalMin((double x) => (x-4)^^2, -1e7, 1e7);    assert(ret.x.isClose(4.0));    assert(ret.y.isClose(0.0, 0.0, 1e-10));} @safe unittest{    import std.numeric;     double[] a = [];    assert(!normalize(a));    a = [ 1.0, 3.0 ];    assert(normalize(a));    assert(a == [ 0.25, 0.75 ]);    assert(normalize!(typeof(a))(a, 50)); // a = [12.5, 37.5]    a = [ 0.0, 0.0 ];    assert(!normalize(a));    assert(a == [ 0.5, 0.5 ]);} @safe unittest{    import std.numeric;     import std.math.traits : isNaN;     assert(sumOfLog2s(new double[0]) == 0);    assert(sumOfLog2s([0.0L]) == -real.infinity);    assert(sumOfLog2s([-0.0L]) == -real.infinity);    assert(sumOfLog2s([2.0L]) == 1);    assert(sumOfLog2s([-2.0L]).isNaN());    assert(sumOfLog2s([real.nan]).isNaN());    assert(sumOfLog2s([-real.nan]).isNaN());    assert(sumOfLog2s([real.infinity]) == real.infinity);    assert(sumOfLog2s([-real.infinity]).isNaN());    assert(sumOfLog2s([ 0.25, 0.25, 0.25, 0.125 ]) == -9);} @safe unittest{    import std.numeric;     import std.math.operations : isClose;     double[] p = [ 0.0, 0, 0, 1 ];    assert(kullbackLeiblerDivergence(p, p) == 0);    double[] p1 = [ 0.25, 0.25, 0.25, 0.25 ];    assert(kullbackLeiblerDivergence(p1, p1) == 0);    assert(kullbackLeiblerDivergence(p, p1) == 2);    assert(kullbackLeiblerDivergence(p1, p) == double.infinity);    double[] p2 = [ 0.2, 0.2, 0.2, 0.4 ];    assert(isClose(kullbackLeiblerDivergence(p1, p2), 0.0719281, 1e-5));    assert(isClose(kullbackLeiblerDivergence(p2, p1), 0.0780719, 1e-5));} @safe unittest{    import std.numeric;     import std.math.operations : isClose;     double[] p = [ 0.0, 0, 0, 1 ];    assert(jensenShannonDivergence(p, p) == 0);    double[] p1 = [ 0.25, 0.25, 0.25, 0.25 ];    assert(jensenShannonDivergence(p1, p1) == 0);    assert(isClose(jensenShannonDivergence(p1, p), 0.548795, 1e-5));    double[] p2 = [ 0.2, 0.2, 0.2, 0.4 ];    assert(isClose(jensenShannonDivergence(p1, p2), 0.0186218, 1e-5));    assert(isClose(jensenShannonDivergence(p2, p1), 0.0186218, 1e-5));    assert(isClose(jensenShannonDivergence(p2, p1, 0.005), 0.00602366, 1e-5));} @system unittest{    import std.numeric;     import std.math.operations : isClose;    import std.math.algebraic : sqrt;     string[] s = ["Hello", "brave", "new", "world"];    string[] t = ["Hello", "new", "world"];    assert(gapWeightedSimilarity(s, s, 1) == 15);    assert(gapWeightedSimilarity(t, t, 1) == 7);    assert(gapWeightedSimilarity(s, t, 1) == 7);    assert(isClose(gapWeightedSimilarityNormalized(s, t, 1),                    7.0 / sqrt(15.0 * 7), 0.01));} @system unittest{    import std.numeric;     string[] s = ["Hello", "brave", "new", "world"];    string[] t = ["Hello", "new", "world"];    auto simIter = gapWeightedSimilarityIncremental(s, t, 1.0);    assert(simIter.front == 3); // three 1-length matches    simIter.popFront();    assert(simIter.front == 3); // three 2-length matches    simIter.popFront();    assert(simIter.front == 1); // one 3-length match    simIter.popFront();    assert(simIter.empty);     // no more match} @safe unittest{    import std.numeric;     assert(gcd(2 * 5 * 7 * 7, 5 * 7 * 11) == 5 * 7);    const int a = 5 * 13 * 23 * 23, b = 13 * 59;    assert(gcd(a, b) == 13);} @safe unittest{    import std.numeric;     assert(lcm(1, 2) == 2);    assert(lcm(3, 4) == 12);    assert(lcm(5, 6) == 30);} @safe pure @nogc unittest{    import std.numeric;     ubyte[21] fac;    size_t idx = decimalToFactorial(2982, fac);     assert(fac[0] == 4);    assert(fac[1] == 0);    assert(fac[2] == 4);    assert(fac[3] == 1);    assert(fac[4] == 0);    assert(fac[5] == 0);    assert(fac[6] == 0);} 

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t