Skip to content

Commit 550a064

Browse files
committed
Merge branch 'staging' into release
2 parents 798e116 + 35c7e2a commit 550a064

21 files changed

Lines changed: 3486 additions & 77 deletions

.github/workflows/ci.yml

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,4 +308,57 @@ jobs:
308308
with:
309309
github_token: ${{ secrets.GITHUB_TOKEN }}
310310
publish_dir: ./${{ steps.badge_dir.outputs.dir }}
311-
destination_dir: ${{ steps.badge_dir.outputs.dir }}
311+
destination_dir: ${{ steps.badge_dir.outputs.dir }}
312+
313+
coverage:
314+
name: coverage / ubuntu-24.04 / gcc-14
315+
runs-on: ubuntu-24.04
316+
needs: build
317+
318+
env:
319+
CC: gcc-14
320+
CXX: g++-14
321+
GCOV: gcov-14
322+
323+
steps:
324+
- name: Checkout
325+
uses: actions/checkout@v5
326+
with:
327+
fetch-depth: 0
328+
329+
- name: Install dependencies
330+
shell: bash
331+
run: |
332+
sudo apt-get update
333+
sudo apt-get install -y cmake ninja-build gcc-14 g++-14 lcov
334+
335+
- name: Configure
336+
shell: bash
337+
run: |
338+
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_FLAGS="--coverage -O0 -g" -DCMAKE_CXX_FLAGS="--coverage -O0 -g"
339+
340+
- name: Build
341+
shell: bash
342+
run: |
343+
cmake --build build --parallel
344+
345+
- name: Test
346+
shell: bash
347+
run: |
348+
ctest --test-dir build --output-on-failure --parallel
349+
350+
- name: Capture coverage
351+
shell: bash
352+
run: |
353+
lcov --gcov-tool /usr/bin/gcov-14 --rc geninfo_unexecuted_blocks=1 --directory build --capture --output-file coverage.full.info
354+
lcov --gcov-tool /usr/bin/gcov-14 --remove coverage.full.info '/usr/*' '*/test/*' '*/thirdparty/*' --ignore-errors unused --output-file coverage.info
355+
rm coverage.full.info
356+
lcov --gcov-tool /usr/bin/gcov-14 --list coverage.info
357+
358+
- name: Upload coverage reports to Codecov
359+
uses: codecov/codecov-action@v5
360+
with:
361+
files: coverage.info
362+
fail_ci_if_error: true
363+
env:
364+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,15 @@ if(libdecimal_BUILD_TESTS)
8585

8686
add_test_case(example)
8787
add_test_case(decimal)
88+
add_test_case(decimal-bid-spec)
89+
add_test_case(decimal-display)
90+
add_test_case(float-conversion)
91+
add_test_case(ops-add-sub)
92+
add_test_case(ops-mul-div)
93+
add_test_case(ops-transcendental)
94+
add_test_case(import-export)
95+
add_test_case(constants)
96+
add_test_case(algebraic-identities)
8897
endif()
8998
# ------------------------------------------------------------------------------
9099
# MkDocs Documentation Targets

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
[![CI](https://github.com/vargalabs/libdecimal/actions/workflows/ci.yml/badge.svg)](https://github.com/vargalabs/libdecimal/actions/workflows/ci.yml)
3-
[![codecov](https://codecov.io/gh/vargalabs/libdecimal/branch/main/graph/badge.svg)](https://codecov.io/gh/vargalabs/libdecimal)
3+
[![codecov](https://codecov.io/gh/vargalabs/libdecimal/graph/badge.svg?token=F6YCNG3HEY)](https://codecov.io/gh/vargalabs/libdecimal)
44
[![MIT License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
55
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.19323619.svg)](https://doi.org/10.5281/zenodo.19323619)
66
[![GitHub release](https://img.shields.io/github/v/release/vargalabs/libdecimal.svg)](https://github.com/vargalabs/libdecimal/releases)
@@ -83,6 +83,12 @@ add_executable(app main.cpp)
8383
target_link_libraries(app PRIVATE libdecimal::libdecimal)
8484
```
8585

86+
## Attribution
87+
**LIBDECIMAL** builds on Intel’s LIBBID implementation of IEEE 754 decimal arithmetic. **The heavy lifting** — the arithmetic itself — comes from the work **of Marius Cornea, John Harrison, Cristina Anderson, and Evgeny Gvozdev**. **The** underlying **model** traces back **to Mike Cowlishaw** and the IEEE 754 standard.
88+
89+
**The template/macro contraption** that makes it usable in modern C++, **along with the full decomposition of BID into sign, significand, and exponent** — that **is on me**.
90+
91+
8692
[200]: https://vargalabs.github.io/libdecimal/badges/ubuntu-22.04-gcc-13.svg
8793
[201]: https://vargalabs.github.io/libdecimal/badges/ubuntu-22.04-gcc-14.svg
8894
[202]: https://vargalabs.github.io/libdecimal/badges/ubuntu-22.04-gcc-15.svg

docs/constants.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
2+
All constants are compile-time initialized via string → `decimal_t<T>` conversion. High-precision decimal constants defined in `math::constants<T>`, where `T` controls precision.
3+
4+
5+
=== "Example"
6+
```cpp
7+
using decimal = math::constants<uint64_t>;
8+
9+
auto x = decimal::pi;
10+
auto y = decimal::sqrt2;
11+
auto z = decimal::deg_to_rad * angle;
12+
// composability
13+
auto circumference = decimal::two_pi * r;
14+
auto angle_rad = deg * decimal::deg_to_rad;
15+
auto exp_growth = decimal::e.pow(t);
16+
```
17+
=== ":material-decimal-decrease:{.icon} decimal32"
18+
19+
```cpp
20+
template <> struct constants<uint32_t>{ // 7 digit precision
21+
using decimal_t = typename math::decimal_t<uint32_t>;
22+
inline static const decimal_t nan = static_cast<decimal_t>("nan");
23+
inline static const decimal_t inf = static_cast<decimal_t>("inf");
24+
inline static const decimal_t zero = static_cast<decimal_t>("0");
25+
inline static const decimal_t one = static_cast<decimal_t>("1");
26+
27+
inline static const decimal_t pi = static_cast<decimal_t>("3.141593");
28+
inline static const decimal_t tau = static_cast<decimal_t>("6.283185");
29+
inline static const decimal_t e = static_cast<decimal_t>("2.718282");
30+
inline static const decimal_t phi = static_cast<decimal_t>("1.618034");
31+
inline static const decimal_t golden_ratio = phi;
32+
inline static const decimal_t silver_ratio = static_cast<decimal_t>("2.414214");
33+
inline static const decimal_t sqrt2 = static_cast<decimal_t>("1.414214");
34+
inline static const decimal_t sqrt3 = static_cast<decimal_t>("1.732051");
35+
inline static const decimal_t sqrt5 = static_cast<decimal_t>("2.236068");
36+
inline static const decimal_t ln2 = static_cast<decimal_t>("0.693147");
37+
inline static const decimal_t ln10 = static_cast<decimal_t>("2.302586");
38+
inline static const decimal_t log2e = static_cast<decimal_t>("1.442696");
39+
inline static const decimal_t log10e = static_cast<decimal_t>("0.4342945");
40+
inline static const decimal_t deg_to_rad = static_cast<decimal_t>("0.01745329");
41+
inline static const decimal_t rad_to_deg = static_cast<decimal_t>("57.29578");
42+
inline static const decimal_t inv_pi = static_cast<decimal_t>("0.3183099");
43+
inline static const decimal_t two_pi = static_cast<decimal_t>("6.283185");
44+
inline static const decimal_t half_pi = static_cast<decimal_t>("1.570796");
45+
inline static const decimal_t quarter_pi = static_cast<decimal_t>("0.7853982");
46+
inline static const decimal_t cube_root_2 = static_cast<decimal_t>("1.259921");
47+
inline static const decimal_t cube_root_3 = static_cast<decimal_t>("1.4422496");
48+
};
49+
```
50+
=== ":material-decimal:{.icon} decimal64"
51+
52+
```cpp
53+
template <> struct constants<uint64_t> { // 16 digit precision
54+
using decimal_t = typename math::decimal_t<uint64_t>;
55+
inline static const decimal_t nan = static_cast<decimal_t>("nan");
56+
inline static const decimal_t inf = static_cast<decimal_t>("inf");
57+
inline static const decimal_t zero = static_cast<decimal_t>("0");
58+
inline static const decimal_t one = static_cast<decimal_t>("1");
59+
60+
inline static const decimal_t pi = static_cast<decimal_t>("3.141592653589793");
61+
inline static const decimal_t tau = static_cast<decimal_t>("6.283185307179586");
62+
inline static const decimal_t e = static_cast<decimal_t>("2.718281828459045");
63+
inline static const decimal_t phi = static_cast<decimal_t>("1.618033988749895");
64+
inline static const decimal_t silver_ratio = static_cast<decimal_t>("2.414213562373095");
65+
inline static const decimal_t sqrt2 = static_cast<decimal_t>("1.414213562373095");
66+
inline static const decimal_t sqrt3 = static_cast<decimal_t>("1.732050807568877");
67+
inline static const decimal_t sqrt5 = static_cast<decimal_t>("2.236067977499790");
68+
inline static const decimal_t ln2 = static_cast<decimal_t>("0.6931471805599453");
69+
inline static const decimal_t ln10 = static_cast<decimal_t>("2.302585092994046");
70+
inline static const decimal_t log2e = static_cast<decimal_t>("1.442695040888963");
71+
inline static const decimal_t log10e = static_cast<decimal_t>("0.4342944819032518");
72+
inline static const decimal_t deg_to_rad = static_cast<decimal_t>("0.01745329251994330");
73+
inline static const decimal_t rad_to_deg = static_cast<decimal_t>("57.29577951308232");
74+
inline static const decimal_t inv_pi = static_cast<decimal_t>("0.3183098861837907");
75+
inline static const decimal_t two_pi = static_cast<decimal_t>("6.283185307179586");
76+
inline static const decimal_t half_pi = static_cast<decimal_t>("1.570796326794897");
77+
inline static const decimal_t quarter_pi = static_cast<decimal_t>("0.785398163397448");
78+
inline static const decimal_t cube_root_2 = static_cast<decimal_t>("1.259921049894873");
79+
inline static const decimal_t cube_root_3 = static_cast<decimal_t>("1.442249570307408");
80+
};
81+
```
82+
=== ":material-decimal-increase:{.icon} decimal128"
83+
84+
```cpp
85+
template <> struct constants<BID_UINT128> { // 34 digit precision
86+
using decimal_t = typename math::decimal_t<BID_UINT128>;
87+
inline static const decimal_t nan = static_cast<decimal_t>("nan");
88+
inline static const decimal_t inf = static_cast<decimal_t>("inf");
89+
inline static const decimal_t zero = static_cast<decimal_t>("0");
90+
inline static const decimal_t one = static_cast<decimal_t>("1");
91+
92+
inline static const decimal_t pi = static_cast<decimal_t>("3.1415926535897932384626433832795029");
93+
inline static const decimal_t tau = static_cast<decimal_t>("6.2831853071795864769252867665590058");
94+
inline static const decimal_t e = static_cast<decimal_t>("2.7182818284590452353602874713526625");
95+
inline static const decimal_t phi = static_cast<decimal_t>("1.6180339887498948482045868343656381");
96+
inline static const decimal_t golden_ratio = phi;
97+
inline static const decimal_t silver_ratio = static_cast<decimal_t>("2.4142135623730950488016887242096981");
98+
inline static const decimal_t sqrt2 = static_cast<decimal_t>("1.4142135623730950488016887242096981");
99+
inline static const decimal_t sqrt3 = static_cast<decimal_t>("1.7320508075688772935274463415058724");
100+
inline static const decimal_t sqrt5 = static_cast<decimal_t>("2.2360679774997896964091736687312762");
101+
inline static const decimal_t ln2 = static_cast<decimal_t>("0.6931471805599453094172321214581766");
102+
inline static const decimal_t ln10 = static_cast<decimal_t>("2.3025850929940456840179914546843642");
103+
inline static const decimal_t log2e = static_cast<decimal_t>("1.4426950408889634073599246810018921");
104+
inline static const decimal_t log10e = static_cast<decimal_t>("0.4342944819032518276511289189166051");
105+
inline static const decimal_t deg_to_rad = static_cast<decimal_t>("0.0174532925199432957692369076848861");
106+
inline static const decimal_t rad_to_deg = static_cast<decimal_t>("57.2957795130823208767981548141051703");
107+
inline static const decimal_t inv_pi = static_cast<decimal_t>("0.3183098861837906715377675267450287");
108+
inline static const decimal_t two_pi = tau;
109+
inline static const decimal_t half_pi = static_cast<decimal_t>("1.5707963267948966192313216916397514");
110+
inline static const decimal_t quarter_pi = static_cast<decimal_t>("0.7853981633974483096156608458198757");
111+
inline static const decimal_t cube_root_2 = static_cast<decimal_t>("1.2599210498948731647672106072782284");
112+
inline static const decimal_t cube_root_3 = static_cast<decimal_t>("1.4422495703074083823216383107801096");
113+
};
114+
```
115+
116+
<div class="clear-both"></div>

0 commit comments

Comments
 (0)