https://github.com/tk-yoshimura/doubledouble
Double-Double Arithmetic and Special Function Implements
https://github.com/tk-yoshimura/doubledouble
arithmetic dotnet10 double-double high-precision math net10 numerical-computation special-function
Last synced: 10 days ago
JSON representation
Double-Double Arithmetic and Special Function Implements
- Host: GitHub
- URL: https://github.com/tk-yoshimura/doubledouble
- Owner: tk-yoshimura
- License: mit
- Created: 2021-11-23T05:58:57.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2026-01-14T03:49:35.000Z (28 days ago)
- Last Synced: 2026-01-14T07:28:18.907Z (28 days ago)
- Topics: arithmetic, dotnet10, double-double, high-precision, math, net10, numerical-computation, special-function
- Language: C#
- Homepage:
- Size: 6.68 MB
- Stars: 9
- Watchers: 1
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# DoubleDouble
Double-Double Arithmetic and Special Function Implements
## Requirement
.NET 10.0
## Install
[Download DLL](https://github.com/tk-yoshimura/DoubleDouble/releases)
[Download Nuget](https://www.nuget.org/packages/tyoshimura.doubledouble/)
## More Precision ?
[MultiPrecision](https://github.com/tk-yoshimura/MultiPrecision)
## Type
|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|
## Functions
|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||
## Constants
|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
|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|
## Casts
- long (accurately)
```csharp
ddouble v0 = 123;
long n0 = (long)v0;
```
- double (accurately)
```csharp
ddouble v1 = 0.5;
double n1 = (double)v1;
```
- decimal (approximately)
```csharp
ddouble v1 = 0.1m;
decimal n1 = (decimal)v1;
```
- string (approximately)
```csharp
ddouble v2 = "3.14e0";
string s0 = v2.ToString();
string s1 = v2.ToString("E8");
string s2 = $"{v2:E8}";
```
## I/O
BinaryWriter, BinaryReader
## Licence
[MIT](https://github.com/tk-yoshimura/DoubleDouble/blob/main/LICENSE)
## Author
[T.Yoshimura](https://github.com/tk-yoshimura)