add precomputed mathematical constants and specialize the second division residual
.NET Test / .NET tests (push) Successful in 2m23s
.NET Test / .NET tests (push) Successful in 2m23s
This commit is contained in:
@@ -16,8 +16,9 @@ for a single `double`, or `DoubleDouble.FromComponents(high, low)` for arbitrary
|
||||
components. The factory normalizes finite sums and canonicalizes NaN/infinity
|
||||
with a positive-zero low component. The two-component constructor is internal
|
||||
and performs no normalization or validation; it is reserved for trusted,
|
||||
already-normalized results. The constants `PI`, `E`, and `LN2` include binary64
|
||||
residuals checked against independently computed high-precision values.
|
||||
already-normalized results. Mathematical constants use precomputed high/low pairs
|
||||
checked against independently computed high-precision values; accessing them does
|
||||
not perform double-double arithmetic or allocate on the heap.
|
||||
|
||||
- Arithmetic: unary `+`/`-`, binary `+`, `-`, `*`, `/`, and both operand orders with
|
||||
a `double`. Addition retains residuals under cancellation; multiplication uses
|
||||
@@ -44,6 +45,39 @@ with exact component checks for selected representable cases. Near underflow,
|
||||
extended precision necessarily decreases; overflow produces infinity. Performance
|
||||
of the allocating exponent-boundary path is not covered by the basic benchmarks.
|
||||
|
||||
## Predefined mathematical constants
|
||||
|
||||
All constants below are static `DoubleDouble` properties. Each stores the nearest
|
||||
binary64 high component followed by the nearest binary64 residual, rather than
|
||||
calculating a ratio, root, or logarithm on access. Names use PascalCase, including
|
||||
`Pi`, `E`, and `Ln2`.
|
||||
|
||||
| Group | Properties and values |
|
||||
|---|---|
|
||||
| Circle and common angles | `Pi` (π), `Tau` (2π), `PiOver2`, `PiOver3`, `PiOver4`, `PiOver6` |
|
||||
| Angular conversion | `DegToRad` (π/180), `RadToDeg` (180/π), `InvPi` (1/π), `InvTau` (1/(2π), radians to turns) |
|
||||
| Exponential and logarithmic | `E`, `InvE` (1/e), `Ln2` (ln 2), `Ln10` (ln 10) |
|
||||
| Log-base conversion | `Log2E` (1/ln 2), `Log10E` (1/ln 10), `Log2Of10` (ln 10/ln 2), `Log10Of2` (ln 2/ln 10) |
|
||||
| Roots and geometry | `Sqrt2`, `Sqrt3`, `Sqrt5`, `InvSqrt2`, `InvSqrt3`, `GoldenRatio` ((1+√5)/2) |
|
||||
| Gaussian and error-function factors | `SqrtPi`, `InvSqrtPi`, `TwoInvSqrtPi` (2/√π), `SqrtTau` (√(2π)), `InvSqrtTau` (1/√(2π)) |
|
||||
|
||||
Multiply by conversion factors instead of recomputing them:
|
||||
|
||||
```csharp
|
||||
using Just.PreciseMath;
|
||||
|
||||
DoubleDouble degrees = new(180.0);
|
||||
DoubleDouble radians = degrees * DoubleDouble.DegToRad;
|
||||
DoubleDouble convertedDegrees = radians * DoubleDouble.RadToDeg;
|
||||
DoubleDouble quarterTurn = DoubleDouble.PiOver2;
|
||||
```
|
||||
|
||||
The factors avoid deriving constants at runtime; the multiplication itself remains
|
||||
approximate DD arithmetic, so conversions are not guaranteed exact round trips.
|
||||
The list is mathematical and dimensionless, not a table of unit-dependent physical
|
||||
constants. Precomputed roots/logarithms do not imply general `Sqrt`/`Log` functions
|
||||
are implemented.
|
||||
|
||||
## Conversions and formatting
|
||||
|
||||
- Explicit conversions support `double`, `float`, `int`, `long`, and `decimal`
|
||||
|
||||
Reference in New Issue
Block a user