From 7533da193a6306e13bc543fa0b5e94e55cf8fe77 Mon Sep 17 00:00:00 2001 From: "David K. Zhang" Date: Mon, 30 Sep 2024 16:50:37 -0700 Subject: [PATCH 1/2] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d845688..ffa0c02 100644 --- a/README.md +++ b/README.md @@ -81,14 +81,14 @@ We use [two linear algebra tasks][11] to compare the performance of extended-pre * QR factorization of a random 400×400 matrix * Pseudoinverse of a random 400×250 matrix using [GenericLinearAlgebra.jl][12] -The timings reported below are averages of 10 single-threaded runs performed on an Intel Core i9-11900KF processor using Julia 1.10.0. - -| | MultiFloats
`Float64x2` | MPFR
[`BigFloat`][2] | Arb
[`ArbFloat`][13] | Intel
[`Dec128`][14] | Julia
[`Double64`][4] | libquadmath
[`Float128`][3] | -|----------------|----------------------------|--------------------------|--------------------------|--------------------------|--------------------------|------------------------| -| 400×400 `qr` | 0.276 sec | 7.311 sec
27× slower | 13.259 sec
48× slower | 11.963 sec
43× slower | 0.384 sec
1.4× slower | 1.399 sec
5× slower | -| correct digits | 26.2 | 25.9 | 25.9 | 27.7 | 26.1 | 27.9 | -| 400×250 `pinv` | 1.236 sec | 49.581 sec
40× slower | ❌ Error | ❌ Error | 1.899 sec
1.5× slower | 7.551 sec
6× slower | -| correct digits | 26.0 | 25.8 | ❌ Error | ❌ Error | 25.9 | 27.9 | +The timings reported below are minima of 3 single-threaded runs performed on an Intel Core i9-11900KF processor using Julia 1.10.5. + +| | MultiFloats
`Float64x2` | MPFR
[`BigFloat`][2] | Arb
[`ArbFloat`][13] | Intel
[`Dec128`][14] | Julia
[`Double64`][4] | GNU
[`Float128`][3] | +|----------------|----------------------------|-------------------------|-------------------------|-------------------------|--------------------------|------------------------| +| 400×400 `qr` | 0.213 sec | 3.74 sec
18× slower | ❌ Error | ❌ Error | 0.408 sec
1.9× slower | 1.19 sec
5.6× slower | +| correct digits | 26.3 | 26.1 | ❌ Error | ❌ Error | 26.3 | 27.9 | +| 400×250 `pinv` | 0.872 sec | 29.3 sec
34× slower | ❌ Error | ❌ Error | 1.95 sec
2.2× slower | 6.37 sec
7.3× slower | +| correct digits | 26.0 | 25.9 | ❌ Error | ❌ Error | 26.0 | 27.9 | | selectable precision | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | | avoids allocation | ✔️ | ❌ | ❌ | ✔️ | ✔️ | ✔️ | | arithmetic
`+`, `-`, `*`, `/`, `sqrt` | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | From f9dfddc34a6a157fdcef3e882d80d67d3eb68ba0 Mon Sep 17 00:00:00 2001 From: "David K. Zhang" Date: Mon, 30 Sep 2024 16:52:17 -0700 Subject: [PATCH 2/2] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ffa0c02..c42a805 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,9 @@ **Copyright © 2019-2024 by David K. Zhang. Released under the [MIT License][1].** -**MultiFloats.jl** is a Julia package for extended-precision arithmetic using 100–400 bits (30–120 decimal digits). In this range, it is the fastest library that I am aware of. At 100-bit precision, **MultiFloats.jl** is roughly **40× faster than [`BigFloat`][2]**, **5× faster than [Quadmath.jl][3]**, and **1.5× faster than [DoubleFloats.jl][4]**. +**MultiFloats.jl** is a Julia package for extended-precision arithmetic using 100–400 bits (30–120 decimal digits). In this range, it is the fastest library that I am aware of. At 100-bit precision, **MultiFloats.jl** is roughly **30× faster than [`BigFloat`][2]**, **6× faster than [Quadmath.jl][3]**, and **2× faster than [DoubleFloats.jl][4]**. -**MultiFloats.jl** is fast because it uses native `Float64` operations on static data structures that do not dynamically allocate memory. In contrast, [`BigFloat`][2] allocates memory for every single arithmetic operation, requiring frequent pauses for garbage collection. In addition, **MultiFloats.jl** uses branch-free algorithms that can be vectorized for even faster execution on [SIMD][5] processors. +**MultiFloats.jl** is fast because it uses native `Float64` operations on static data structures that do not dynamically allocate memory. In contrast, [`BigFloat`][2] allocates memory for every single arithmetic operation, requiring frequent pauses for garbage collection. In addition, **MultiFloats.jl** uses branch-free vectorized algorithms for even faster execution on [SIMD][5] processors. **MultiFloats.jl** provides pure-Julia implementations of the basic arithmetic operations (`+`, `-`, `*`, `/`, `sqrt`), comparison operators (`==`, `!=`, `<`, `>`, `<=`, `>=`), and floating-point introspection methods (`isfinite`, `eps`, `minfloat`, etc.). Transcendental functions (`exp`, `log`, `sin`, `cos`, etc.) are supported through [MPFR][6].