32 changed files with 297 additions and 323 deletions
@ -0,0 +1,114 @@
@@ -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 @@
@@ -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