Foundation domain for mathlib-fp. All other domains depend on its units.
Copy and run the double-real quick start. It prints
5.0000 0.9750 using a shared array-free scalar path. The calls return
Double values and allocate no caller-visible workspace. Read the
newcomer guide before selecting another precision.
| Task | Start with | Contract or failure guidance |
|---|---|---|
| Shared real samples | TDoubleArray |
Shared types |
| Floating-point comparison | NearlyEqual |
Precision |
| Angles and triangle helpers | TTrigKit |
Trigonometry |
| Reproducible simulation | TLocalRandom |
Random-state contract |
| Portable saved numerical data | MathBase.Interchange |
Interchange format choice |
Run example 14 for complex scalars and
destination-reusing vector kernels, or example 20
for explicit random-state replay. TDoubleArray remains the shared real
container; moving to TComplexArray or a destination buffer is an explicit
choice documented by those guides. The examples are compiled and run in CI.
| Unit | File |
|---|---|
MathBase.SharedTypes |
MathBase.SharedTypes.pas |
MathBase.Complex |
MathBase.Complex.pas |
MathBase.MathConstants |
MathBase.MathConstants.pas |
MathBase.Precision |
MathBase.Precision.pas |
MathBase.Trigonometry |
MathBase.Trigonometry.pas |
MathBase.Iteration |
MathBase.Iteration.pas |
MathBase.Random |
MathBase.Random.pas |
MathBase.Interchange |
MathBase.Interchange.pas |
MathBase.Expressions |
MathBase.Expressions.pas |
Version 1.8 adds TLocalRandom, an explicit-state generator that never touches
the RTL global RandSeed, plus invariant text, delimited, Matrix Market, and
checked binary interchange. See the applied numerics guide
for the random-state contract and the interchange guide for
format versions, ownership, limits, and failure behaviour.
MathBase.Expressions is an opt-in, bounded mathematical evaluator for finite
scalar, vector, and dense-matrix symbol bindings. It supports arithmetic,
elementwise elementary functions, dot, matmul, and transpose, subject to
caller-selected text, depth, operation, and element limits. It deliberately
has no assignment, loops, recursion, I/O, process, environment, network, or
callback primitives. See the interchange guide for the
language and safety boundary.
Portable single- and double-precision complex arithmetic. TSingleComplex and
TComplex are value records with Re and Im fields; their operators never
mutate either operand.
uses MathBase.Complex;
var
Z, Root: TComplex;
begin
Z := TComplex.Create(3.0, 4.0);
Root := CSqrt(TComplex.Create(-4.0, 0.0)); // 0 + 2i
Writeln(Z.Magnitude:0:1); // 5.0
end;type
TSingleComplex = record
Re, Im: Single;
class function Create(ARe, AIm: Single): TSingleComplex; static;
function Conjugate: TSingleComplex;
function SqrMagnitude, Magnitude: Single;
function IsFinite: Boolean;
end;
TComplex = record
Re, Im: Double;
class function Create(ARe, AIm: Double): TComplex; static;
class function FromPolar(Radius, Angle: Double): TComplex; static;
function Conjugate: TComplex;
function SqrMagnitude, Magnitude, Argument: Double;
function IsFinite: Boolean;
end;
TSingleComplexArray = array of TSingleComplex;
TComplexArray = array of TComplex;Both types support addition, subtraction, multiplication, division, unary
negation, equality, conjugation, scale-safe magnitude, and finite checks.
ToComplex widens explicitly. ToSingleComplex narrows explicitly and rejects
a finite component outside the finite Single range; it never silently
discards an imaginary component.
TComplex additionally supports real-scalar variants and principal elementary
functions. Division and magnitude use scaled forms to
avoid avoidable intermediate overflow and underflow. CLog, CSqrt,
CPow, CAsin, CAcos, CAtan, CAsinh, CAcosh, and CAtanh return
principal values; CExp, CSin, CCos, CTan, CSinh, CCosh, and
CTanh are also provided.
For finite complex inputs, finite representable quotient results are preserved at extreme scales. Magnitude calculations return infinity when either component is infinite (including infinity paired with NaN) without performing an invalid infinity/infinity operation. A NaN component otherwise produces a NaN complex result; dividing a finite value by an infinite complex value produces zero.
Argument, CLog, and CSqrt preserve the upper/lower branch distinction on
the negative real axis, including signed-zero imaginary components. The
inverse functions preserve first-order tiny inputs, use scaled component and
asymptotic forms rather than squaring large complex inputs, and retain the
signed-zero side of their principal branch cuts. CExp(+Infinity + 0i) and
square roots with infinite components return their defined limiting values;
an indeterminate infinite imaginary angle or a NaN component returns a NaN
complex value.
Common numeric array types and a helper record shared by all domains.
| Type | Definition | Description |
|---|---|---|
TIntegerArray |
array of Integer |
Dynamic integer array |
TDoubleArray |
array of Double |
Dynamic double array |
TSingleArray |
array of Single |
Dynamic single array |
TExtendedArray |
array of Extended |
Dynamic extended array |
TDoublePair |
record Lower, Upper: Double |
Numeric interval / range |
function ToDoubleArray(const Data: TIntegerArray): TDoubleArray; overload;
function ToDoubleArray(const Data: TSingleArray): TDoubleArray; overload;
function ToDoubleArray(const Data: TExtendedArray): TDoubleArray; overload;Each overload copies every element into a new TDoubleArray, widening the numeric type as needed.
Compile-time constants for commonly needed mathematical and physical values.
| Constant | Value | Description |
|---|---|---|
MathPi |
3.14159265358979… | π |
MathE |
2.71828182845904… | Euler's number e |
MathPhi |
1.61803398874989… | Golden ratio φ |
MathSqrt2 |
1.41421356237309… | √2 |
MathLn2 |
0.69314718055994… | ln(2) |
MathLn10 |
2.30258509299404… | ln(10) |
| Constant | Value | Description |
|---|---|---|
BoltzmannConst |
1.380649 × 10⁻²³ | Boltzmann constant (J/K) |
StefanBoltzmannConst |
5.670374419 × 10⁻⁸ | Stefan-Boltzmann constant (W/m²/K⁴) |
IdealGasConst |
8.314462618 | Universal gas constant (J/mol/K) |
AvogadroConst |
6.02214076 × 10²³ | Avogadro constant (1/mol) |
StandardGravity |
9.80665 | Standard gravity (m/s²) |
StandardAtmosphere |
101325.0 | Standard atmosphere (Pa) |
StandardTemperature |
273.15 | Standard temperature, 0 °C (K) |
Low-level special functions used as building blocks by higher-level domains.
| Function | Signature | Description |
|---|---|---|
GammaLn |
(X: Double): Double |
ln(Γ(x)) via a double-precision Lanczos approximation for X > 0 |
Beta |
(Z, W: Double): Double |
Beta function B(z,w), with a cancellation-resistant large-parameter log form |
BetaInc |
(A, B, X: Double): Double |
Regularised incomplete beta I_x(a,b), using a convergence-checked continued fraction |
Erf |
(X: Double): Double |
Error function, evaluated through regularised incomplete-gamma ratios |
NormalCDF |
(X: Double): Double |
Standard normal Φ(x), with the negative tail evaluated directly |
StudentT |
(DF: Integer; X: Double): Double |
Student's t CDF helper for X ≥ 0 and DF ≥ 1 |
GammaLn and Beta require positive shape arguments. BetaInc requires
finite positive A and B and clamps X outside [0,1] to the corresponding
endpoint. Invalid shape arguments and failure to converge return NaN rather
than an unchecked partial iterate. Representable Beta underflow and overflow
return 0 and +Infinity respectively.
The checked-in reference corpus applies these measured acceptance budgets:
GammaLn 3e-15 relative (2e-13 absolute at the x=100 fixture); Beta
5e-15 relative for ordinary inputs and 2e-13 for the Beta(100,100) scale
case; BetaInc 2e-14 relative/2e-15 absolute for ordinary fixtures. Erf,
normal tails, and Student-t use absolute or tail-relative budgets in
TestMathBase.pas, because one ULP budget is misleading near zero and in the
tails. These are tested budgets over the published corpus, not universal
worst-case proofs.
StudentT intentionally covers only the non-negative half of the distribution
and returns NaN for negative X. Use TProbabilityKit.StudentTCDF for a complete
signed CDF. Its formula uses I(df/(df+x²); df/2, 1/2); the df/2 shape is
important for correct t-test p-values.
All methods are static class functions — no instance required.
class function DegToRad(const Degrees: Double): Double;
class function RadToDeg(const Radians: Double): Double;
class function GradToRad(const Grads: Double): Double;
class function RadToGrad(const Radians: Double): Double;class function NormalizeAngle(const Angle: Double): Double; // → [0, 2π)
class function NormalizeAngleDeg(const Angle: Double): Double; // → [0, 360)The normalisation routines use constant-time floating-point reduction, including for very large finite magnitudes. NaN and either infinity return NaN rather than looping.
class function Sin(const X: Double): Double;
class function Cos(const X: Double): Double;
class function Tan(const X: Double): Double;class function ArcSin(const X: Double): Double;
class function ArcCos(const X: Double): Double;
class function ArcTan(const X: Double): Double;
class function ArcTan2(const Y, X: Double): Double;class function Sinh(const X: Double): Double;
class function Cosh(const X: Double): Double;
class function Tanh(const X: Double): Double;class function ArcSinh(const X: Double): Double;
class function ArcCosh(const X: Double): Double; // X >= 1; returns NaN otherwise
class function ArcTanh(const X: Double): Double; // X in (-1, 1); returns NaN otherwiseThe hyperbolic and inverse-hyperbolic implementations use small-argument and large-argument forms to avoid losing tiny inputs through subtraction and to avoid avoidable intermediate overflow.
class function Sec(const X: Double): Double;
class function Csc(const X: Double): Double;
class function Cot(const X: Double): Double;| Method | Parameters | Description |
|---|---|---|
Hypotenuse |
A, B |
√(A² + B²) (Pythagoras) |
TriangleArea |
Base, Height |
½ × Base × Height |
TriangleAreaSAS |
SideA, Angle, SideB |
½ × a × b × sin(angle); angle in radians |
TriangleAreaSSS |
A, B, C |
Heron's formula |
TrianglePerimeter |
A, B, C |
A + B + C |
TriangleInRadius |
A, B, C |
Radius of inscribed circle |
TriangleCircumRadius |
A, B, C |
Radius of circumscribed circle |
| Method | Parameters | Description |
|---|---|---|
CircularSectorArea |
Radius, Angle |
½ r² θ; angle in radians |
CircularSegmentArea |
Radius, Angle |
½ r² (θ − sin θ); angle in radians |
ChordLength |
Radius, Angle |
2r sin(θ/2); angle in radians |
| Method | Parameters | Description |
|---|---|---|
VectorMagnitude |
X, Y |
Scaled Euclidean magnitude √(X² + Y²), avoiding intermediate square overflow |
VectorAngle |
X1, Y1, X2, Y2 |
Angle in radians ∈ [−π, π] from (X1,Y1) to (X2,Y2) |
The triangle, circle, reciprocal-trigonometric, and vector helpers do not reject negative dimensions, invalid triangle sides, zero divisors, or other degenerate geometry; validate such inputs in the calling application.
uses MathBase.MathConstants, MathBase.SharedTypes, MathBase.Precision, MathBase.Trigonometry;
var
HypLen: Double;
Normal: Double;
begin
HypLen := TTrigKit.Hypotenuse(3, 4); // 5.0
Normal := NormalCDF(1.96); // ≈ 0.975
Writeln(HypLen:0:4, ' ', Normal:0:4);
end.Expected output:
5.0000 0.9750
None. MathBase has no dependencies on other domains in mathlib-fp.
Invalid domains and non-finite inputs follow the exception or IEEE behavior documented beside each operation. In particular, precision predicates return a Boolean, while parsers, bounded expressions, invalid RNG state, and operations with an explicit finite-domain contract raise their named MathBase exception before returning a result.