Overview
precise-numpy is a Python library for numerical computing with provable error bounds.
Every element is an interval stored as (midpoint, radius); every operation propagates
both values with hardware-directed rounding (MXCSR on x86_64), so results carry a rigorous
enclosure of the true mathematical value.
This is not a drop-in replacement for NumPy — arrays track two f64 values per element and
intervals behave differently from plain floats (see Semantics). It is a fast,
NumPy-flavored API for interval arithmetic.
Key capabilities:
- Hardware-directed rounding for guaranteed mathematical enclosures.
- Rust SIMD acceleration (AVX-512, AVX2/FMA, NEON) with Rayon parallelism.
- NumPy-like API: creation, indexing, broadcasting, reductions, stacking, linalg, random, I/O.
- GIL release during long computations.
Installation
pip install precise-numpy
Build from source:
git clone https://github.com/your-org/precise-numpy.git
cd precise-numpy
maturin develop --release
Requires Python >= 3.10 and a Rust toolchain. Wheels are built for CPython (abi3).
Quick Start
import precise_numpy as pnp
# Create interval arrays with error bounds
a = pnp.array([0.1, 0.2, 0.3], error=1e-4)
b = pnp.array([0.4, 0.5, 0.6], error=1e-4)
# Arithmetic propagates both midpoints and radii
c = a + b
print(c.radii()) # [2e-4, 2e-4, 2e-4]
print(c.max_radius()) # 2e-4
# Reductions return (midpoint, radius) tuples
mid, err = c.sum()
print(f"sum = {mid} +/- {err}")
# Inspect error growth
print("max relative error:", c.max_relative_error())
Semantics
- Values:
get(i),a[0],sum(), etc. return a(midpoint, radius)tuple. To get raw float arrays usea.values()/a.radii(). ==/!=mean interval overlap;<, <=, >, >=use strict endpoint ordering (a.hi < b.lo, etc.).- Division by zero raises a
RuntimeWarningand produces the entire real line (radiusinf) for the affected element. len(a)isa.shape[0], matching NumPy.- Reductions (
sum,mean, ...) support an optionalaxisargument; scalar results come back as(midpoint, radius)tuples, axis results asIntervalArrays. - dtype is
"interval64",itemsizeis 16 (twof64s per element). - Rounding (
round) uses round-half-to-even, like Python and NumPy. reshape(-1, ...)infers the missing dimension;transpose/.tsupport 1D/2D.
API Reference
Array creation
array(values, error=0.0), asarray, zeros(shape), ones, empty, full(shape, value, error=0.0),
eye(n, m=None, k=0), identity(n), diag(v), arange(start, stop, step=1.0),
linspace(start, stop, num=50, endpoint=True), from_raw_parts(midpoints, radii, shape).
Properties & conversions
shape, ndim, size, dtype, itemsize, nbytes, strides, t,
values(), radii(), tolist(), get(i), item(i), midpoint(i), radius(i),
copy(), flatten(), ravel(), reshape(*shape), transpose(), sort(), argsort().
Indexing
Integer (with negatives), slices (a[1:4], a[::-1]), fancy integer lists (a[[0, 2]]),
boolean masks (a[a > 2.0], a[BoolArray]), and 2D tuples (m[1, :], m[:, 0]).
Assignment works for integers, slices, and lists.
Arithmetic & math
+ - * / ** @, in-place variants, scalar operands on either side, NumPy broadcasting.
sin, cos, tan, exp, ln, log2, log10, sqrt, abs, floor, ceil, trunc, round, clip(a_min, a_max), sign, nan_to_num, power(x, y), maximum(x, y), minimum(x, y).
Comparisons
==, != (overlap), <, <=, >, >= (strict ordering) return BoolArray values with
& | ^ ~, any(), all(), sum(), count_nonzero(), tolist().
Reductions
sum, mean, prod, var, std, min, max, argmin, argmax, all, any — each with an optional
axis; plus min_val(), max_val(), cumsum(axis=None), norm() (L2).
Stacking & selection
concatenate(arrays, axis=0), stack, vstack, hstack, split(a, sections_or_indices, axis=0),
where(condition, x, y), nonzero(a) (tuple of index lists per axis).
Linear algebra (precise_numpy.linalg)
det, inv, solve(A, b), lstsq(A, b), pinv, eig, svd, norm.
Notes: eig (symmetric, Jacobi) and eig_general-style Hessenberg QR with real
eigenvalues only — complex pairs raise NotImplementedError/ValueError. svd returns
the thin decomposition U (m, k), s (k,), Vh (k, n) with k = min(m, n). All linalg
routines operate on midpoints (radius 0 results) except solve, which uses interval LU.
Random (precise_numpy.random)
seed, rand(*size), random_sample(*size), random(*size), randn(*size),
randint(low, high, *size), uniform(low, high, *size), normal(loc=0.0, scale=1.0, *size).
Deterministic xoshiro256** generator; no size argument returns a Python float.
File I/O
save(path, arr) / load(path) (binary) and savetxt(path, arr, fmt="%.17g") /
loadtxt(path) (text with a shape header). Both round-trip midpoints and radii.
Error-Bound Example: AI Quantization Audit
import precise_numpy as pnp
# Wrap input data with interval error bounds
X = pnp.array(floats, error=1e-4).reshape([128, 64])
W = pnp.array(weights).reshape([64, 64])
# Propagate error through a linear layer
Q = X.matmul(W)
print("Max Radius Error:", Q.max_radius())
print("Max Relative Error:", Q.max_relative_error())
See examples/quantization_safety_audit.py and
examples/precision_audit_test.py.
Performance Notes
Each element stores two f64 values and each op enforces directed rounding, so the library
is roughly 1.1x–1.7x slower than plain NumPy element-wise ops on large arrays while
tracking rigorous error bounds — and it is often faster than NumPy on small arrays because
the PyO3 extension avoids per-call Python dispatch overhead. See
examples/full_benchmark.py.
Technical Architecture
- Structure-of-Arrays (SoA) buffer: midpoints and radii in contiguous, 64-byte aligned
memory (
AlignedBuffer), enabling direct SIMD loads. - Single-pass streaming SIMD: radius bounds fused into one pass over both buffers (AVX-512, AVX2+FMA, NEON).
- Shared buffers:
IntervalArrayclones, slices, and reshapes are O(1) reference-counted. - GIL release: long-running kernels run under
py.allow_threads()with Rayon parallelism. - No external dependencies at runtime; pure Rust + pyo3.
Testing
cargo test # Rust unit tests (arithmetic, linalg, reduction, extra, random)
python -m unittest tests/python/test_api.py # Python integration tests
License
MIT License. See LICENSE for details.
Metadata
Release files for precise-numpy 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| precise_numpy-0.2.1.tar.gz | 461.4 kB | Without provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| precise_numpy-0.2.1-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| precise_numpy-0.2.1-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| precise_numpy-0.2.1-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 2.5 MB
Release files / precise_numpy-0.2.1.tar.gz
| Download URL | precise_numpy-0.2.1.tar.gz |
|---|---|
| Size | 461.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
098e8b53a3ce411e3ae754a88536eeb5653804a4ff8efe3832db0ba3ef262082
|
|
BLAKE2b-256 checksum How to use checksums |
555a375e3baac3d8523ff358b010bd443eba2c30c0417199f8f70cd4a810f904
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / precise_numpy-0.2.1-cp310-abi3-win_amd64.whl
| Download URL | precise_numpy-0.2.1-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 366.4 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
878c43d3934d4c45c7e2e2f4256f47ef6202b8bc5d895f13b7342e4bc24da8e0
|
|
BLAKE2b-256 checksum How to use checksums |
499cb441a3ba605aa1a8bb246c08fbc1a273a9af18bfea000a39ed8684148362
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 471.2 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
1ce385a6e9465c0dcff3ffdbed444f3b75d47be64e3f399398a70bb2036f82c2
|
|
BLAKE2b-256 checksum How to use checksums |
ec6688fd6b458f49ae0edec90d77655c0b27e1ad32f96b94f11fc9c66dd52e45
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | precise_numpy-0.2.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 417.8 kB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
edd295a8e8ee3a4434ce8f9df60f25c7b7939a15e1b475d20420c404c235ec39
|
|
BLAKE2b-256 checksum How to use checksums |
5afb3c6d46ae6828aa6d2518041be66ce02aceb5a264512259db9553f80c8bee
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / precise_numpy-0.2.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | precise_numpy-0.2.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 380.7 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
e7b3c40b02a972ce8c8b6fc3da8e96df0373fc65db94a4948967d1ac393ff995
|
|
BLAKE2b-256 checksum How to use checksums |
03b6d913b9bfca2d4127e896a3b1b37f823cbc2dbbd934ef531007ffee4ebe2b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Release files / precise_numpy-0.2.1-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | precise_numpy-0.2.1-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 435.0 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
04da83c07dab719a72ed71f81942b7ddc679d9e07cbd89dfe3cfacbb24bc10c6
|
|
BLAKE2b-256 checksum How to use checksums |
7f89f456387506226690d7b7044ec2c20655a344d8badf939a0b498931b9792a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Security for precise-numpy 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.