Double-Double Arithmetic and Special Function Implements
.NET 10.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 | incomplete elliptic integral, a=1...4, q ≤ 0.995 |
| 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.En(n, x) | [0,+inf) | 4 | exponential integral, n ≤ 256 |
| 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.GoldenRatio | 1.618033988749894848204... | Golden ratio |
| 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.FeigenbaumAlpha | 2.502907875095892822283... | 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 |
| ddouble.MalardiTheta | 1.910633236249018556327... | Malardi's angle |
| 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