nfx-datatypes 0.1.1
Cross-platform C++ library with high-precision Int128 and Decimal datatypes
Loading...
Searching...
No Matches
Constants.h
Go to the documentation of this file.
1/*
2 * MIT License
3 *
4 * Copyright (c) 2025 nfx
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24
30
31#pragma once
32
33#include <array>
34#include <cstdint>
35#include <string_view>
36
37namespace nfx::datatypes::constants
38{
39 //=====================================================================
40 // Common constants
41 //=====================================================================
42
43 //----------------------------------------------
44 // Bit manipulation
45 //----------------------------------------------
46
48 inline constexpr int BITS_PER_UINT8{ 8 };
49
51 inline constexpr int BITS_PER_UINT16{ 16 };
52
54 inline constexpr int BITS_PER_UINT32{ 32 };
55
57 inline constexpr int BITS_PER_UINT64{ 64 };
58
60 inline constexpr std::uint64_t UINT32_MAX_VALUE{ 0xFFFFFFFFULL };
61
63 inline constexpr std::uint64_t BIT_MASK_ONE{ 1ULL };
64
66 inline constexpr std::uint64_t BIT_MASK_ZERO{ 0ULL };
67
69 inline constexpr int BITS_PER_NIBBLE{ 4 };
70
72 inline constexpr int BITS_PER_PAIR{ 2 };
73
74 //----------------------------------------------
75 // Bit masks for leading zero count (binary search)
76 //----------------------------------------------
77
79 inline constexpr std::uint64_t BIT_MASK_UPPER_32{ 0xFFFFFFFF00000000ULL };
80
82 inline constexpr std::uint64_t BIT_MASK_UPPER_16{ 0xFFFF000000000000ULL };
83
85 inline constexpr std::uint64_t BIT_MASK_UPPER_8{ 0xFF00000000000000ULL };
86
88 inline constexpr std::uint64_t BIT_MASK_UPPER_4{ 0xF000000000000000ULL };
89
91 inline constexpr std::uint64_t BIT_MASK_UPPER_2{ 0xC000000000000000ULL };
92
94 inline constexpr std::uint64_t BIT_MASK_MSB{ 0x8000000000000000ULL };
95
96 //----------------------------------------------
97 // Precision limits
98 //----------------------------------------------
99
101 inline constexpr std::uint8_t DOUBLE_DECIMAL_PRECISION{ 15U };
102
103 //=====================================================================
104 // Int128 data type constants
105 //=====================================================================
106
107 //----------------------------------------------
108 // Numeric base
109 //----------------------------------------------
110
112 inline constexpr int INT128_BASE{ 10 };
113
114 //----------------------------------------------
115 // Bit indexing
116 //----------------------------------------------
117
119 inline constexpr int INT128_MAX_BIT_INDEX{ 127 };
120
121 //----------------------------------------------
122 // Overflow detection
123 //----------------------------------------------
124
126 inline constexpr std::uint64_t INT128_MUL10_OVERFLOW_THRESHOLD{ 0x1999999999999999ULL };
127
129 inline constexpr double INT128_MAX_AS_DOUBLE{ 1.7014118346046923e38 };
130
132 inline constexpr double INT128_MIN_AS_DOUBLE{ -1.7014118346046924e38 };
133
134 //----------------------------------------------
135 // Arithmetic
136 //----------------------------------------------
137
139 inline constexpr std::uint64_t INT128_MAX_POSITIVE_HIGH{ 0x7FFFFFFFFFFFFFFFULL };
140
142 inline constexpr std::uint64_t INT128_MAX_POSITIVE_LOW{ 0xFFFFFFFFFFFFFFFFULL };
143
145 inline constexpr std::uint64_t INT128_MIN_NEGATIVE_HIGH{ 0x8000000000000000ULL };
146
148 inline constexpr std::uint64_t INT128_MIN_NEGATIVE_LOW{ 0x0000000000000000ULL };
149
150 //----------------------------------------------
151 // String conversion
152 //----------------------------------------------
153
155 inline constexpr size_t INT128_MAX_DIGIT_COUNT{ 39UL };
156
158 inline constexpr size_t INT128_MAX_STRING_LENGTH{ 64UL };
159
161 inline constexpr int INT128_ISQRT_MAX_ITERATIONS{ 100 };
162
164 inline constexpr int DECIMAL_SQRT_MAX_ITERATIONS{ 10 };
165
167 inline constexpr std::string_view INT128_MAX_POSITIVE_STRING{ "170141183460469231731687303715884105727" };
168
170 inline constexpr std::string_view INT128_MAX_NEGATIVE_STRING{ "170141183460469231731687303715884105728" };
171
172 //----------------------------------------------
173 // std::numeric_limits constants
174 //----------------------------------------------
175
177 inline constexpr int INT128_DIGITS{ 127 };
178
180 inline constexpr int INT128_DIGITS10{ 38 };
181
183 inline constexpr int INT128_MAX_DIGITS10{ 0 };
184
186 inline constexpr int INT128_RADIX{ 2 };
187
188 //=====================================================================
189 // Decimal data type constants
190 //=====================================================================
191
192 //----------------------------------------------
193 // Numeric base
194 //----------------------------------------------
195
197 inline constexpr std::uint64_t DECIMAL_BASE{ 10ULL };
198
199 //----------------------------------------------
200 // Maximum values
201 //----------------------------------------------
202
204 inline constexpr std::uint64_t DECIMAL_96BIT_MAX_LOW{ 0xFFFFFFFFFFFFFFFFULL };
205
207 inline constexpr std::uint64_t DECIMAL_96BIT_MAX_HIGH{ 0x00000000FFFFFFFFULL };
208
209 //----------------------------------------------
210 // std::numeric_limits constants
211 //----------------------------------------------
212
214 inline constexpr int DECIMAL_MANTISSA_BITS{ 96 };
215
217 inline constexpr int DECIMAL_DIGITS10{ 28 };
218
220 inline constexpr int DECIMAL_RADIX{ 10 };
221
223 inline constexpr double DECIMAL_FRACTIONAL_EPSILON{ 1e-15 };
224
225 //----------------------------------------------
226 // Arithmetic
227 //----------------------------------------------
228
230 inline constexpr std::uint32_t DECIMAL_MAX_MANTISSA_0{ 0xFFFFFFFFU };
231
233 inline constexpr std::uint32_t DECIMAL_MAX_MANTISSA_1{ 0xFFFFFFFFU };
234
236 inline constexpr std::uint32_t DECIMAL_MAX_MANTISSA_2{ 0xFFFFFFFFU };
237
239 inline constexpr std::uint32_t DECIMAL_MIN_MANTISSA_0{ 1U };
240
242 inline constexpr std::uint32_t DECIMAL_MIN_MANTISSA_1{ 0U };
243
245 inline constexpr std::uint32_t DECIMAL_MIN_MANTISSA_2{ 0U };
246
248 inline constexpr std::uint8_t DECIMAL_MAXIMUM_PLACES{ 28U };
249
251 inline constexpr std::uint8_t DECIMAL_DIVISION_EXTRA_PRECISION{ 18U };
252
254 inline constexpr std::uint8_t DECIMAL_ROUNDING_THRESHOLD{ 5U };
255
257 inline constexpr int DECIMAL_MANTISSA_ARRAY_SIZE{ 3 };
258
260 inline constexpr std::string_view DECIMAL_SQRT_EPSILON{ "0.000001" };
261
263 inline constexpr std::uint32_t DECIMAL_SCALE_MASK{ 0x00FF0000U };
264
266 inline constexpr std::uint32_t DECIMAL_SIGN_MASK{ 0x80000000U };
267
269 inline constexpr std::uint8_t DECIMAL_SCALE_SHIFT{ 16U };
270
271 //----------------------------------------------
272 // String conversion
273 //----------------------------------------------
274
276 inline constexpr size_t DECIMAL_MAX_STRING_LENGTH{ 64UL };
277
279 inline constexpr size_t DECIMAL_STRING_BUFFER_SIZE{ 64UL };
280
281 //----------------------------------------------
282 // Performance optimization
283 //----------------------------------------------
284
286 inline constexpr std::uint8_t DECIMAL_POWER_TABLE_SIZE{ 20U };
287
289 inline constexpr std::uint8_t DECIMAL_EXTENDED_POWER_MIN{ 20U };
290
292 inline constexpr std::uint8_t DECIMAL_EXTENDED_POWER_MAX{ 28U };
293
295 inline constexpr std::array<std::uint64_t, DECIMAL_POWER_TABLE_SIZE> DECIMAL_POWERS_OF_10{ {
296 1ULL, // 10^0
297 10ULL, // 10^1
298 100ULL, // 10^2
299 1000ULL, // 10^3
300 10000ULL, // 10^4
301 100000ULL, // 10^5
302 1000000ULL, // 10^6
303 10000000ULL, // 10^7
304 100000000ULL, // 10^8
305 1000000000ULL, // 10^9
306 10000000000ULL, // 10^10
307 100000000000ULL, // 10^11
308 1000000000000ULL, // 10^12
309 10000000000000ULL, // 10^13
310 100000000000000ULL, // 10^14
311 1000000000000000ULL, // 10^15
312 10000000000000000ULL, // 10^16
313 100000000000000000ULL, // 10^17
314 1000000000000000000ULL, // 10^18
315 10000000000000000000ULL, // 10^19 (max uint64_t support)
316 } };
317
323 inline constexpr std::array<std::pair<std::uint64_t, std::uint64_t>, 9> DECIMAL_EXTENDED_POWERS_OF_10{ {
324 { 0x6BC75E2D63100000ULL, 0x0000000000000005ULL }, // 10^20
325 { 0x35C9ADC5DEA00000ULL, 0x0000000000000036ULL }, // 10^21
326 { 0x19E0C9BAB2400000ULL, 0x000000000000021EULL }, // 10^22
327 { 0x02C7E14AF6800000ULL, 0x000000000000152DULL }, // 10^23
328 { 0x1BCECCEDA1000000ULL, 0x000000000000D3C2ULL }, // 10^24
329 { 0x161401484A000000ULL, 0x0000000000084595ULL }, // 10^25
330 { 0xDCC80CD2E4000000ULL, 0x000000000052B7D2ULL }, // 10^26
331 { 0x9FD0803CE8000000ULL, 0x00000000033B2E3CULL }, // 10^27
332 { 0x3E25026110000000ULL, 0x00000000204FCE5EULL } // 10^28
333 } };
334} // namespace nfx::datatypes::constants
constexpr int DECIMAL_RADIX
Numeric base for Decimal (base-10 decimal system).
Definition Constants.h:220
constexpr std::array< std::pair< std::uint64_t, std::uint64_t >, 9 > DECIMAL_EXTENDED_POWERS_OF_10
Power-of-10 calculation constants for 128-bit arithmetic.
Definition Constants.h:323
constexpr std::uint32_t DECIMAL_MAX_MANTISSA_0
Lower 32 bits of maximum Decimal mantissa (2^96 - 1).
Definition Constants.h:230
constexpr int DECIMAL_MANTISSA_BITS
Number of bits in Decimal mantissa (96-bit mantissa).
Definition Constants.h:214
constexpr int BITS_PER_UINT8
Bit shift amount for 8-bit operations.
Definition Constants.h:48
constexpr std::uint64_t INT128_MIN_NEGATIVE_HIGH
High 64 bits of minimum negative 128-bit signed integer (-2^127).
Definition Constants.h:145
constexpr int INT128_DIGITS
Number of value bits in Int128 (excluding sign bit).
Definition Constants.h:177
constexpr std::uint64_t DECIMAL_96BIT_MAX_LOW
Maximum 96-bit mantissa value (2^96 - 1) as low 64 bits.
Definition Constants.h:204
constexpr std::array< std::uint64_t, DECIMAL_POWER_TABLE_SIZE > DECIMAL_POWERS_OF_10
Powers of 10 lookup table for efficient scaling operations (64-bit range: 10^0 to 10^19).
Definition Constants.h:295
constexpr std::uint64_t BIT_MASK_UPPER_2
Mask for testing upper 2 bits of upper 4 bits.
Definition Constants.h:91
constexpr std::uint8_t DECIMAL_DIVISION_EXTRA_PRECISION
Extra precision digits added during division to maintain accuracy.
Definition Constants.h:251
constexpr int DECIMAL_MANTISSA_ARRAY_SIZE
Size of mantissa array in Decimal (3 x 32-bit words = 96 bits).
Definition Constants.h:257
constexpr int INT128_DIGITS10
Number of decimal digits representable in Int128 (floor(127 * log10(2))).
Definition Constants.h:180
constexpr std::uint64_t UINT32_MAX_VALUE
Maximum value for 32-bit unsigned integer (2^32 - 1).
Definition Constants.h:60
constexpr int INT128_RADIX
Numeric base for Int128 (binary base-2 system).
Definition Constants.h:186
constexpr double DECIMAL_FRACTIONAL_EPSILON
Negligibility threshold for fractional parts in double conversion (10^-15).
Definition Constants.h:223
constexpr std::uint64_t BIT_MASK_UPPER_32
Mask for testing upper 32 bits of 64-bit value.
Definition Constants.h:79
constexpr std::uint8_t DECIMAL_EXTENDED_POWER_MAX
Maximum power for extended 128-bit power-of-10 table (10^28).
Definition Constants.h:292
constexpr std::uint32_t DECIMAL_MAX_MANTISSA_1
Middle 32 bits of maximum Decimal mantissa (2^96 - 1).
Definition Constants.h:233
constexpr std::uint8_t DECIMAL_EXTENDED_POWER_MIN
Minimum power for extended 128-bit power-of-10 table (10^20 and above).
Definition Constants.h:289
constexpr int BITS_PER_UINT32
Bit shift amount for 32-bit operations (used for extracting/combining uint32_t from uint64_t).
Definition Constants.h:54
constexpr std::uint8_t DECIMAL_ROUNDING_THRESHOLD
Rounding threshold value (round up if digit >= this value).
Definition Constants.h:254
constexpr double INT128_MAX_AS_DOUBLE
Double approximation of maximum positive Int128 value (2^127 - 1) for overflow checks.
Definition Constants.h:129
constexpr std::uint64_t INT128_MIN_NEGATIVE_LOW
Low 64 bits of minimum negative 128-bit signed integer (-2^127).
Definition Constants.h:148
constexpr std::uint64_t BIT_MASK_UPPER_8
Mask for testing upper 8 bits of upper 16 bits.
Definition Constants.h:85
constexpr std::uint8_t DECIMAL_SCALE_SHIFT
Bit position for scale field in flags.
Definition Constants.h:269
constexpr std::uint8_t DECIMAL_MAXIMUM_PLACES
Maximum number of decimal places supported.
Definition Constants.h:248
constexpr std::uint64_t DECIMAL_BASE
Base for decimal digit conversion.
Definition Constants.h:197
constexpr std::uint64_t BIT_MASK_ONE
Bit mask value 1 as unsigned 64-bit (used for bit operations).
Definition Constants.h:63
constexpr std::string_view INT128_MAX_POSITIVE_STRING
Maximum positive value as decimal string (2^127 - 1).
Definition Constants.h:167
constexpr std::uint64_t DECIMAL_96BIT_MAX_HIGH
Maximum 96-bit mantissa value (2^96 - 1) as high 32 bits.
Definition Constants.h:207
constexpr size_t INT128_MAX_STRING_LENGTH
Maximum expected length for Int128 string representation.
Definition Constants.h:158
constexpr double INT128_MIN_AS_DOUBLE
Double approximation of minimum negative Int128 value (-2^127) for overflow checks.
Definition Constants.h:132
constexpr int INT128_MAX_DIGITS10
Maximum decimal digits for Int128 (not applicable for integers).
Definition Constants.h:183
constexpr std::string_view INT128_MAX_NEGATIVE_STRING
Maximum negative value as decimal string (absolute value of -2^127).
Definition Constants.h:170
constexpr int BITS_PER_UINT64
Bit shift amount for 64-bit operations (used for extracting/combining uint64_t from uint128_t).
Definition Constants.h:57
constexpr std::uint64_t INT128_MAX_POSITIVE_LOW
Low 64 bits of maximum positive 128-bit signed integer (2^127 - 1).
Definition Constants.h:142
constexpr std::uint32_t DECIMAL_SCALE_MASK
Bit mask for extracting scale from flags field (bits 16-23).
Definition Constants.h:263
constexpr size_t DECIMAL_STRING_BUFFER_SIZE
Reserved buffer size for string conversion to avoid reallocation.
Definition Constants.h:279
constexpr std::uint64_t BIT_MASK_MSB
Mask for testing most significant bit.
Definition Constants.h:94
constexpr int INT128_BASE
Base for decimal digit conversion.
Definition Constants.h:112
constexpr std::uint64_t BIT_MASK_ZERO
Bit mask value 0 as unsigned 64-bit (used for bit operations).
Definition Constants.h:66
constexpr int INT128_MAX_BIT_INDEX
Maximum bit index for 128-bit integers (0-127).
Definition Constants.h:119
constexpr std::uint64_t INT128_MUL10_OVERFLOW_THRESHOLD
Maximum high 64-bit value before multiplying by 10 causes overflow (0xFFFFFFFFFFFFFFFF / 10).
Definition Constants.h:126
constexpr std::uint64_t BIT_MASK_UPPER_4
Mask for testing upper 4 bits of upper 8 bits.
Definition Constants.h:88
constexpr std::uint32_t DECIMAL_MAX_MANTISSA_2
Upper 32 bits of maximum Decimal mantissa (2^96 - 1).
Definition Constants.h:236
constexpr int DECIMAL_DIGITS10
Number of decimal digits representable in Decimal (28 digits).
Definition Constants.h:217
constexpr int DECIMAL_SQRT_MAX_ITERATIONS
Maximum iterations for Decimal::sqrt() Newton-Raphson refinement.
Definition Constants.h:164
constexpr std::string_view DECIMAL_SQRT_EPSILON
Convergence epsilon for Newton-Raphson sqrt algorithm (10^-6 for reliable convergence).
Definition Constants.h:260
constexpr std::uint32_t DECIMAL_SIGN_MASK
Bit mask for sign detection (bit 31).
Definition Constants.h:266
constexpr int BITS_PER_NIBBLE
Bit shift amount for 4-bit operations.
Definition Constants.h:69
constexpr size_t INT128_MAX_DIGIT_COUNT
Maximum number of decimal digits in a 128-bit signed integer (2^127 - 1 has 39 digits).
Definition Constants.h:155
constexpr int INT128_ISQRT_MAX_ITERATIONS
Maximum iterations for Int128::isqrt() Heron's method.
Definition Constants.h:161
constexpr std::uint32_t DECIMAL_MIN_MANTISSA_2
Upper 32 bits of minimum positive Decimal mantissa (1 × 10^-28).
Definition Constants.h:245
constexpr std::uint64_t INT128_MAX_POSITIVE_HIGH
High 64 bits of maximum positive 128-bit signed integer (2^127 - 1).
Definition Constants.h:139
constexpr std::uint8_t DECIMAL_POWER_TABLE_SIZE
Power of 10 lookup table size for fast scaling operations (64-bit range).
Definition Constants.h:286
constexpr std::uint64_t BIT_MASK_UPPER_16
Mask for testing upper 16 bits of upper 32 bits.
Definition Constants.h:82
constexpr int BITS_PER_UINT16
Bit shift amount for 16-bit operations.
Definition Constants.h:51
constexpr size_t DECIMAL_MAX_STRING_LENGTH
Maximum expected length for decimal string representation.
Definition Constants.h:276
constexpr int BITS_PER_PAIR
Bit shift amount for 2-bit operations.
Definition Constants.h:72
constexpr std::uint32_t DECIMAL_MIN_MANTISSA_0
Lower 32 bits of minimum positive Decimal mantissa (1 × 10^-28).
Definition Constants.h:239
constexpr std::uint8_t DOUBLE_DECIMAL_PRECISION
Maximum decimal precision that IEEE 754 double can accurately represent.
Definition Constants.h:101
constexpr std::uint32_t DECIMAL_MIN_MANTISSA_1
Middle 32 bits of minimum positive Decimal mantissa (1 × 10^-28).
Definition Constants.h:242