Sourcestd/math/algebraic.d
abs(Num)(Numx)| Num | (template parameter) type of number |
Numx | real number value |
LimitationsWhen x is a signed integral equal toNum.min the value of x will be returned instead. Note for 2's complement;-Num.min (=Num.max + 1) is not representable due to overflow.
import std.math.traits : isIdentical, isNaN;assert(isIdentical(abs(-0.0L), 0.0L));assert(isNaN(abs(real.nan)));writeln(abs(-real.infinity));// real.infinitywriteln(abs(-56));// 56writeln(abs(2321312L));// 2321312Lwriteln(abs(23u));// 23u
fabs(realx);fabs(doublex);fabs(floatx);| x | fabs(x) |
|---|---|
| ±0.0 | +0.0 |
| ±∞ | +∞ |
import std.math.traits : isIdentical;assert(isIdentical(fabs(0.0f), 0.0f));assert(isIdentical(fabs(-0.0f), 0.0f));writeln(fabs(-10.0f));// 10.0fassert(isIdentical(fabs(0.0), 0.0));assert(isIdentical(fabs(-0.0), 0.0));writeln(fabs(-10.0));// 10.0assert(isIdentical(fabs(0.0L), 0.0L));assert(isIdentical(fabs(-0.0L), 0.0L));writeln(fabs(-10.0L));// 10.0L
sqrt(floatx);sqrt(doublex);sqrt(realx);| x | sqrt(x) | invalid? |
|---|---|---|
| -0.0 | -0.0 | no |
| <0.0 | NAN | yes |
| +∞ | +∞ | no |
import std.math.operations : feqrel;import std.math.traits : isNaN;assert(sqrt(2.0).feqrel(1.4142) > 16);assert(sqrt(9.0).feqrel(3.0) > 16);assert(isNaN(sqrt(-1.0f)));assert(isNaN(sqrt(-1.0)));assert(isNaN(sqrt(-1.0L)));
cbrt(realx);| x | cbrt(x) | invalid? |
|---|---|---|
| ±0.0 | ±0.0 | no |
| NAN | NAN | yes |
| ±∞ | ±∞ | no |
import std.math.operations : feqrel;assert(cbrt(1.0).feqrel(1.0) > 16);assert(cbrt(27.0).feqrel(3.0) > 16);assert(cbrt(15.625).feqrel(2.5) > 16);
hypot(T)(const Tx, const Ty)| x | y | hypot(x, y) | invalid? |
|---|---|---|---|
| x | ±0.0 | |x| | no |
| ±∞ | y | +∞ | no |
| ±∞ | NAN | +∞ | no |
| NAN | y != ±∞ | NAN | no |
import std.math.operations : feqrel;import std.math.traits : isNaN;assert(hypot(1.0, 1.0).feqrel(1.4142) > 16);assert(hypot(3.0, 4.0).feqrel(5.0) > 16);writeln(hypot(real.infinity, 1.0L));// real.infinitywriteln(hypot(1.0L,real.infinity));// real.infinitywriteln(hypot(real.infinity,real.nan));// real.infinitywriteln(hypot(real.nan,real.infinity));// real.infinityassert(hypot(real.nan, 1.0L).isNaN);assert(hypot(1.0L,real.nan).isNaN);
hypot(T)(const Tx, const Ty, const Tz)Tx | floating point value |
Ty | floating point value |
Tz | floating point value |
import std.math.operations : isClose;assert(isClose(hypot(1.0, 2.0, 2.0), 3.0));assert(isClose(hypot(2.0, 3.0, 6.0), 7.0));assert(isClose(hypot(1.0, 4.0, 8.0), 9.0));
poly(T1, T2)(T1x, in T2[]A)poly(T1, T2, int N)(T1x, ref const T2[N]A)T1x | the value to evaluate. |
T2[]A | array of coefficients a0, a1, etc. |
realx = 3.1L;staticreal[] pp = [56.1L, 32.7L, 6];writeln(poly(x, pp));// (56.1L + (32.7L + 6.0L * x) * x)
nextPow2(T)(const Tval)nextPow2(T)(const Tval)val.T can be any built-in numerical type.Tval | any number |
valwriteln(nextPow2(2));// 4writeln(nextPow2(10));// 16writeln(nextPow2(4000));// 4096writeln(nextPow2(-2));// -4writeln(nextPow2(-10));// -16writeln(nextPow2(uint.max));// 0writeln(nextPow2(uint.min));// 0writeln(nextPow2(size_t.max));// 0writeln(nextPow2(size_t.min));// 0writeln(nextPow2(int.max));// 0writeln(nextPow2(int.min));// 0writeln(nextPow2(long.max));// 0writeln(nextPow2(long.min));// 0
writeln(nextPow2(2.1));// 4.0writeln(nextPow2(-2.0));// -4.0writeln(nextPow2(0.25));// 0.5writeln(nextPow2(-4.0));// -8.0writeln(nextPow2(double.max));// 0.0writeln(nextPow2(double.infinity));// double.infinity
truncPow2(T)(const Tval)truncPow2(T)(const Tval)val.<>> can be any built-in numerical type.Tval | any number |
valwriteln(truncPow2(3));// 2writeln(truncPow2(4));// 4writeln(truncPow2(10));// 8writeln(truncPow2(4000));// 2048writeln(truncPow2(-5));// -4writeln(truncPow2(-20));// -16writeln(truncPow2(uint.max));// int.max + 1writeln(truncPow2(uint.min));// 0writeln(truncPow2(ulong.max));// long.max + 1writeln(truncPow2(ulong.min));// 0writeln(truncPow2(int.max));// (int.max / 2) + 1writeln(truncPow2(int.min));// int.minwriteln(truncPow2(long.max));// (long.max / 2) + 1writeln(truncPow2(long.min));// long.min
writeln(truncPow2(2.1));// 2.0writeln(truncPow2(7.0));// 4.0writeln(truncPow2(-1.9));// -1.0writeln(truncPow2(0.24));// 0.125writeln(truncPow2(-7.0));// -4.0writeln(truncPow2(double.infinity));// double.infinity