| ## Safe Numerics

### Checked Arithmetic

#### Description

Perform binary operations on arithmetic types. Return either a valid result or an error code. Under no circumstances should an incorrect result be returned.

#### Type requirements

All template parameters of the functions must model Numeric type requirements.

#### Complexity

Each function performs one and only one arithmetic operation.

#### Example of use

    #include <boost/numeric/safe_numerics/checked_default.hpp>

    checked_result<int> r = checked::multiply<int>(24, 42);

#### Notes

Some compilers have command line switches (e.g. -ftrapv) which enable special behavior such that erroneous integer operations are detected at run time. The library has been implemented in such a way that these facilities are not used. It's possible they might be helpful in particular environment. These could be be exploited by re-implementing some functions in this library.

#### Synopsis

    // safe casting on primitive types
    template<class R, class T>
    checked_result<R> constexpr checked::cast(const T & t);

    // safe addition on primitive types
    template<class R>
    checked_result<R> constexpr checked::add(const R & t, const R & u);

    // safe subtraction on primitive types
    template<class R>
    checked_result<R> constexpr checked::subtract(const R & t, const R & u);

    // safe multiplication on primitive types
    template<class R>
    checked_result<R> constexpr checked::multiply(const R & t, const R & u);

    // safe division on primitive types
    template<class R>
    checked_result<R> constexpr checked::divide(const R & t, const R & u);

    // safe modulus on primitive types
    template<class R>
    checked_result<R> constexpr checked::modulus(const R & t, const R & u);

    // safe less than predicate on primitive types
    template<class R>
    bool constexpr checked::less_than(const R & t, const R & u);

    // safe greater_than_equal predicate on primitive types
    template<class R>
    bool constexpr checked::greater_than_equal(const R & t, const R & u);

    // safe greater_than predicate on primitive types
    template<class R>
    bool constexpr checked::greater_than(const R & t, const R & u);

    // safe less_than_equal predicate on primitive types
    template<class R>
    bool constexpr checked::less_than_equal(const R & t, const R & u);

    // safe equal predicate on primitive types
    template<class R>
    bool constexpr checked::equal(const R & t, const R & u);

    // left shift
    template<class R>
    checked_result<R> constexpr checked::left_shift(const R & t, const R & u);

    // right shift
    template<class R>
    checked_result<R> constexpr checked::right_shift(const R & t, const R & u);

    // bitwise operations
    template<class R>
    checked_result<R> constexpr checked::bitwise_or(const R & t, const R & u);

    template<class R>
    checked_result<R> constexpr checked::bitwise_and(const R & t, const R & u);

    template<class R>
    checked_result<R> constexpr checked::bitwise_xor(const R & t, const R & u);

#### See Also

checked_result<R>

#### Header

`#include <boost/numeric/safe_numerics/checked_default.hpp>`

`#include <boost/numeric/safe_numerics/checked_integer.hpp>`

```#include <boost/numeric/safe_numerics/checked_float.hpp>`