Skip to main content

High-performance cross-platform 128-bit arithmetic for SIMD applications.

Project description

simd-f128 Logo
High-performance, zero-allocation 128-bit floating-point arithmetic powered by hardware SIMD.

simd-f128

Linux macOS Windows WASM Mobile PyPI NPM

License: MIT Language Language Header-Only Zero-Allocation No-Dependencies Last Commit

Read the Official Documentation: docs/index.md
Try the Live WebAssembly Demo: https://tiw302.github.io/simd-f128/demo/

Verified Compatibility — 11/11 Platforms Passing

Architecture Platform Verified Backend
x86_64 (Modern) Linux / Windows AVX2 (Vectorized)
x86_64 (Legacy) Linux / Windows SSE2 (Vectorized)
ARM64 (Apple) macOS (M1/M2/M3) NEON (Vectorized)
ARM64 (Android) Mobile NEON (Vectorized)
ARMv7 (Android) Mobile Scalar C11
WebAssembly Chrome / Node.js WASM-SIMD128
WebAssembly Universal Web WASM Scalar
RISC-V64 Linux (QEMU) Scalar C11
General Desktop Linux / Windows Scalar C11 Fallback

Table of Contents


Introduction

simd-f128 is a professional-grade, header-only C library for 128-bit (Double-Double) floating-point arithmetic, featuring automatic hardware SIMD acceleration (AVX2, NEON, WASM-SIMD). It explicitly targets the precision gap between standard 64-bit IEEE 754 doubles and heavyweight arbitrary-precision libraries like GMP.

By delivering 31-32 decimal digits of accuracy with zero heap allocation overhead, simd-f128 is purpose-built for demanding workloads—such as fractal rendering, physical simulations, and orbital mechanics. While the core engine is pure C11, it provides seamless native bindings for C++, Python, WebAssembly, and Rust, allowing developers across multiple ecosystems to easily overcome the limits of standard double precision.


Why simd-f128?

Ever zoomed into a Mandelbrot set and watched the detail dissolve into grey mush? That's double precision dying — at zoom levels beyond ~10^-14, two distinct coordinates become the same value and the image collapses entirely. The same silent failure happens in long-running simulations, ill-conditioned linear algebra, and anywhere small errors compound over time.

The usual fixes each carry a significant cost:

Option Precision Performance Allocation Portability
double ~15 digits Native Hardware None Universal
long double 18-19 digits (x87) Fast None Compiler-dependent
__float128 (GCC) ~33 digits Emulated (Slow) None GCC/Clang only
GMP / MPFR Arbitrary Very Slow Heap Portable
simd-f128 ~31 digits Hardware SIMD (Fast) None Universal

__float128 gets close on precision but locks you into GCC/Clang and is noticeably slower due to software emulation. GMP/MPFR are powerful but heap-allocating inside a render loop is a non-starter.

simd-f128 occupies the exact gap: it doubles usable precision with zero allocation, zero dependencies, and no compiler lock-in — proven in practice by mandelbrot-c, which achieves stable deep-zoom rendering at coordinates down to 10^-28, far beyond what standard double can represent.

Performance Benchmarks

Below is a benchmark comparison of basic arithmetic operations running on 10,000,000 iterations (latency mode):

Data Type Add (ms) Mul (ms) Div (ms) Relative Multiplication Speed
double (64-bit) 9.26 9.23 41.12 1.00x (Baseline)
long double (x87) 20.21 20.33 47.49 0.45x
__float128 (GCC) 139.67 186.94 298.76 0.05x
simd-f128 (SIMD) 97.76 73.32 204.05 0.13x (2.55x faster than GCC)

As shown, simd-f128 is 1.4x to 2.5x faster than GCC's software-emulated __float128, making it the highest-performance choice for 128-bit precision.


Design Philosophy

The library is built around three constraints that were never relaxed during development:

Zero allocation. Every operation executes entirely in CPU registers. There are no calls to malloc, no temporary buffers, and no GC pressure. This makes simd-f128 suitable for use inside tight render loops, interrupt handlers, and embedded firmware where heap allocation is prohibited.

No configuration required. The correct SIMD backend — AVX2, SSE2, NEON, WASM-SIMD, or scalar — is selected automatically at compile time based on the target architecture. If a specific hardware SIMD instruction set is not detected by the compiler, it seamlessly and safely falls back to a highly portable scalar implementation.

Standard C foundation. The library is built entirely on IEEE 754 double arithmetic and C11 standard library functions. It does not rely on compiler extensions, non-standard intrinsics outside of guarded #ifdef blocks, or platform-specific ABI assumptions. The scalar fallback compiles and produces correct results on any C99-compliant toolchain.


Limitations & Technical Notes

Double-Double vs IEEE 754 128-bit: Please note that simd-f128 uses Double-Double arithmetic (an unevaluated sum of two standard 64-bit double values) to achieve approximately 31 decimal digits of precision. It is not a strictly compliant IEEE 754 binary128 implementation.

While this approach offers massive performance benefits and is perfect for deeply zooming into fractals (like in mandelbrot-c), it is susceptible to Catastrophic Cancellation in specific scenarios (e.g., subtracting two nearly identical values). If you are building highly sensitive physics simulations or rigorous numerical analysis tools where IEEE 754 edge-case compliance is strictly required, a heavier library like GMP/MPFR or compiler-specific __float128 may be more appropriate.


Requirements

Component Requirement
C Standard C11 or later (C99 compatible for scalar path)
C++ Standard C++11 or later (for simd_f128.hpp only)
Compiler GCC 4.9+, Clang 3.5+, MSVC 2019+, Emscripten 3.0+
Math library -lm required on Linux/UNIX (for fma())

Verified Toolchains

The following toolchains are tested on every commit via CI. All others fall back to the scalar path and are expected to produce correct results.

Toolchain Version Platform Backend
GCC 11+ Linux x86_64 Scalar, SSE2, AVX2
GCC (aarch64-linux-gnu) 11+ Linux ARM64 (QEMU) NEON
GCC (arm-linux-gnueabihf) 11+ Linux ARMv7 (QEMU) Scalar + VFPv4
GCC (riscv64-linux-gnu) 11+ Linux RISC-V64 (QEMU) Scalar
Clang 14+ macOS Apple Silicon NEON
Clang 14+ macOS Intel Scalar, SSE2, AVX2
MSVC 2022 Windows x64 SSE2, AVX2
Emscripten 3.0+ WASM (Node.js/Web) WASM-SIMD, Scalar

Build and Installation

simd-f128 can be integrated natively via C/C++ headers, Python, or JavaScript (WebAssembly).

Python (PyPI)

pip install simd-f128

JavaScript / Node.js (NPM)

npm install @tiw302/simd-f128

C/C++ (Header Only)

simd-f128 is header-only. The simplest integration is copying the include/ directory directly into your project, then defining the implementation macro in exactly one translation unit:

#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.h>
#include <simd_f128_io.h>   // optional

All other translation units include the headers without the macro.

For C++ projects, include the convenience wrapper instead:

#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.hpp>   // pulls in all headers automatically

CMake

System Install (Recommended) You can install the library system-wide to easily use find_package in other projects:

cmake -S . -B build
sudo cmake --install build

Then in your project's CMakeLists.txt:

find_package(simd_fp REQUIRED)
target_link_libraries(my_app PRIVATE simd_fp::simd_fp)

Local Build Options

# Scalar backend (default - works everywhere)
cmake -S . -B build
cmake --build build

# AVX2 backend (Intel/AMD Haswell+)
cmake -S . -B build -DSIMD_F128_AVX2=ON
cmake --build build

# WebAssembly + SIMD128 (Chrome 91+, Firefox 89+, Safari 16.4+, Node.js 16+)
emcmake cmake -S . -B build -DSIMD_F128_WASM=ON
cmake --build build

# WebAssembly Scalar (maximum browser compatibility)
emcmake cmake -S . -B build
cmake --build build

# ARMv7 - optional flag for hardware FMA on VFPv4 cores
cmake -S . -B build -DCMAKE_C_FLAGS="-mfpu=neon-vfpv4 -mfloat-abi=hard"
cmake --build build

AArch64 (Apple Silicon, Graviton, Android ARM64) requires no flags - NEON is auto-detected. Run tests after building:

ctest --test-dir build

Library Components

simd_f128.h (Core)

The central engine of the library. Implements the Double-Double type and all fundamental arithmetic operations. All functions are static inline - no separate compilation unit is needed beyond the SIMD_F128_IMPLEMENTATION guard.

Key properties:

  • ~106-bit mantissa - roughly 31-32 decimal digits of precision.
  • Zero heap allocation - all operations execute directly in CPU registers, suitable for tight inner loops.
  • Automatic SIMD dispatch - selects AVX2/SSE2 (__m128d) on Intel/AMD, NEON (float64x2_t) on ARM64/Apple Silicon, WASM-SIMD (v128_t) on the web, or falls back to scalar C99.
  • Branch-free fast paths - minimal branching (restricted to Inf/NaN guards) ensures consistent execution time and avoids pipeline stalls in the hot path.
  • Strict IEEE 754 foundation - built on standard double, fully compatible with existing hardware.
#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.h>

int main() {
    simd_f128 a = simd_f128_from_double(1.234567890123456789);
    simd_f128 b = simd_f128_from_double(2.0);

    simd_f128 sum  = simd_f128_add(a, b);
    simd_f128 diff = simd_f128_sub(a, b);
    simd_f128 prod = simd_f128_mul(a, b);
    simd_f128 quot = simd_f128_div(a, b);
    simd_f128 root = simd_f128_sqrt(a);

    return 0;
}

simd_f128_consts.h

Pre-computed, high-precision mathematical constants stored as Double-Double pairs. Each constant captures the full ~106-bit mantissa, avoiding the precision loss inherent in standard 64-bit initialisers.

#include <simd_f128.h>
#include <simd_f128_consts.h>

int main() {
    simd_f128 pi     = SIMD_F128_PI;    // 3.14159265358979323846...
    simd_f128 e      = SIMD_F128_E;     // 2.71828182845904523536...
    simd_f128 sqrt_2 = SIMD_F128_SQRT2; // 1.41421356237309504880...
    simd_f128 ln2    = SIMD_F128_LN2;   // 0.69314718055994530941...

    return 0;
}

simd_f128_io.h

Handles conversion between the internal Double-Double representation and human-readable decimal strings. Standard printf formatting cannot faithfully render 128-bit values; this header uses an iterative high-precision extraction algorithm to produce up to 32 correct decimal places.

#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.h>
#include <simd_f128_io.h>

int main() {
    // parsing from string maintains the full 31-digit precision
    simd_f128 val = simd_f128_from_string("3.1415926535897932384626433832795");

    // direct console output
    simd_f128_print(val);

    // string conversion for logging or ui
    char buffer[128];
    simd_f128_to_string(buffer, sizeof(buffer), val);

    return 0;
}

simd_f128_math.h

Advanced mathematical functions built on top of the core Double-Double primitives. All functions are static inline and require no additional compilation unit.

Algorithms used:

  • exp — range reduction to $N=16$ intervals followed by a high-degree Chebyshev minimax polynomial, then exact scaling via ldexp and a 16-entry lookup table. Handles overflow (> 709.78) and underflow explicitly.
  • log — seeds from the standard double log(), then refines with 1 iteration of Halley's method, which is mathematically sufficient to recover all 31-32 digits due to cubic convergence.
  • pow — computed as exp(exp * log(base)). Supports base-zero inputs and propagates NaN according to IEEE-754.
  • sin — range-reduces to quadrant ($[-\pi/4, \pi/4]$) then evaluates a highly-tuned Chebyshev minimax polynomial.
  • cos — range-reduces to quadrant ($[-\pi/4, \pi/4]$) then evaluates a highly-tuned Chebyshev minimax polynomial.
  • sincos — computes both sine and cosine simultaneously, saving redundant Range Reduction and polynomial evaluation steps.
#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.h>
#include <simd_f128_consts.h>
#include <simd_f128_math.h>

int main() {
    simd_f128 x = SIMD_F128_PI;

    // e^π
    simd_f128 epi = simd_f128_exp(x);

    // ln(e) == 1
    simd_f128 one = simd_f128_log(SIMD_F128_E);

    // 2^10 == 1024
    simd_f128 base = simd_f128_from_double(2.0);
    simd_f128 exp  = simd_f128_from_double(10.0);
    simd_f128 pw   = simd_f128_pow(base, exp);

    // sin(π/6) == 0.5
    simd_f128 half_pi = simd_f128_mul(x, simd_f128_from_double(1.0 / 6.0));
    simd_f128 s       = simd_f128_sin(half_pi);

    // cos(0) == 1
    simd_f128 c = simd_f128_cos(simd_f128_from_double(0.0));

    return 0;
}

Note: sin and cos use a simplified range reduction suitable for moderate arguments. For very large inputs (|x| > ~10^15), consider applying Payne-Hanek argument reduction externally before calling these functions.


simd_f128_utils.h

Comparison operators and utility functions. All are static inline and work with any SIMD backend.

The foundation is simd_f128_cmp, which compares the hi components first and only falls through to the lo components when hi values are identical — matching the canonical Double-Double ordering rule.

#include <simd_f128.h>
#include <simd_f128_utils.h>

int main() {
    simd_f128 a = simd_f128_from_double(1.0);
    simd_f128 b = simd_f128_from_double(2.0);

    // comparisons
    int lt = simd_f128_lt(a, b);  // 1
    int eq = simd_f128_eq(a, b);  // 0
    int ge = simd_f128_ge(b, a);  // 1

    // utility
    simd_f128 neg = simd_f128_from_double(-3.14);
    simd_f128 abs_val = simd_f128_abs(neg);       // 3.14...
    simd_f128 lo      = simd_f128_min(a, b);      // 1.0
    simd_f128 hi      = simd_f128_max(a, b);      // 2.0

    return 0;
}

simd_f128.hpp

A modern C++ wrapper that makes simd_f128 feel like a native arithmetic type. Include this single header in C++ projects — it pulls in all other headers automatically.

Features:

  • f128::float128 class with full operator overloading (+, -, *, /, +=, -=, *=, /=).
  • Full interoperability with std::complex<double> via f128::complex128.
  • Seamless integration with the Eigen matrix library via simd_f128_eigen.hpp.
  • All six comparison operators (==, !=, <, >, <=, >=).
  • Unary negation (-x).
  • std::ostream integration (std::cout << val).
  • Free functions mirroring <cmath>: f128::exp, f128::log, f128::pow, f128::sin, f128::cos, f128::sqrt, f128::abs.
  • Predefined constants: f128::pi, f128::e, f128::sqrt2, f128::ln2.
#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.hpp>
#include <iostream>

int main() {
    f128::float128 a(1.5);
    f128::float128 b(2.5);

    // natural arithmetic
    f128::float128 sum  = a + b;
    f128::float128 prod = a * b;

    // math functions
    f128::float128 root = f128::sqrt(a);
    f128::float128 s    = f128::sin(f128::pi);

    // stream output
    std::cout << "a + b = " << sum  << "\n";
    std::cout << "a * b = " << prod << "\n";
    std::cout << "sqrt(a) = " << root << "\n";

    // comparisons
    if (a < b) {
        std::cout << "a is smaller\n";
    }

    return 0;
}

The float128 class stores a simd_f128 data member publicly, so it can be passed directly to any C API function when needed:

f128::float128 val(3.14);
simd_f128_print(val.data);  // call c api directly

API Reference

simd_f128.h

Function Signature Description
simd_f128_from_double simd_f128 simd_f128_from_double(double d) Promote a double to 128-bit. lo is initialised to 0.0.
simd_f128_extract void simd_f128_extract(simd_f128 x, double* hi, double* lo) Extract the hi and lo components into separate doubles.
simd_f128_add simd_f128 simd_f128_add(simd_f128 a, simd_f128 b) Double-Double addition via Knuth's TwoSum.
simd_f128_sub simd_f128 simd_f128_sub(simd_f128 a, simd_f128 b) Double-Double subtraction (negates b, then adds).
simd_f128_mul simd_f128 simd_f128_mul(simd_f128 a, simd_f128 b) Double-Double multiplication via Dekker's TwoProd + FMA.
simd_f128_div simd_f128 simd_f128_div(simd_f128 a, simd_f128 b) Double-Double division via Newton-Raphson reciprocal refinement.
simd_f128_sqrt simd_f128 simd_f128_sqrt(simd_f128 x) Square root via inverse-sqrt Newton-Raphson + residual correction.

simd_f128_consts.h

Constant Value (first 32 digits)
SIMD_F128_PI 3.14159265358979323846264338327950...
SIMD_F128_E 2.71828182845904523536028747135266...
SIMD_F128_SQRT2 1.41421356237309504880168872420969...
SIMD_F128_LN2 0.69314718055994530941723212145817...

simd_f128_io.h

Function Signature Description
simd_f128_print void simd_f128_print(simd_f128 x) Print the value to stdout followed by a newline.
simd_f128_to_string void simd_f128_to_string(char* buf, size_t buf_size, simd_f128 x) Write up to 32 decimal digits into buf. buf must be at least 64 bytes. Handles nan, inf, and negative values.

simd_f128_math.h

Function Signature Description
simd_f128_exp simd_f128 simd_f128_exp(simd_f128 x) e^x. Returns +Inf for x > 709.78, 0 for x < -745.
simd_f128_log simd_f128 simd_f128_log(simd_f128 x) Natural logarithm. Returns NaN for x ≤ 0.
simd_f128_pow simd_f128 simd_f128_pow(simd_f128 base, simd_f128 exp) base^exp. Correctly handles base zero, infinity, and NaN according to IEEE-754.
simd_f128_sin simd_f128 simd_f128_sin(simd_f128 x) Sine (radians). Best accuracy for moderate arguments.
simd_f128_cos simd_f128 simd_f128_cos(simd_f128 x) Cosine (radians). Best accuracy for moderate arguments.
simd_f128_sincos void simd_f128_sincos(simd_f128 x, simd_f128* s, simd_f128* c) Computes sine and cosine simultaneously.

simd_f128_utils.h

Function Signature Description
simd_f128_cmp int simd_f128_cmp(simd_f128 a, simd_f128 b) Returns -1 if a < b, 1 if a > b, 0 if equal.
simd_f128_eq int simd_f128_eq(simd_f128 a, simd_f128 b) 1 if a == b.
simd_f128_gt int simd_f128_gt(simd_f128 a, simd_f128 b) 1 if a > b.
simd_f128_lt int simd_f128_lt(simd_f128 a, simd_f128 b) 1 if a < b.
simd_f128_ge int simd_f128_ge(simd_f128 a, simd_f128 b) 1 if a >= b.
simd_f128_le int simd_f128_le(simd_f128 a, simd_f128 b) 1 if a <= b.
simd_f128_abs simd_f128 simd_f128_abs(simd_f128 x) Absolute value. Correctly handles -0.0 in the lo component.
simd_f128_min simd_f128 simd_f128_min(simd_f128 a, simd_f128 b) Returns the lesser of a and b.
simd_f128_max simd_f128 simd_f128_max(simd_f128 a, simd_f128 b) Returns the greater of a and b.

simd_f128.hpp (C++ only)

Symbol Kind Description
f128::float128 Class C++ wrapper around simd_f128.
f128::float128(double) Constructor Construct from a double.
f128::float128(simd_f128) Constructor Construct from a raw simd_f128.
float128::extract(hi, lo) Method Extract hi and lo components.
+, -, *, / Operators Arithmetic operators.
+=, -=, *=, /= Operators Compound assignment operators.
==, !=, <, >, <=, >= Operators Comparison operators.
operator-() Unary Negation.
float128::to_string() Method Returns std::string with 32-digit representation.
operator<< Stream std::ostream integration.
f128::exp, f128::log, f128::pow Free functions Transcendental math.
f128::sin, f128::cos, f128::sqrt, f128::abs Free functions Trigonometric and utility math.
f128::pi, f128::e, f128::sqrt2, f128::ln2 Constants High-precision constants as float128.

Precision Demonstration & Test Results

The core advantage of simd-f128 is preserving small values that standard 64-bit doubles silently discard. All operations execute strictly within SIMD registers without heap allocation.

Here is an actual test run and precision comparison from the Extreme Performance build:

~/Public/simd-f128 master* ⇡
❯ ctest --test-dir build -C Release
Test project /simd-f128/build
    Start 1: arithmetic_test
1/2 Test #1: arithmetic_test ..................   Passed    0.00 sec
    Start 2: arithmetic_test_cpp
2/2 Test #2: arithmetic_test_cpp ..............   Passed    0.00 sec

100% tests passed, 0 tests failed out of 2

~/Public/simd-f128 master* ⇡
❯ ./build/example_precision
--- precision comparison: double vs simd-f128 ---

[double]  1.0 + 1e-17 = 1.00000000000000000000
          precision lost: yes

[simd-f128] 1.0 + 1e-17 = 1.00000000000000001000000000000000
          precision lost: no


~/Public/simd-f128 master* ⇡
❯ ./build/example_mandelbrot
--- mandelbrot core loop (128-bit precision) ---

did not escape after 500 iterations (point is inside the Mandelbrot set)

final |z| components:
  zx = -0.78124578860038387003505655582563
  zy = 0.35443468442007221298624089031401

Performance & Benchmarks

Because simd-f128 operations are purely CPU-register bound, they are extremely fast.

1. Comparative Speed vs __float128

While raw nanoseconds are interesting, a direct comparison against __float128 demonstrates the massive advantage of hardware SIMD over software emulation. The test simulates loop-carried dependency latency (e.g., a = a + b) simulating tight inner-loops in numerical algorithms. Tests run for 10,000,000 operations.

Data Type Add (ms) Mul (ms) Div (ms)
double (64-bit) 9.24 9.23 41.83
long double (x87) 20.70 20.66 48.49
__float128 (GCC) 153.37 193.23 325.37
simd-f128 (AVX2) 99.44 74.46 207.98
View raw console output from bench_compare
$ ./build/benchmarks/bench_compare

simd-f128 Manual Benchmark Comparison
Iterations: 10000000 operations per test (latency mode)

| Data Type          | Add (ms) | Mul (ms) | Div (ms) |
|--------------------|----------|----------|----------|
|--------------------|----------|----------|----------|
| double (64-bit)    |     9.24 |     9.23 |    41.83 |
| long double (x87)  |    20.70 |    20.66 |    48.49 |
| __float128 (GCC)   |   153.37 |   193.23 |   325.37 |
| simd-f128 (SIMD)   |    99.44 |    74.46 |   207.98 |

Analysis: simd-f128 on AVX2 decisively outperforms GCC's software-emulated __float128. Specifically, multiplication is 2.59x faster, addition is 1.54x faster, and division is 1.56x faster. This is achieved through the aggressive use of Hardware FMA (Fused Multiply-Add), which rapidly resolves Dekker's split algorithms natively in silicon without relying on slower branching software emulation.

2. WebAssembly (In-Browser) Benchmarks

The library ships with dual WebAssembly modules to maximise both performance and compatibility. The benchmarks below reflect 1,000,000 continuous simd_f128_mul operations running entirely inside the V8 JavaScript engine (Chrome).

Module Type Time (ms) Notes
WASM-SIMD128 ~295 ms Native 128-bit SIMD processing inside the browser.
WASM-Scalar ~481 ms Fallback for older browsers without SIMD support.
Native JS Number ~1.5 ms Native 64-bit precision (loss of 15 digits of precision).

Takeaway: WASM-SIMD128 achieves a ~1.6x speedup over scalar WASM inside the browser. While native JS Number is incredibly fast due to JIT compilation of single hardware instructions, it completely fails to preserve precision past 15 digits. simd-f128 enables software running in the browser to maintain 32-digit precision with highly acceptable latency for real-time visualization and mathematical processing.

3. Raw Speed (Google Benchmark)

A single simd_f128_mul completes in ~10 nanoseconds, and advanced math functions run in the ~170-490ns range.

Run on (12 X 3266.69 MHz CPU s)
CPU Caches:
  L1 Data 32 KiB (x6)
  L1 Instruction 32 KiB (x6)
  L2 Unified 512 KiB (x6)
  L3 Unified 16384 KiB (x1)
-----------------------------------------------------------
Benchmark                 Time             CPU   Iterations
-----------------------------------------------------------
BM_SimdF128_Add        11.7 ns         11.7 ns     60057911
BM_SimdF128_Mul        10.1 ns         10.1 ns     69579904
BM_SimdF128_Div        2.87 ns         2.86 ns    244206304
BM_SimdF128_Sqrt       6.05 ns         6.04 ns    115940003
BM_SimdF128_Exp         192 ns          192 ns      3646032
BM_SimdF128_Log         240 ns          240 ns      2920704
BM_SimdF128_Sin         192 ns          192 ns      3645663
BM_SimdF128_Cos         200 ns          199 ns      3510110
BM_SimdF128_Atan        402 ns          401 ns      1743733
BM_SimdF128_Pow         492 ns          491 ns      1426559

Double-Double Arithmetic

simd-f128 represents a value $x$ as the unevaluated sum of two IEEE 754 doubles:

$$x = x_{hi} + x_{lo}, \quad |x_{lo}| \leq \frac{1}{2} , \text{ulp}(x_{hi})$$

This non-overlapping constraint provides ~106 bits of mantissa — approximately double the precision of a single double.

Implementation basis:

  • Addition: TwoSum (Knuth) — An error-free transformation (EFT) for addition that captures the exact rounding residual.
  • Multiplication: TwoProd (Dekker) — Exploits hardware FMA (Fused Multiply-Add) where available. On platforms lacking FMA, it seamlessly falls back to Veltkamp's Split to divide 53-bit mantissas into 26-bit halves, calculating the exact error product natively without precision loss.
  • Division: Newton-Raphson Iteration — Approximates the reciprocal $1/b_{hi}$ and refines it quadratically. Includes rigorous guards against NaN propagation during division-by-zero scenarios.
  • Square Root: Newton-Raphson with Residual Correction — Uses the hardware sqrt instruction to generate a perfect 53-bit initial guess, followed by a Newton-Raphson iteration with residual correction to accurately recover the full ~106-bit mantissa.
  • Normalisation — Every arithmetic operation rigidly re-establishes the non-overlapping property before returning.

No memory allocation is required. The entire number lives in two registers.

Known limitations:

  • Numerical range is identical to IEEE 754 double (~1.8 × 10^308). The library extends mantissa precision only; exponent range is unchanged.
  • NaN and Infinity propagate through standard double rules.
  • sin and cos use simplified range reduction. For large arguments (|x| ≫ 2π), apply Payne-Hanek reduction externally before calling.
  • pow does not support negative bases; use simd_f128_mul + simd_f128_exp for integer powers of negative numbers.
  • On ARMv7, FMA requires VFPv4 hardware (Cortex-A7, A15, A17, A53+) and the -mfpu=neon-vfpv4 flag.

Examples

Three runnable examples are provided under examples/.

basic_arithmetic.c — entry point for new users. Loads SIMD_F128_PI and SIMD_F128_E from simd_f128_consts.h, performs addition, subtraction, and multiplication, then prints all three results at full 32-digit precision.

precision_demo.c — demonstrates the core motivation for using this library. Adds 1e-17 to 1.0 using both a standard double and a simd_f128, then prints both results side by side. The double result silently loses the small value; the simd_f128 result preserves it in the lo component.

mandelbrot_core.c — a realistic use case. Runs the Mandelbrot iteration z = z^2 + c at a deep-zoom coordinate that exceeds 64-bit precision, with the correct escape condition (|z|^2 > 4). Reports whether the point escapes and prints the final zx/zy values at full precision.

Quick example — circle area at 32-digit precision:

#include <stdio.h>

#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.h>
#include <simd_f128_consts.h>
#include <simd_f128_io.h>

int main() {
    simd_f128 r    = simd_f128_from_double(10.0);
    simd_f128 r2   = simd_f128_mul(r, r);
    simd_f128 area = simd_f128_mul(SIMD_F128_PI, r2);

    // output: 314.15926535897932384626433832795028
    printf("Circle Area: ");
    simd_f128_print(area);

    return 0;
}

Same example using the C++ wrapper:

#define SIMD_F128_IMPLEMENTATION
#include <simd_f128.hpp>
#include <iostream>

int main() {
    f128::float128 r(10.0);
    f128::float128 area = f128::pi * r * r;

    // output: 314.15926535897932384626433832795028
    std::cout << "Circle Area: " << area << "\n";

    return 0;
}

Platform Support & CI Status

Every commit is tested across all backends via GitHub Actions. The table below maps each workflow to the platforms and backends it covers.

Workflow Platform Backend Runner
Linux Linux x86_64 Scalar, AVX2 ubuntu-latest
Linux Linux ARM64, ARMv7, RISC-V64 NEON, Scalar ubuntu-latest + QEMU
macOS Apple Silicon (M1/M2/M3) NEON macos-latest
macOS macOS Intel Scalar, AVX2 macos-13
Windows Windows x64 (MSVC) Scalar windows-latest
WASM WebAssembly (Node.js) WASM-SIMD, Scalar ubuntu-latest + Emscripten
Mobile Android ARM64, Android ARMv7 NEON, Scalar ubuntu-latest + QEMU

Language Bindings

simd-f128 is designed to provide 128-bit precision not just to C/C++, but to higher-level ecosystems.

Python

Using pybind11, the library is exposed as a native CPython extension, bringing 31-digit precision directly into Python scripts.

import simd_f128 as f128

a = f128.from_string("3.14159265358979323846")
b = f128.from_double(2.0)
print((a * b).to_string())

JavaScript / WebAssembly

Compiled via Emscripten, the JS bindings automatically select between WASM-SIMD128 and WASM-Scalar depending on the user's browser support, providing 31-digit precision directly in the browser or Node.js.

Rust

A fully memory-safe Rust wrapper (via cc and bindgen), exposing the C functions safely through idiomatic Rust structs and operator overloads.


Project Structure

.
├── assets/images/        # Logo and documentation media
├── benchmarks/           # Performance benchmarks (Google Benchmark & Native)
├── examples/             # Runnable usage examples
│   ├── basic_arithmetic.c
│   ├── precision_demo.c
│   └── mandelbrot_core.c
├── tests/                # Arithmetic unit tests (C and C++)
├── .github/workflows/    # CI pipelines (linux, macos, windows, wasm, mobile)
├── include/              # Core library and headers
│   ├── simd_f128.h           # Double-Double arithmetic engine
│   ├── simd_f128_consts.h    # High-precision mathematical constants
│   ├── simd_f128_io.h        # String conversion and console output
│   ├── simd_f128_math.h      # Advanced mathematical functions (exp, log, sin, cos, pow)
│   ├── simd_f128_utils.h     # Comparison and utility functions (cmp, abs, min, max)
│   └── simd_f128.hpp         # Modern C++ wrapper with operator overloading
├── js/                   # JavaScript bindings and WebAssembly module
├── python/               # Python bindings (pybind11)
├── rust/                 # Rust bindings (FFI via cc)
├── CMakeLists.txt        # Cross-platform build configuration
└── LICENSE               # MIT License

Used By

Project Description
mandelbrot-c Deep-zoom Mandelbrot renderer in C, using simd-f128 for 128-bit precision coordinates

Development Methodology & AI Assistance

Building a memory-safe, mathematically robust SIMD library requires managing incredibly complex edge cases—from vectorized bit-manipulation to IEEE 754 catastrophic cancellation bounds.

To achieve this level of stability and performance, this project was architected and rigorously verified in collaboration with Advanced Agentic AI. AI was specifically utilized to:

  • Stress-test the Double-Double arithmetic engine against extreme floating-point edge cases (subnormals, infinities, NaN propagation).
  • Assist in planning the memory layout and cross-platform SIMD abstraction (AVX2, NEON, WASM).
  • Automate the generation of robust cross-platform CI/CD pipelines (Linux, macOS, Windows, Mobile, WebAssembly).

However, human agency remains at the core of this project. Every single line of code generated or suggested was manually inspected, audited, and strictly verified. The core architecture, mathematical algorithms, and memory design were meticulously human-planned. This hybrid approach—combining human architectural vision with AI-driven debugging and verification—allowed us to push the boundaries of performance and reliability in a modern C library without compromising accuracy or code ownership.


Author's Note

I'm just a kid building projects as a hobby. Thank you for showing interest in my little library! It really means a lot to me. :)


Contributing

I am still a learner in the field of numerical computing and low-level C programming. If you spot a precision bug, an incorrect algorithm, or an edge case I have missed — especially around FMA behaviour, normalisation stability, or platform-specific SIMD quirks — I would be genuinely grateful for the feedback. Every correction and suggestion is a lesson I would not have found on my own.

If you would like to help:

  1. Open an issue to discuss bugs, inaccuracies, or potential improvements.
  2. To contribute code, please fork the repository and open a pull request with a clear description of what was changed and why.
  3. If you have expertise in Double-Double arithmetic or compiler-level float optimisation, architectural feedback is especially welcome.

Thank you for taking the time to read this far, and for helping make this project more correct.


License

This project is licensed under the MIT License - see the LICENSE file for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

simd_f128-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

simd_f128-1.3.3-cp313-cp313-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ i686

simd_f128-1.3.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

simd_f128-1.3.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ i686

simd_f128-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

simd_f128-1.3.3-cp312-cp312-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ i686

simd_f128-1.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

simd_f128-1.3.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ i686

simd_f128-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

simd_f128-1.3.3-cp311-cp311-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ i686

simd_f128-1.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

simd_f128-1.3.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ i686

simd_f128-1.3.3-cp310-cp310-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

simd_f128-1.3.3-cp310-cp310-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ i686

simd_f128-1.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

simd_f128-1.3.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ i686

simd_f128-1.3.3-cp39-cp39-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ x86-64

simd_f128-1.3.3-cp39-cp39-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded CPython 3.9musllinux: musl 1.2+ i686

simd_f128-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

simd_f128-1.3.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ i686

simd_f128-1.3.3-cp38-cp38-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ x86-64

simd_f128-1.3.3-cp38-cp38-musllinux_1_2_i686.whl (3.2 MB view details)

Uploaded CPython 3.8musllinux: musl 1.2+ i686

simd_f128-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.2 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

simd_f128-1.3.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl (2.1 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ i686

File details

Details for the file simd_f128-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f5e1a1b876e2121f76a403c1fdad8de64f565c97ea54ecead978e7de99514d63
MD5 1286e611711b730fa6303098bc2464a8
BLAKE2b-256 3d62149b2d3cdfabb73c817096a449a8b88c460546c7e057ba50ea95f57a368c

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp313-cp313-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp313-cp313-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 dacf40916570c490dd6febf289f546e3ab0e815016f29e98fffb20feeecc6153
MD5 8c6297cc90c92683baf2c6ffa1784eed
BLAKE2b-256 4f81a537312b24b3e15f8e6ad8c023e12d69e0c94567df648e3c4fbd92b20912

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f1c16d12a6906b7813f2f68f1667c94706f9e369d64fc6031f783e8ba045c428
MD5 86c870b031ae967fdd46b7b0c6133c7e
BLAKE2b-256 6e9c8674b137f603f02c2fbd01b1927890638d42d434768ffa72a559605538ab

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 dd3853a4728cce24769dd8fe594d7252d91ad9dae38807c3e54ef5483ae27967
MD5 3e6f36076eb477362ed146e3fbc5abb2
BLAKE2b-256 89ee4256c8dc8b35f3f3c2e7b00c7e198a630564a740ebc6dff0b7f364b35145

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 014fcd38bf18125896541095bc469cb5463e7bb13b444327bc7e14595c3de046
MD5 92e3d991f182b86c58bc6c645134e98c
BLAKE2b-256 1233cc4a9b60c904b60743d055256bd937a2c210ab3faa8deeb1aba0f1ea34ab

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp312-cp312-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp312-cp312-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 04aa4b9681fc343d1c697199de7e2b2489778aa56603c706cc6cb797f25229a3
MD5 472b9a736af64022adc5ff8b5a31c760
BLAKE2b-256 3c8ac176bdbb449762c345d81ae259daa5b369695b382383b73d98eebcf39869

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 40372759c1a74aaa81f7abb4ae850a9a24986e286e68036e9f4214cea0c7ebd3
MD5 d300b0ab62158a6e84cfe5190044efc9
BLAKE2b-256 f9e2f24ecb4f100c0d3176413ab7379a00618608d72df7a90fda5303ef3b9bb4

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 ba7a3d684da2c58d4bc8232e6b152d1bed98b34712afb3140bfc67e15b413341
MD5 119ef9a0a66e51d417c1baba94e0a3fe
BLAKE2b-256 dc7a9fc25c721da6c49fa7d741deb2ccf52f145e65a33384a5d568e47a46dd8d

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 f6af35cbc692386919e76d6829d1d3537121958069403ebf2128d64631807332
MD5 116ce8e7b7d3fbdd9f22f5bc6ca05946
BLAKE2b-256 0e005569b753e0737f9f27c614e163e0588e260cb87f67778d2312ea96984613

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp311-cp311-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp311-cp311-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 355b5ef2182d081e6cb6cfbe83f935fff65a6e74d97f730d1fb671cd54c70fbb
MD5 e7f02609649cbd2bf8da514cf2a39298
BLAKE2b-256 cce4ffbfd2c8baf5ba98dcec97c98ee9c533a00980c08efb746cb351b7590229

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cedc3f525a1b4586e3da45efe6020e4f5d3f369e28b0644cc01c490805cc04bf
MD5 4b102fac7586a78e5d38d4e9517cfb6f
BLAKE2b-256 7406efdb7085383930e551fa831a043e893fc244c7fdd614b289f6727534aa33

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 dee73dbf59ab073b19b566abe4d8640602f62d5ab9e68aaa2abdc633023557d0
MD5 6cad305698a03e98e591399f3595f566
BLAKE2b-256 fdfb3390398da5b0c40063d89470f84de70a72d793f4d3f81a6c80a9347dddf0

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d061ad7c3f1d9396d0baad2a420543fe2cb8a130fb6e42cf8e876b1004631333
MD5 9163eb6bc7e4b342109faf6a0e3d1ad7
BLAKE2b-256 0e615ee07045afb9f923f1e689744fce5b5795b90e98c8e152ef3f939be0943c

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp310-cp310-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp310-cp310-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 a07116f0d94fcb68df997d5ee7063667a126320d72cc80fd003c7568fdfc80e4
MD5 cc1d60e999ed1c814c9b6c4b3c369044
BLAKE2b-256 13ecfc4d1e6b32608c191ad06908bf0bf974a62a74d05f76c6ac83ea243fd3da

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 6eff180bdfd7311e52273e3468d1ff9018cdb4e63c4414efff6e8742d9553a9a
MD5 39d70d070c212968c26dd8fdf72eb40a
BLAKE2b-256 3381bc3da3c6e4a667eb979b2408b9c2eb2fa62ec031267d1fc84b0d5cc1c9a2

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 8598bdc669179f83fe9a8e8f741aa10bbc7e86a0a1e4374abb0322592b5f2906
MD5 27f9e3e17d24be7b693ea4c96a1a8830
BLAKE2b-256 df887d44d35499e88a82676e4bb452d6d08363cf5412310691303cb8536b0a6e

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp39-cp39-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a49c8e227bcc93bf62a418283ef67464a6ded6938decb547031d400796e0cc11
MD5 e249b0a602f1fdd2b9d68c21a8562aa6
BLAKE2b-256 9eb4c16e4d36c5e92cbcba2fb5acdf3c647dfd0de0d71ad1b5bb92f8b77bcb4d

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp39-cp39-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp39-cp39-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 08ae7b6b100143f6d3c969f536c1dad86a053f09761607d3bc03b5c4ec36668b
MD5 cbc2e5833f7f9033704dd3333a5a100c
BLAKE2b-256 20aa0e4eaac8c5ab6216cc04edf45b14195b5f73895250ff46137b6f59d88f7c

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 bbdfbda3cb36be52b0eb0e5b2ea2b8e6d419d38466d356907c4cc7ab6aee2951
MD5 9640098ee91615c82c7a65c316710718
BLAKE2b-256 84e3842f38662255408af220385a5411896c962b958fcc372dea34262952b505

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 f6e9cf3ad1e5e90bad4819af47ce39d88bdd77fc2a285181490ecb5c445501f6
MD5 13bb50ee7462e2ea1ce5301b02f2c101
BLAKE2b-256 5c3d53bcc52444bb95ff6d80c305b28dff7da169ed794df1180bb90b7cbb73e9

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp38-cp38-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 307d0c08602cca910e9f7f52320830e2888b5b15b04ff31f4ef0188b3b12e7fe
MD5 e0ecfe7f892fba3818a131386a79ad5a
BLAKE2b-256 e33071af39abcea40c6a9bbbeb60b8161a9642c516b43900e2d9d7eea6f7cfac

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp38-cp38-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp38-cp38-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 7dbb59b2eca25bc028e5037959bfd239196e4b6939233e572c045bfb3041e911
MD5 ea4ed0f2a876846d4895df0eb7be3ca1
BLAKE2b-256 131d700da77e73330bb7df75dacd38ce7c336938ad826d2a7458a80c6c73c2dc

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0e8b21887e5547e73b27f832c56f5ba45b4e05c0d3e6ab9965665dc2fa55e800
MD5 d91dcf4295f5087d919ec3fc17d02494
BLAKE2b-256 430e509aab718e56e0adeb6fe2f7b20fd28704d57496944f1e7af0377cc1cb5f

See more details on using hashes here.

File details

Details for the file simd_f128-1.3.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for simd_f128-1.3.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 7530e4a4b9d8cbb4bcf426ccc517445343cd442d2d660019f3510b0ce36ec777
MD5 08792c9f20227651de977b28c5ce8a31
BLAKE2b-256 a2bcc88eeff8e26a4049a75175487873a69ba0224970b36c7364cdf6d9da291f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page