| @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); |
| } |
| |