You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.4 KiB
139 lines
3.4 KiB
/** |
|
* @file stdlib_imports.hpp |
|
* |
|
* This file is needed to shadow the C standard library math functions with ones provided by the C++ standard library. |
|
* This way we can guarantee that unwanted functions from the C library will never creep back in unexpectedly. |
|
* |
|
* @author Pavel Kirienko <pavel.kirienko@zubax.com> |
|
*/ |
|
|
|
#pragma once |
|
|
|
#include <cmath> |
|
#include <cstdlib> |
|
#include <inttypes.h> |
|
|
|
#ifndef M_PI |
|
#define M_PI 3.14159265358979323846 |
|
#endif |
|
#ifndef M_TWOPI |
|
#define M_TWOPI (M_PI * 2.0) |
|
#endif |
|
|
|
namespace matrix { |
|
|
|
#if !defined(FLT_EPSILON) |
|
#define FLT_EPSILON __FLT_EPSILON__ |
|
#endif |
|
|
|
#if defined(__PX4_NUTTX) |
|
/* |
|
* NuttX has no usable C++ math library, so we need to provide the needed definitions here manually. |
|
*/ |
|
#define MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(name) \ |
|
inline float name(float x) { return ::name##f(x); } \ |
|
inline double name(double x) { return ::name(x); } \ |
|
inline long double name(long double x) { return ::name##l(x); } |
|
|
|
#define MATRIX_NUTTX_WRAP_MATH_FUN_BINARY(name) \ |
|
inline float name(float x, float y) { return ::name##f(x, y); } \ |
|
inline double name(double x, double y) { return ::name(x, y); } \ |
|
inline long double name(long double x, long double y) { return ::name##l(x, y); } |
|
|
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(fabs) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(log) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(log10) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(exp) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(sqrt) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(sin) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(cos) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(tan) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(asin) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(acos) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(atan) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(sinh) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(cosh) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(tanh) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(ceil) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_UNARY(floor) |
|
|
|
MATRIX_NUTTX_WRAP_MATH_FUN_BINARY(pow) |
|
MATRIX_NUTTX_WRAP_MATH_FUN_BINARY(atan2) |
|
|
|
#else // Not NuttX, using the C++ standard library |
|
|
|
using std::abs; |
|
using std::div; |
|
using std::fabs; |
|
using std::fmod; |
|
using std::exp; |
|
using std::log; |
|
using std::log10; |
|
using std::pow; |
|
using std::sqrt; |
|
using std::sin; |
|
using std::cos; |
|
using std::tan; |
|
using std::asin; |
|
using std::acos; |
|
using std::atan; |
|
using std::atan2; |
|
using std::sinh; |
|
using std::cosh; |
|
using std::tanh; |
|
using std::ceil; |
|
using std::floor; |
|
using std::frexp; |
|
using std::ldexp; |
|
using std::modf; |
|
|
|
# if (__cplusplus >= 201103L) |
|
|
|
using std::remainder; |
|
using std::remquo; |
|
using std::fma; |
|
using std::fmax; |
|
using std::fmin; |
|
using std::fdim; |
|
using std::nan; |
|
using std::nanf; |
|
using std::nanl; |
|
using std::exp2; |
|
using std::expm1; |
|
using std::log2; |
|
using std::log1p; |
|
using std::cbrt; |
|
using std::hypot; |
|
using std::asinh; |
|
using std::acosh; |
|
using std::atanh; |
|
using std::erf; |
|
using std::erfc; |
|
using std::tgamma; |
|
using std::lgamma; |
|
using std::trunc; |
|
using std::round; |
|
using std::nearbyint; |
|
using std::rint; |
|
using std::scalbn; |
|
using std::ilogb; |
|
using std::logb; |
|
using std::nextafter; |
|
using std::copysign; |
|
using std::fpclassify; |
|
using std::isfinite; |
|
using std::isinf; |
|
using std::isnan; |
|
using std::isnormal; |
|
using std::signbit; |
|
using std::isgreater; |
|
using std::isgreaterequal; |
|
using std::isless; |
|
using std::islessequal; |
|
using std::islessgreater; |
|
using std::isunordered; |
|
|
|
# endif |
|
#endif |
|
|
|
}
|
|
|