Double-Double Arithmetic and Special Function Implements
.NET 8.0
type | mantissa bits | significant digits |
---|---|---|
ddouble | 106 | 31 |
limit | bin | dec |
---|---|---|
MaxValue | 2^1024 | 1.79769e308 |
Normal MinValue | 2^-968 | 4.00833e-292 |
Subnormal MinValue | 2^-1074 | 4.94066e-324 |
function | domain | mantissa error bits | note |
---|---|---|---|
ddouble.Sqrt(x) | [0,+inf) | 2 | |
ddouble.Cbrt(x) | (-inf,+inf) | 2 | |
ddouble.RootN(x, n) | (-inf,+inf) | 3 | |
ddouble.Log2(x) | (0,+inf) | 2 | |
ddouble.Log(x) | (0,+inf) | 3 | |
ddouble.Log(x, b) | (0,+inf) | 3 | |
ddouble.Log10(x) | (0,+inf) | 3 | |
ddouble.Log1p(x) | (-1,+inf) | 3 | log(1+x) |
ddouble.Pow2(x) | (-inf,+inf) | 1 | |
ddouble.Pow2m1(x) | (-inf,+inf) | 2 | pow2(x)-1 |
ddouble.Pow(x, y) | (-inf,+inf) | 2 | |
ddouble.Pow1p(x, y) | (-inf,+inf) | 2 | pow(1+x, y) |
ddouble.Pow10(x) | (-inf,+inf) | 2 | |
ddouble.Exp(x) | (-inf,+inf) | 2 | |
ddouble.Expm1(x) | (-inf,+inf) | 2 | exp(x)-1 |
ddouble.Sin(x) | (-inf,+inf) | 2 | |
ddouble.Cos(x) | (-inf,+inf) | 2 | |
ddouble.Tan(x) | (-inf,+inf) | 3 | |
ddouble.SinPi(x) | (-inf,+inf) | 1 | sin(πx) |
ddouble.CosPi(x) | (-inf,+inf) | 1 | cos(πx) |
ddouble.TanPi(x) | (-inf,+inf) | 2 | tan(πx) |
ddouble.Sinh(x) | (-inf,+inf) | 2 | |
ddouble.Cosh(x) | (-inf,+inf) | 2 | |
ddouble.Tanh(x) | (-inf,+inf) | 2 | |
ddouble.Asin(x) | [-1,1] | 2 | Accuracy deteriorates near x=-1,1. |
ddouble.Acos(x) | [-1,1] | 2 | Accuracy deteriorates near x=-1,1. |
ddouble.Atan(x) | (-inf,+inf) | 2 | |
ddouble.Atan2(y, x) | (-inf,+inf) | 2 | |
ddouble.AsinPi(x) | [-1,1] | 3 | Accuracy deteriorates near x=-1,1. |
ddouble.AcosPi(x) | [-1,1] | 3 | Accuracy deteriorates near x=-1,1. |
ddouble.AtanPi(x) | (-inf,+inf) | 3 | |
ddouble.Atan2Pi(y, x) | (-inf,+inf) | 3 | |
ddouble.Asinh(x) | (-inf,+inf) | 2 | |
ddouble.Acosh(x) | [1,+inf) | 2 | |
ddouble.Atanh(x) | (-1,1) | 4 | Accuracy deteriorates near x=-1,1. |
ddouble.Sinc(x, normalized) | (-inf,+inf) | 2 | normalized: x -> πx |
ddouble.Sinhc(x) | (-inf,+inf) | 3 | |
ddouble.Gamma(x) | (-inf,+inf) | 2 | Accuracy deteriorates near non-positive intergers. If x is Natual number lass than 35, an exact integer value is returned. |
ddouble.LogGamma(x) | (0,+inf) | 4 | |
ddouble.Digamma(x) | (-inf,+inf) | 4 | Near the positive root, polynomial interpolation is used. |
ddouble.Polygamma(n, x) | (-inf,+inf) | 4 | Accuracy deteriorates near non-positive intergers. n ≤ 16 |
ddouble.InverseGamma(x) | [sqrt(π)/2,+inf) | 2 | gamma^-1(x) |
ddouble.InverseDigamma(x) | (-inf,+inf) | 2 | digamma^-1(x) |
ddouble.RcpGamma(x) | (-inf,+inf) | 3 | 1/gamma(x) |
ddouble.LowerIncompleteGamma(nu, x) | [0,+inf) | 4 | nu ≤ 171.625 |
ddouble.UpperIncompleteGamma(nu, x) | [0,+inf) | 4 | nu ≤ 171.625 |
ddouble.LowerIncompleteGammaRegularized(nu, x) | [0,+inf) | 4 | nu ≤ 8192 |
ddouble.UpperIncompleteGammaRegularized(nu, x) | [0,+inf) | 4 | nu ≤ 8192 |
ddouble.InverseLowerIncompleteGamma(nu, x) | [0,1] | 8 | nu ≤ 8192 |
ddouble.InverseUpperIncompleteGamma(nu, x) | [0,1] | 8 | nu ≤ 8192 |
ddouble.Beta(a, b) | [0,+inf) | 4 | |
ddouble.LogBeta(a, b) | [0,+inf) | 4 | |
ddouble.IncompleteBeta(x, a, b) | [0,1] | 4 | Accuracy decreases when the radio of a,b is too large. a+b-max(a,b) ≤ 512 |
ddouble.IncompleteBetaRegularized(x, a, b) | [0,1] | 4 | Accuracy decreases when the radio of a,b is too large. a+b-max(a,b) ≤ 8192 |
ddouble.InverseIncompleteBeta(x, a, b) | [0,1] | 8 | Accuracy decreases when the radio of a,b is too large. a+b-max(a,b) ≤ 8192 |
ddouble.Erf(x) | (-inf,+inf) | 3 | |
ddouble.Erfc(x) | (-inf,+inf) | 3 | |
ddouble.InverseErf(x) | (-1,1) | 3 | |
ddouble.InverseErfc(x) | (0,2) | 3 | |
ddouble.Erfcx(x) | (-inf,+inf) | 3 | |
ddouble.Erfi(x) | (-inf,+inf) | 4 | |
ddouble.DawsonF(x) | (-inf,+inf) | 4 | |
ddouble.BesselJ(nu, x) | [0,+inf) | 6 | Accuracy deteriorates near root. abs(nu) ≤ 256 |
ddouble.BesselY(nu, x) | [0,+inf) | 6 | Accuracy deteriorates near root. abs(nu) ≤ 256 |
ddouble.BesselI(nu, x) | [0,+inf) | 6 | Accuracy deteriorates near root. abs(nu) ≤ 256 |
ddouble.BesselK(nu, x) | [0,+inf) | 6 | abs(nu) ≤ 256 |
ddouble.StruveH(n, x) | (-inf,+inf) | 4 | 0 ≤ n ≤ 8 |
ddouble.StruveK(n, x) | [0,+inf) | 4 | 0 ≤ n ≤ 8 |
ddouble.StruveL(n, x) | (-inf,+inf) | 4 | 0 ≤ n ≤ 8 |
ddouble.StruveM(n, x) | [0,+inf) | 4 | 0 ≤ n ≤ 8 |
ddouble.AngerJ(n, x) | (-inf,+inf) | 6 | |
ddouble.WeberE(n, x) | (-inf,+inf) | 6 | 0 ≤ n ≤ 8 |
ddouble.Jinc(x) | (-inf,+inf) | 3 | |
ddouble.EllipticK(m) | [0,1] | 4 | k: elliptic modulus, m=k^2 |
ddouble.EllipticE(m) | [0,1] | 4 | k: elliptic modulus, m=k^2 |
ddouble.EllipticPi(n, m) | [0,1] | 4 | k: elliptic modulus, m=k^2 |
ddouble.EllipticK(x, m) | [0,2π] | 4 | k: elliptic modulus, m=k^2 |
ddouble.EllipticE(x, m) | [0,2π] | 4 | k: elliptic modulus, m=k^2, incomplete elliptic integral |
ddouble.EllipticPi(n, x, m) | [0,2π] | 4 | k: elliptic modulus, m=k^2 Argument order follows wolfram. incomplete elliptic integral |
ddouble.EllipticTheta(a, x, q) | (-inf,+inf) | 4 | a=1...4, q ≤ 0.995, incomplete elliptic integral |
ddouble.KeplerE(m, e, centered) | (-inf,+inf) | 6 | inverse kepler's equation, e(eccentricity) ≤ 256 |
ddouble.Agm(a, b) | [0,+inf) | 2 | |
ddouble.FresnelC(x) | (-inf,+inf) | 4 | |
ddouble.FresnelS(x) | (-inf,+inf) | 4 | |
ddouble.FresnelF(x) | (-inf,+inf) | 4 | |
ddouble.FresnelG(x) | (-inf,+inf) | 4 | |
ddouble.Ei(x) | (-inf,+inf) | 4 | exponential integral |
ddouble.Ein(x) | (-inf,+inf) | 4 | complementary exponential integral |
ddouble.Li(x) | [0,+inf) | 5 | logarithmic integral li(x)=ei(log(x)) |
ddouble.Si(x, limit_zero) | (-inf,+inf) | 4 | sin integral, limit_zero=true: si(x) |
ddouble.Ci(x) | [0,+inf) | 4 | cos integral |
ddouble.Ti(x) | (-inf,+inf) | 4 | arctan integral |
ddouble.Shi(x) | (-inf,+inf) | 5 | hyperbolic sin integral |
ddouble.Chi(x) | [0,+inf) | 5 | hyperbolic cos integral |
ddouble.Clausen(x, normalized) | (-inf,+inf) | 3 | Clausen function of order 2, Cl_2(x), normalized: x -> πx |
ddouble.BarnesG(x) | (-inf,+inf) | 3 | |
ddouble.LogBarnesG(x) | (0,+inf) | 3 | |
ddouble.LambertW(x) | [-1/e,+inf) | 4 | |
ddouble.AiryAi(x) | (-inf,+inf) | 5 | Accuracy deteriorates near root. |
ddouble.AiryBi(x) | (-inf,+inf) | 5 | Accuracy deteriorates near root. |
ddouble.ScorerGi(x) | (-inf,+inf) | 5 | Accuracy deteriorates near root. |
ddouble.ScorerHi(x) | (-inf,+inf) | 4 | |
ddouble.JacobiSn(x, m) | (-inf,+inf) | 4 | k: elliptic modulus, m=k^2 |
ddouble.JacobiCn(x, m) | (-inf,+inf) | 4 | k: elliptic modulus, m=k^2 |
ddouble.JacobiDn(x, m) | (-inf,+inf) | 4 | k: elliptic modulus, m=k^2 |
ddouble.JacobiAm(x, m) | (-inf,+inf) | 4 | k: elliptic modulus, m=k^2 |
ddouble.JacobiArcSn(x, m) | [-1,+1] | 4 | k: elliptic modulus, m=k^2 |
ddouble.JacobiArcCn(x, m) | [-1,+1] | 4 | k: elliptic modulus, m=k^2 |
ddouble.JacobiArcDn(x, m) | [0,1] | 4 | k: elliptic modulus, m=k^2 |
ddouble.CarlsonRD(x, y, z) | [0,+inf) | 4 | |
ddouble.CarlsonRC(x, y) | [0,+inf) | 4 | |
ddouble.CarlsonRF(x, y, z) | [0,+inf) | 4 | |
ddouble.CarlsonRJ(x, y, z, rho) | [0,+inf) | 4 | |
ddouble.CarlsonRG(x, y, z) | [0,+inf) | 4 | |
ddouble.RiemannZeta(x) | (-inf,+inf) | 3 | |
ddouble.HurwitzZeta(x, a) | (1,+inf) | 3 | a ≥ 0 |
ddouble.DirichletEta(x) | (-inf,+inf) | 3 | |
ddouble.Polylog(n, x) | (-inf,1] | 3 | n ∈ [-4,8] |
ddouble.OwenT(h, a) | (-inf,+inf) | 5 | |
ddouble.Bump(x) | (-inf,+inf) | 4 | C-infinity smoothness basis function, bump(x)=1/(exp(1/x-1/(1-x))+1) |
ddouble.HermiteH(n, x) | (-inf,+inf) | 3 | n ≤ 64 |
ddouble.LaguerreL(n, x) | (-inf,+inf) | 3 | n ≤ 64 |
ddouble.LaguerreL(n, alpha, x) | (-inf,+inf) | 3 | n ≤ 64, associated |
ddouble.LegendreP(n, x) | (-inf,+inf) | 3 | n ≤ 64 |
ddouble.LegendreP(n, m, x) | [-1,1] | 3 | n ≤ 64, associated |
ddouble.ChebyshevT(n, x) | (-inf,+inf) | 3 | n ≤ 64 |
ddouble.ChebyshevU(n, x) | (-inf,+inf) | 3 | n ≤ 64 |
ddouble.ZernikeR(n, m, x) | [0,1] | 3 | n ≤ 64 |
ddouble.GegenbauerC(n, alpha, x) | (-inf,+inf) | 3 | n ≤ 64 |
ddouble.JacobiP(n, alpha, beta, x) | [-1,1] | 3 | n ≤ 64, alpha,beta > -1 |
ddouble.Bernoulli(n, x, centered) | [0,1] | 4 | n ≤ 64, centered: x->x-1/2 |
ddouble.Cyclotomic(n, x) | (-inf,+inf) | 1 | n ≤ 32 |
ddouble.MathieuA(n, q) | (-inf,+inf) | 4 | n ≤ 16 |
ddouble.MathieuB(n, q) | (-inf,+inf) | 4 | n ≤ 16 |
ddouble.MathieuC(n, q, x) | (-inf,+inf) | 4 | n ≤ 16, Accuracy deteriorates when q is very large. |
ddouble.MathieuS(n, q, x) | (-inf,+inf) | 4 | n ≤ 16, Accuracy deteriorates when q is very large. |
ddouble.EulerQ(q) | (-1,1) | 4 | |
ddouble.LogEulerQ(q) | (-1,1) | 4 | |
ddouble.Ldexp(x, y) | (-inf,+inf) | N/A | |
ddouble.Binomial(n, k) | N/A | 1 | n ≤ 1000 |
ddouble.Hypot(x, y) | N/A | 2 | |
ddouble.GeometricMean(x, y) | N/A | 2 | |
ddouble.Logit(x) | (0,1) | 2 | |
ddouble.Expit(x) | (-inf,+inf) | 2 | |
ddouble.Min(x, y) | N/A | N/A | |
ddouble.Max(x, y) | N/A | N/A | |
ddouble.Clamp(v, min, max) | N/A | N/A | |
ddouble.CopySign(value, sign) | N/A | N/A | |
ddouble.Floor(x) | N/A | N/A | |
ddouble.Ceiling(x) | N/A | N/A | |
ddouble.Round(x) | N/A | N/A | |
ddouble.Truncate(x) | N/A | N/A | |
IEnumerable<ddouble>.Sum() | N/A | N/A | |
IEnumerable<ddouble>.Average() | N/A | N/A | |
IEnumerable<ddouble>.Min() | N/A | N/A | |
IEnumerable<ddouble>.Max() | N/A | N/A |
constant | value | note |
---|---|---|
ddouble.Pi | 3.141592653589793238462... | Pi |
ddouble.E | 2.718281828459045235360... | Napier's E |
ddouble.Sqrt2 | 1.414213562373095048801... | Sqrt(2) |
ddouble.Lg2 | 0.301029995663981195213... | log10(2) |
ddouble.Lb10 | 3.321928094887362347870... | log2(10) |
ddouble.Ln2 | 0.693147180559945309417... | log(2) |
ddouble.LbE | 1.442695040888963407359... | log2(e) |
ddouble.EulerGamma | 0.577215664901532860606... | Euler's Gamma |
ddouble.Zeta3 | 1.202056903159594285399... | ζ(3), Apery const. |
ddouble.Zeta5 | 1.036927755143369926331... | ζ(5) |
ddouble.Zeta7 | 1.008349277381922826839... | ζ(7) |
ddouble.Zeta9 | 1.002008392826082214418... | ζ(9) |
ddouble.DigammaZero | 1.461632144968362341263... | Positive root of digamma |
ddouble.ErdosBorwein | 1.606695152415291763783... | Erdös Borwein constant |
ddouble.FeigenbaumDelta | 4.669201609102990671853... | Feigenbaum constant |
ddouble.LemniscatePi | 2.622057554292119810465... | Lemniscate constant |
ddouble.GlaisherA | 1.282427129100622636875... | Glaisher–Kinkelin constant |
ddouble.CatalanG | 0.915965594177219015055... | Catalan's constant |
ddouble.FransenRobinson | 2.807770242028519365222... | Fransén–Robinson constant |
ddouble.KhinchinK | 2.685452001065306445310... | Khinchin's constant |
ddouble.MeisselMertens | 0.261497212847642783755... | Meissel–Mertens constant |
ddouble.LambertOmega | 0.567143290409783873000... | LambertW(1) |
ddouble.LandauRamanujan | 0.764223653589220662991... | Landau–Ramanujan constant |
ddouble.MillsTheta | 1.306377883863080690469... | Mills constant |
ddouble.SoldnerMu | 1.451369234883381050284... | Ramanujan–Soldner constant |
ddouble.SierpinskiK | 0.822825249678847032995... | Sierpiński's constant, Define follows wolfram. |
ddouble.RcpFibonacci | 3.359885666243177553172... | Reciprocal Fibonacci constant |
ddouble.Niven | 1.705211140105367764289... | Niven's constant |
ddouble.GolombDickman | 0.624329988543550870992... | Golomb–Dickman constant |
sequence | note |
---|---|
ddouble.TaylorSequence | Taylor,1/n! |
ddouble.Factorial | Factorial,n! |
ddouble.BernoulliSequence | Bernoulli,B(2k) |
ddouble.HarmonicNumber | HarmonicNumber, H_n |
ddouble.StieltjesGamma | StieltjesGamma, γ_n |
- long (accurately)
ddouble v0 = 123;
long n0 = (long)v0;
- double (accurately)
ddouble v1 = 0.5;
double n1 = (double)v1;
- decimal (approximately)
ddouble v1 = 0.1m;
decimal n1 = (decimal)v1;
- string (approximately)
ddouble v2 = "3.14e0";
string s0 = v2.ToString();
string s1 = v2.ToString("E8");
string s2 = $"{v2:E8}";
BinaryWriter, BinaryReader