A high-performance C++20 library providing cross-platform 128-bit integer and high-precision decimal arithmetic
nfx-datatypes is a modern C++20 library providing numeric types for applications requiring precise integer and decimal arithmetic. It features cross-platform 128-bit signed integers and high-precision decimal arithmetic.
- Int128: Cross-platform 128-bit signed integer arithmetic
- Native
__int128support on GCC/Clang for maximum performance - Hand-optimized implementation for MSVC using 64-bit operations
- Full range: -2^127 to 2^127-1
- Complete arithmetic operator support (+, -, *, /, %)
- Native
- Decimal: High-precision decimal arithmetic
- 96-bit mantissa with configurable scale (0-28)
- Up to 28-29 significant digits
- Exact decimal representation (no binary floating-point errors)
- Financial and scientific computation support
- Sub-nanosecond basic operations (construction, comparisons)
- Highly optimized arithmetic (addition, multiplication, division)
- Fast string parsing and formatting
- Zero-cost abstractions with constexpr support
- Arithmetic:
+,-,*,/,%, unary- - Comparison:
==,!=,<,<=,>,>= - Type conversions: int32, int64, uint64, float, double
- Cross-type operations: Int128 ↔ Decimal interoperability
- String parsing:
parse(),tryParse() - String formatting:
toString()
- Linux, Windows
- GCC 14+, Clang 18+, MSVC 2022+
- Thread-safe operations
- Consistent behavior and precision across platforms
- Comprehensive test coverage on all platforms
- C++20 compatible compiler:
- GCC 14+ (14.2.0 tested)
- Clang 18+ (19.1.7 tested)
- MSVC 2022+ (19.44+ tested)
- CMake 3.20 or higher
# Build optimization
option(NFX_DATATYPES_USE_CACHE "Enable compiler cache" ON )
# Build options
option(NFX_DATATYPES_BUILD_STATIC "Build static library" ON )
option(NFX_DATATYPES_BUILD_SHARED "Build shared library" OFF )
# Development options
option(NFX_DATATYPES_BUILD_TESTS "Build tests" OFF )
option(NFX_DATATYPES_BUILD_SAMPLES "Build samples" OFF )
option(NFX_DATATYPES_BUILD_BENCHMARKS "Build benchmarks" OFF )
option(NFX_DATATYPES_BUILD_DOCUMENTATION "Build Doxygen documentation" OFF )
# Installation and packaging
option(NFX_DATATYPES_INSTALL_PROJECT "Install project" OFF )
option(NFX_DATATYPES_PACKAGE_SOURCE "Enable source package generation" OFF )
option(NFX_DATATYPES_PACKAGE_ARCHIVE "Enable TGZ/ZIP package generation" OFF )
option(NFX_DATATYPES_PACKAGE_DEB "Enable DEB package generation" OFF )
option(NFX_DATATYPES_PACKAGE_RPM "Enable RPM package generation" OFF )
option(NFX_DATATYPES_PACKAGE_WIX "Enable WiX MSI installer" OFF )include(FetchContent)
FetchContent_Declare(
nfx-datatypes
GIT_REPOSITORY https://github.com/ronan-fdev/nfx-datatypes.git
GIT_TAG main # or use specific version tag like "1.0.2"
)
FetchContent_MakeAvailable(nfx-datatypes)
# Link with static library (recommended)
target_link_libraries(your_target PRIVATE nfx-datatypes::static)
# Or link with shared library
# target_link_libraries(your_target PRIVATE nfx-datatypes::nfx-datatypes)# Add as submodule
git submodule add https://github.com/ronan-fdev/nfx-datatypes.git third-party/nfx-datatypes# In your CMakeLists.txt
add_subdirectory(third-party/nfx-datatypes)
target_link_libraries(your_target PRIVATE nfx-datatypes::static)find_package(nfx-datatypes REQUIRED)
target_link_libraries(your_target PRIVATE nfx-datatypes::static)# Clone the repository
git clone https://github.com/ronan-fdev/nfx-datatypes.git
cd nfx-datatypes
# Create build directory
mkdir build && cd build
# Configure with CMake
cmake .. -DCMAKE_BUILD_TYPE=Release
# Build the library
cmake --build . --config Release --parallel
# Run tests (optional)
ctest -C Release --output-on-failure
# Run benchmarks (optional)
./build/bin/benchmarks/BM_Int128
./build/bin/benchmarks/BM_Decimalnfx-datatypes includes comprehensive API documentation generated with Doxygen.
The complete API documentation is available online at: https://ronan-fdev.github.io/nfx-datatypes
# Configure with documentation enabled
cmake .. -DCMAKE_BUILD_TYPE=Release -DNFX_DATATYPES_BUILD_DOCUMENTATION=ON
# Build the documentation
cmake --build . --target documentation- Doxygen - Documentation generation tool
- Graphviz Dot (optional) - For generating class diagrams
After building, open ./build/doc/html/index.html in your web browser.
#include <nfx/datatypes/Int128.h>
using namespace nfx::datatypes;
// Construction from various types
Int128 a{42}; // From int32
Int128 b{1234567890123456789LL}; // From int64
Int128 c{0xFEDCBA0987654321ULL, 0x0123456789ABCDEFULL}; // From two 64-bit words
// String parsing
Int128 d = Int128::parse("123456789012345678901234567890");
Int128 e;
if (Int128::tryParse("-987654321098765432109876543210", e))
{
// Successfully parsed
}
// Arithmetic operations
Int128 sum = a + b;
Int128 diff = b - a;
Int128 product = a * Int128{100};
Int128 quotient = b / Int128{10};
Int128 remainder = b % Int128{7};
// Comparison operations
bool equal = (a == Int128{42});
bool less = (a < b);
bool greater = (b > a);
// Cross-type comparisons
bool eqInt64 = (b == 1234567890123456789LL);
bool eqDouble = (a == 42.0);
// String conversion
std::string str = c.toString(); // "-1311768464867721559164238360763045071"
// Access high/low words
std::uint64_t low = c.toLow();
std::uint64_t high = c.toHigh();
// Mathematical operations
Int128 absValue = Int128{-42}.abs(); // 42
bool isNeg = Int128{-42}.isNegative(); // true
bool isZero = Int128{0}.isZero(); // true#include <nfx/datatypes/Decimal.h>
using namespace nfx::datatypes;
// Construction from various types
Decimal a{ 42 }; // Integer
Decimal b{ 123.456 }; // From double
Decimal c{ 9876543210LL }; // From int64
// String parsing with exact precision
Decimal d = Decimal::parse( "123.456789012345678901234567890" );
Decimal e;
if ( Decimal::tryParse( "99.99", e ) )
{
// Successfully parsed
}
// Arithmetic operations (exact decimal arithmetic)
Decimal sum = Decimal{ 10.5 } + Decimal{ 20.3 }; // 30.8
Decimal diff = Decimal{ 50.0 } - Decimal{ 12.5 }; // 37.5
Decimal product = Decimal{ 3.5 } * Decimal{ 2.0 }; // 7.0
Decimal quotient = Decimal{ 10.0 } / Decimal{ 4.0 }; // 2.5
// Financial calculations (no rounding errors)
Decimal price{ 19.99 };
Decimal quantity{ 100 };
Decimal total = price * quantity; // Exactly 1999.00
// Comparison operations
bool equal = ( Decimal{ 10.5 } == Decimal{ 10.5 } );
bool less = ( Decimal{ 5.0 } < Decimal{ 10.0 } );
// Mathematical operations
Decimal abs = Decimal{ -42.5 }.abs(); // 42.5
Decimal truncated = Decimal{ 42.789 }.truncate(); // 42
Decimal floor = Decimal{ 42.789 }.floor(); // 42
Decimal ceiling = Decimal{ 42.123 }.ceiling(); // 43
Decimal rounded = Decimal{ 42.567 }.round(); // 43
// Property access
std::uint8_t scale = Decimal{ 123.456 }.scale(); // Number of decimal places
int places = Decimal{ 123.456 }.decimalPlacesCount();
// State checking
bool isZero = Decimal{ 0 }.isZero();
bool isNeg = Decimal{ -10.5 }.isNegative();
// Constants
Decimal zero = Decimal::zero();
Decimal one = Decimal::one();
Decimal min = Decimal::minValue();
Decimal max = Decimal::maxValue();
// String conversion
std::string str = Decimal{ 123.456 }.toString(); // "123.456"#include <nfx/datatypes/Int128.h>
#include <nfx/datatypes/Decimal.h>
using namespace nfx::datatypes;
// Convert Int128 to Decimal
Int128 bigInt{1234567890123456789LL};
Decimal dec{bigInt}; // Exact conversion
// Convert Decimal to Int128 (truncates fractional part)
Decimal price{99.95};
Int128 wholeDollars{price}; // 99 (fractional part truncated)
// Mixed arithmetic comparisons
Int128 intVal{100};
Decimal decVal{100.0};
bool equal = (intVal == decVal); // true
Decimal withFraction{100.5};
bool notEqual = (intVal == withFraction); // false (Decimal has fractional part)
// Use in calculations
Int128 count{1000};
Decimal pricePerUnit{19.99};
Decimal totalCost = Decimal{count} * pricePerUnit;#include <iostream>
#include <nfx/datatypes/Int128.h>
#include <nfx/datatypes/Decimal.h>
int main()
{
using namespace nfx::datatypes;
// Financial calculation example
std::cout << "=== Financial Calculation ===" << std::endl;
Decimal price{ "19.99" };
Int128 quantity{ 1000 };
Decimal total = price * Decimal{quantity};
std::cout << "Price: " << price.toString() << std::endl;
std::cout << "Quantity: " << quantity.toString() << std::endl;
std::cout << "Total: " << total.toString() << std::endl;
// Large number arithmetic
std::cout << "\n=== Large Number Arithmetic ===" << std::endl;
Int128 large1 = Int128::parse("123456789012345678901234567890");
Int128 large2 = Int128::parse("987654321098765432109876543210");
Int128 sum = large1 + large2;
std::cout << "Sum: " << sum.toString() << std::endl;
// Decimal precision
std::cout << "\n=== Decimal Precision ===" << std::endl;
Decimal a{0.1};
Decimal b{0.2};
Decimal result = a + b;
std::cout << "0.1 + 0.2 = " << result.toString() << std::endl;
std::cout << "Equals 0.3? " << (result == Decimal{0.3} ? "Yes" : "No") << std::endl;
return 0;
}Sample Output:
=== Financial Calculation ===
Price: 19.99
Quantity: 1000
Total: 19990
=== Large Number Arithmetic ===
Sum: 1111111110111111111011111111100
=== Decimal Precision ===
0.1 + 0.2 = 0.3
Equals 0.3? Yes
nfx-datatypes provides comprehensive packaging options for distribution.
# Configure with packaging options
cmake .. -DCMAKE_BUILD_TYPE=Release \
-DNFX_DATATYPES_BUILD_STATIC=ON \
-DNFX_DATATYPES_BUILD_SHARED=ON \
-DNFX_DATATYPES_PACKAGE_ARCHIVE=ON \
-DNFX_DATATYPES_PACKAGE_DEB=ON \
-DNFX_DATATYPES_PACKAGE_RPM=ON
# Generate binary packages
cmake --build . --target package
# or
cd build && cpack
# Generate source packages
cd build && cpack --config CPackSourceConfig.cmake| Format | Platform | Description | Requirements |
|---|---|---|---|
| TGZ/ZIP | Cross-platform | Compressed archive packages | None |
| DEB | Debian/Ubuntu | Native Debian packages | dpkg-dev |
| RPM | RedHat/SUSE | Native RPM packages | rpm-build |
| WiX | Windows | Professional MSI installer | WiX 3.11+ |
| Source | Cross-platform | Source code distribution (TGZ+ZIP) | None |
# Linux (DEB-based systems)
sudo dpkg -i nfx-datatypes_*_amd64.deb
# Linux (RPM-based systems)
sudo rpm -ivh nfx-datatypes-*-Linux.rpm
# Windows
# Run the .exe installer with administrator privileges
nfx-datatypes-*-win64.exe
# Manual installation (extract archive)
tar -xzf nfx-datatypes-*-Linux.tar.gz -C /usr/local/nfx-datatypes/
├── benchmark/ # Performance benchmarks with Google Benchmark
├── cmake/ # CMake modules and configuration
├── include/nfx/ # Public headers: Int128, Decimal
├── samples/ # Example usage and demonstrations
├── src/ # Implementation files
└── test/ # Comprehensive unit tests with GoogleTest
For detailed performance metrics across all compilers (GCC, Clang, MSVC, MinGW) and platforms, see the benchmark documentation.
See the changelog for a detailed history of changes, new features, and bug fixes.
This project is licensed under the MIT License.
- GoogleTest: Testing framework (BSD 3-Clause License) - Development only
- Google Benchmark: Performance benchmarking framework (Apache 2.0 License) - Development only
All dependencies are automatically fetched via CMake FetchContent when building tests or benchmarks.
Updated on November 1, 2025