CNL: A Compositional Numeric Library for C++
CNL is a numerics library written in C++
which aims to do for
int what the STL does for arrays.
Its main roles are to help:
- approximate real numbers using fixed-point arithmetic;
- detect and prevent overflow and
- increase precision through alternative rounding modes.
A compositional design promotes seamless interoperability between numeric types. And by providing the thinnest wrappers over the widest range of numeric types, CNL aims to assist the development of:
- large-scale simulations including video games and scientific models;
- resource-constrained applications on embedded and mobile devices and
- math-intensive operations on specialized hardware such as GPUs and FPGAs.
The library's APIs are developed in colaboration with standardization bodies such as The C++ Standards Committee and members of The Khronos Group Inc. and it serves as a reference implementation for sections of the C++ Numbers Technical Specification. Please read proposals, P0037 and P0554 for more details.
- Boost - facilitates multiprecision support
- Doxygen - generates documentation in the doc/gh-pages directory
Tested on AppVeyor and on Windows 10 Professional with CMake 3.8.0. Requires:
- MSBuild 15.0 (VS 2017)
- CMake 3.8.0
The library is hosted on GitHub:
cd /some/directory git clone https://github.com/johnmcfarlane/cnl.git
CNL is a header-only library so there is no need to build it. However, it comes with a number of tests and benchmarks.
Generate the build system:
For Linux (in parallel using N cores):
cmake --build . --target Tests -- -j N
cmake --build . --target src/test/Tests
Generate the build system (optimized):
cmake -DCMAKE_BUILD_TYPE=Release /some/directory/cnl
cmake --build . --target Benchmark
Additional build system generation options:
To describe CNL build options:
cmake -LH /some/directory/cnl
Then to apply an option, e.g. to disabled exceptions:
cmake -DEXCEPTIONS=OFF /some/directory/cnl
The API is exposed through headers in the include directory. Add this to your system header list and include, e.g.:
// to use a specific type: #include <cnl/fixed_point.h> // or to include all CNL types: #include <cnl/all.h>
See example program, Tau, for more details.
- Standard Library fixed-point proposal, P0037
- position paper illustrating the compositonal approach, P0554
- forum of Study Group 14
All feedback greatly appreciated.