/cnl

A Compositional Numeric Library for C++

Primary LanguageC++Boost Software License 1.0BSL-1.0

Compositional Numeric Library

Build Status Build status CircleCI

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.

Requirements

Linux

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

Windows

Tested on AppVeyor and on Windows 10 Professional with CMake 3.8.0. Requires:

  • MSBuild 15.0 (VS 2017)
  • CMake 3.8.0

Instructions

Download

The library is hosted on GitHub:

cd /some/directory
git clone https://github.com/johnmcfarlane/cnl.git

Build

CNL is a header-only library so there is no need to build it. However, it comes with a number of tests and benchmarks.

Running Tests

  1. Generate the build system:

    cmake /some/directory/cnl

  2. Build tests:

    • For Linux (in parallel using N cores):

      cmake --build . --target Tests -- -j N

    • For Windows:

      cmake --build . --target src/test/Tests

  3. Run tests:

    ctest

Running Benchmarks

  1. Generate the build system (optimized):

    cmake -DCMAKE_BUILD_TYPE=Release /some/directory/cnl

  2. Build benchmarks:

    cmake --build . --target Benchmark

  3. Run benchmarks:

    src/benchmark/Benchmark

Additional build system generation options:

  1. To describe CNL build options:

    cmake -LH /some/directory/cnl

  2. Then to apply an option, e.g. to disabled exceptions:

    cmake -DEXCEPTIONS=OFF /some/directory/cnl

Integration

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>

Example Projects

Examples of projects using CNL:

  • CDSP - Compositional DSP Library for C++;
  • cnl_example - minimal CMake-based project which uses CNL as a dependency.

Further Reading

Contact Information

All feedback greatly appreciated.

Developed with CLion: A Cross-Platform IDE for C and C++ by JetBrains.