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.
Documentation can be found here.
Compiled on x86-64 and armv7. Tested on x86-86 using 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.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:
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>
Examples of projects using CNL:
- CDSP - Compositional DSP Library for C++;
- cnl_example - minimal CMake-based project which uses CNL as a dependency.
- CNL documentation
- CppCon 2017 presentation
- Embedded Artistry article
- ISO C++ papers:
All feedback greatly appreciated.