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.
Tested on Travis and CircleCI.
Requires:
Optional:
- 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.gitCNL 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:
cmake /some/directory/cnl -
Build tests:
-
For Linux (in parallel using N cores):
cmake --build . --target Tests -- -j N -
For Windows:
cmake --build . --target src/test/Tests
-
-
Run tests:
ctest
-
Generate the build system (optimized):
cmake -DCMAKE_BUILD_TYPE=Release /some/directory/cnl -
Build benchmarks:
cmake --build . --target Benchmark -
Run benchmarks:
src/benchmark/Benchmark
-
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.
- documentation
- Standard Library fixed-point proposal, P0037
- position paper illustrating the compositonal approach, P0554
- forum of Study Group 14
All feedback greatly appreciated.