32 changed files with 297 additions and 323 deletions
@ -0,0 +1,114 @@ |
|||||||
|
/**************************************************************************** |
||||||
|
* |
||||||
|
* Copyright (C) 2022 PX4 Development Team. All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions |
||||||
|
* are met: |
||||||
|
* |
||||||
|
* 1. Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer in |
||||||
|
* the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* 3. Neither the name PX4 nor the names of its contributors may be |
||||||
|
* used to endorse or promote products derived from this software |
||||||
|
* without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS |
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE |
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, |
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS |
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED |
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
||||||
|
* POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
****************************************************************************/ |
||||||
|
|
||||||
|
// minimal cmath |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <cstdlib> |
||||||
|
#include <inttypes.h> |
||||||
|
|
||||||
|
#include <math.h> |
||||||
|
|
||||||
|
#ifndef M_PI |
||||||
|
#define M_PI 3.14159265358979323846 |
||||||
|
#endif |
||||||
|
|
||||||
|
namespace std |
||||||
|
{ |
||||||
|
|
||||||
|
#if !defined(FLT_EPSILON) |
||||||
|
#define FLT_EPSILON __FLT_EPSILON__ |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
#ifdef isfinite |
||||||
|
#undef isfinite |
||||||
|
#endif // isfinite |
||||||
|
|
||||||
|
inline bool isfinite(float value) { return __builtin_isfinite(value); } |
||||||
|
inline bool isfinite(double value) { return __builtin_isfinite(value); } |
||||||
|
inline bool isfinite(long double value) { return __builtin_isfinite(value); } |
||||||
|
|
||||||
|
|
||||||
|
#ifdef isnan |
||||||
|
#undef isnan |
||||||
|
#endif // isnan |
||||||
|
|
||||||
|
inline bool isnan(float value) { return __builtin_isnan(value); } |
||||||
|
inline bool isnan(double value) { return __builtin_isnan(value); } |
||||||
|
inline bool isnan(long double value) { return __builtin_isnan(value); } |
||||||
|
|
||||||
|
|
||||||
|
#ifdef isinf |
||||||
|
#undef isinf |
||||||
|
#endif // isinf |
||||||
|
|
||||||
|
inline bool isinf(float value) { return __builtin_isinf_sign(value); } |
||||||
|
inline bool isinf(double value) { return __builtin_isinf_sign(value); } |
||||||
|
inline bool isinf(long double value) { return __builtin_isinf_sign(value); } |
||||||
|
|
||||||
|
/* |
||||||
|
* NuttX has no usable C++ math library, so we need to provide the needed definitions here manually. |
||||||
|
*/ |
||||||
|
#define 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 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); } |
||||||
|
|
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(fabs) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(log) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(log10) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(exp) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(sqrt) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(sin) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(cos) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(tan) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(asin) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(acos) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(atan) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(sinh) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(cosh) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(tanh) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(ceil) |
||||||
|
NUTTX_WRAP_MATH_FUN_UNARY(floor) |
||||||
|
|
||||||
|
NUTTX_WRAP_MATH_FUN_BINARY(pow) |
||||||
|
NUTTX_WRAP_MATH_FUN_BINARY(atan2) |
||||||
|
|
||||||
|
} |
@ -1,140 +0,0 @@ |
|||||||
/**
|
|
||||||
* @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 |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue