Skip to content

Commit 16c357a

Browse files
authored
Merge pull request #641 from ckormanyos/more_cmath
More refinements of homegrown <cmath>
2 parents 14678a9 + 4cb02d1 commit 16c357a

1 file changed

Lines changed: 67 additions & 59 deletions

File tree

  • ref_app/src/util/STL

ref_app/src/util/STL/cmath

Lines changed: 67 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
#define FP_ILOGB0 (-0x7fffffff - _C2)
5757
#define FP_ILOGBNAN 0x7fffffff
5858

59-
static_assert(__SIZEOF_LONG_DOUBLE__ >= __SIZEOF_DOUBLE__,
59+
static_assert((__SIZEOF_LONG_DOUBLE__ > 0) && (__SIZEOF_LONG_DOUBLE__ >= __SIZEOF_DOUBLE__),
6060
"Error: Configuration error regarding 64-bit double/long-double for AVR");
6161

6262
#if(__SIZEOF_DOUBLE__ == 4)
@@ -221,38 +221,40 @@
221221
#error Error: sizeof(double) is unknown or not standard for AVR.
222222
#endif
223223

224+
#if defined(__cplusplus)
224225
extern "C"
225226
{
227+
#endif
226228
float asinhf(float x);
227229
double asinh (double x);
228230
long double asinhl(long double x);
229-
230231
float acoshf(float x);
231232
double acosh (double x);
232233
long double acoshl(long double x);
233-
234234
float atanhf(float x);
235235
double atanh (double x);
236236
long double atanhl(long double x);
237-
238-
int ilogbf(float x);
239-
int ilogb (double x);
240-
int ilogbl(long double x);
241-
237+
int ilogbf(float x);
238+
int ilogb (double x);
239+
int ilogbl(long double x);
242240
float tgammaf(float x);
243241
double tgamma (double x);
244242
long double tgammal(long double x);
245-
246243
float lgammaf(float x);
247244
double lgamma (double x);
248245
long double lgammal(long double x);
246+
#if defined(__cplusplus)
249247
}
248+
#endif
250249

251250
namespace std
252251
{
253252
inline bool isnan (float x) { return (__BUILTIN_ISNANF(x) == 1); }
254253
inline bool isnan (double x) { return (__BUILTIN_ISNAN (x) == 1); }
255254
inline bool isnan (long double x) { return (__BUILTIN_ISNANL(x) == 1); }
255+
inline float abs (float x) { return __BUILTIN_FABSF (x); }
256+
inline double abs (double x) { return __BUILTIN_FABS (x); }
257+
inline long double abs (long double x) { return __BUILTIN_FABSL (x); }
256258
inline float fabs (float x) { return __BUILTIN_FABSF (x); }
257259
inline double fabs (double x) { return __BUILTIN_FABS (x); }
258260
inline long double fabs (long double x) { return __BUILTIN_FABSL (x); }
@@ -269,10 +271,6 @@
269271
inline bool isinf(double x) { return ::std::cmath_detail::isinf_impl(x); }
270272
inline bool isinf(long double x) { return ::std::cmath_detail::isinf_impl(x); }
271273

272-
inline bool isfinite(float x) { return ((!(::std::isinf)(x)) && (!(::std::isnan)(x))); }
273-
inline bool isfinite(double x) { return ((!(::std::isinf)(x)) && (!(::std::isnan)(x))); }
274-
inline bool isfinite(long double x) { return ((!(::std::isinf)(x)) && (!(::std::isnan)(x))); }
275-
276274
namespace cmath_detail {
277275

278276
template<typename FloatType>
@@ -318,6 +316,10 @@
318316

319317
} // namespace cmath_detail
320318

319+
inline bool isfinite(float x) { return ((!(::std::isinf)(x)) && (!(::std::isnan)(x))); }
320+
inline bool isfinite(double x) { return ((!(::std::isinf)(x)) && (!(::std::isnan)(x))); }
321+
inline bool isfinite(long double x) { return ((!(::std::isinf)(x)) && (!(::std::isnan)(x))); }
322+
321323
inline int fpclassify(float x) { return ::std::cmath_detail::fpclassify_impl(x); }
322324
inline int fpclassify(double x) { return ::std::cmath_detail::fpclassify_impl(x); }
323325
inline int fpclassify(long double x) { return ::std::cmath_detail::fpclassify_impl(x); }
@@ -418,6 +420,10 @@
418420
{
419421
#endif
420422
// These are (most of) the functions from <math.h> having C-linkage.
423+
int isinff (float);
424+
int isinfl (long double);
425+
int isnanf (float);
426+
int isnanl (long double);
421427
int isfinitef (float);
422428
int isfinitel (long double);
423429
int ilogbf (float);
@@ -490,9 +496,6 @@
490496
extern "C++"
491497
{
492498
#endif
493-
inline bool isfinite (float x) { return (::isfinitef(x) == 1); }
494-
inline bool isfinite (double x) { return (::isfinite (x) == 1); }
495-
inline bool isfinite (long double x) { return (::isfinitel(x) == 1); }
496499
inline int ilogb (float x) { return ::ilogbf(x); }
497500
inline int ilogb (double x) { return ::ilogb (x); }
498501
inline int ilogb (long double x) { return ::ilogbl(x); }
@@ -576,85 +579,91 @@
576579
inline double tanh (double x) { return __builtin_tanh (x); }
577580
inline long double tanh (long double x) { return __builtin_tanhl (x); }
578581
#else
579-
inline bool isnan (float x) { return ::isnanf(x); }
582+
inline bool isnan (float x) { return (::isnanf)(x); }
580583
bool isnan (double x);
581-
inline bool isnan (long double x) { return ::isnanl(x); }
582-
inline float abs (float x) { return ::fabsf (x); }
584+
inline bool isnan (long double x) { return (::isnanl)(x); }
585+
inline bool isinf (float x) { return (::isnanf)(x); }
586+
bool isinf (double x);
587+
inline bool isinf (long double x) { return (::isnanl)(x); }
588+
inline float abs (float x) { return ::fabsf(x); }
583589
extern "C" double abs (double x);
584-
inline long double abs (long double x) { return ::fabsl (x); }
585-
inline float fabs (float x) { return ::fabsf (x); }
590+
inline long double abs (long double x) { return ::fabsl(x); }
591+
inline float fabs (float x) { return ::fabsf(x); }
586592
extern "C" double fabs (double x);
587-
inline long double fabs (long double x) { return ::fabsl (x); }
593+
inline long double fabs (long double x) { return ::fabsl(x); }
588594
inline float fmod (float x, float y) { return ::fmodf(x, y); }
589595
extern "C" double fmod (double x, double y);
590596
inline long double fmod (long double x, long double y) { return ::fmodl(x, y); }
591-
inline float modf (float x, float* p) { return ::modff (x, p); }
597+
inline float modf (float x, float* p) { return ::modff(x, p); }
592598
extern "C" double modf (double x, double* p);
593-
inline long double modf (long double x, long double* p) { return ::modfl (x, p); }
599+
inline long double modf (long double x, long double* p) { return ::modfl(x, p); }
594600
inline float floor (float x) { return ::floorf(x); }
595601
extern "C" double floor (double x);
596602
inline long double floor (long double x) { return ::floorl(x); }
597-
inline float ceil (float x) { return ::ceilf (x); }
603+
inline float ceil (float x) { return ::ceilf(x); }
598604
extern "C" double ceil (double x);
599-
inline long double ceil (long double x) { return ::ceill (x); }
605+
inline long double ceil (long double x) { return ::ceill(x); }
600606
inline float frexp (float x, int* p) { return ::frexpf(x, p); }
601607
extern "C" double frexp (double x, int* p);
602608
inline long double frexp (long double x, int* p) { return ::frexpl(x, p); }
603609
inline float ldexp (float x, int p) { return ::ldexpf(x, p); }
604610
extern "C" double ldexp (double x, int p);
605-
inline long double ldexp (long double x, int p) { return ::ldexpl (x, p); }
611+
inline long double ldexp (long double x, int p) { return ::ldexpl(x, p); }
606612
inline long lround (float x) { return ::lroundf(x); }
607613
extern "C" long lround (double x);
608614
inline long lround (long double x) { return ::lroundl(x); }
609-
inline float sqrt (float x) { return ::sqrtf (x); }
615+
inline float sqrt (float x) { return ::sqrtf(x); }
610616
extern "C" double sqrt (double x);
611-
inline long double sqrt (long double x) { return ::sqrtl (x); }
612-
inline float cbrt (float x) { return ::cbrtf (x); }
617+
inline long double sqrt (long double x) { return ::sqrtl(x); }
618+
inline float cbrt (float x) { return ::cbrtf(x); }
613619
extern "C" double cbrt (double x);
614-
inline long double cbrt (long double x) { return ::cbrtl (x); }
615-
inline float sin (float x) { return ::sinf (x); }
620+
inline long double cbrt (long double x) { return ::cbrtl(x); }
621+
inline float sin (float x) { return ::sinf(x); }
616622
extern "C" double sin (double x);
617-
inline long double sin (long double x) { return ::sinl (x); }
618-
inline float cos (float x) { return ::cosf (x); }
623+
inline long double sin (long double x) { return ::sinl(x); }
624+
inline float cos (float x) { return ::cosf(x); }
619625
extern "C" double cos (double x);
620-
inline long double cos (long double x) { return ::cosl (x); }
621-
inline float tan (float x) { return ::tanf (x); }
626+
inline long double cos (long double x) { return ::cosl(x); }
627+
inline float tan (float x) { return ::tanf(x); }
622628
extern "C" double tan (double x);
623-
inline long double tan (long double x) { return ::tanl (x); }
624-
inline float asin (float x) { return ::asinf (x); }
629+
inline long double tan (long double x) { return ::tanl(x); }
630+
inline float asin (float x) { return ::asinf(x); }
625631
extern "C" double asin (double x);
626-
inline long double asin (long double x) { return ::asinl (x); }
627-
inline float acos (float x) { return ::acosf (x); }
632+
inline long double asin (long double x) { return ::asinl(x); }
633+
inline float acos (float x) { return ::acosf(x); }
628634
extern "C" double acos (double x);
629-
inline long double acos (long double x) { return ::acosl (x); }
630-
inline float atan (float x) { return ::atanf (x); }
635+
inline long double acos (long double x) { return ::acosl(x); }
636+
inline float atan (float x) { return ::atanf(x); }
631637
extern "C" double atan (double x);
632-
inline long double atan (long double x) { return ::atanl (x); }
638+
inline long double atan (long double x) { return ::atanl(x); }
633639
inline float atan2 (float y, float x) { return ::atan2f(y, x); }
634640
extern "C" double atan2 (double y, double x);
635641
inline long double atan2 (long double y, long double x) { return ::atan2l(y, x); }
636-
inline float exp (float x) { return ::expf (x); }
642+
inline float exp (float x) { return ::expf(x); }
637643
extern "C" double exp (double x);
638-
inline long double exp (long double x) { return ::expl (x); }
639-
inline float pow (float x, float a) { return ::powf (x, a); }
644+
inline long double exp (long double x) { return ::expl(x); }
645+
inline float pow (float x, float a) { return ::powf(x, a); }
640646
extern "C" double pow (double x, double a);
641-
inline long double pow (long double x, long double a) { return ::powl (x, a); }
642-
inline float log (float x) { return ::logf (x); }
647+
inline long double pow (long double x, long double a) { return ::powl(x, a); }
648+
inline float log (float x) { return ::logf(x); }
643649
extern "C" double log (double x);
644-
inline long double log (long double x) { return ::logl (x); }
650+
inline long double log (long double x) { return ::logl(x); }
645651
inline float log10 (float x) { return ::log10f(x); }
646652
extern "C" double log10 (double x);
647653
inline long double log10 (long double x) { return ::log10l(x); }
648-
inline float sinh (float x) { return ::sinhf (x); }
654+
inline float sinh (float x) { return ::sinhf(x); }
649655
extern "C" double sinh (double x);
650-
inline long double sinh (long double x) { return ::sinhl (x); }
651-
inline float cosh (float x) { return ::coshf (x); }
656+
inline long double sinh (long double x) { return ::sinhl(x); }
657+
inline float cosh (float x) { return ::coshf(x); }
652658
extern "C" double cosh (double x);
653-
inline long double cosh (long double x) { return ::coshl (x); }
654-
inline float tanh (float x) { return ::tanhf (x); }
659+
inline long double cosh (long double x) { return ::coshl(x); }
660+
inline float tanh (float x) { return ::tanhf(x); }
655661
extern "C" double tanh (double x);
656-
inline long double tanh (long double x) { return ::tanhl (x); }
662+
inline long double tanh (long double x) { return ::tanhl(x); }
657663
#endif
664+
inline bool isfinite (float x) { return ((!(::isinff)(x)) && (!(::isnanf)(x))); }
665+
extern "C" bool isfinite (double x);
666+
inline bool isfinite (long double x) { return ((!(::isinfl)(x)) && (!(::isnanl)(x))); }
658667
inline float asinh (float x) { return ::asinhf(x); }
659668
extern "C" double asinh (double x);
660669
inline long double asinh (long double x) { return ::asinhl(x); }
@@ -671,10 +680,9 @@
671680
extern "C" double lgamma (double x);
672681
inline long double lgamma (long double x) { return ::lgammal(x); }
673682
#if (defined(__cplusplus) && (__cplusplus > 201703L))
674-
inline float lerp (float a, float b, float t) { return a + (t * (b - a)); }
675-
inline double lerp (double a, double b, double t) { return a + (t * (b - a)); }
676-
inline long double lerp (long double a, long double b, long double t)
677-
{ return a + (t * (b - a)); }
683+
inline float lerp (float a, float b, float t) { return a + (t * (b - a)); }
684+
inline double lerp (double a, double b, double t) { return a + (t * (b - a)); }
685+
inline long double lerp (long double a, long double b, long double t) { return a + (t * (b - a)); }
678686
#endif
679687
#if defined(__cplusplus)
680688
}

0 commit comments

Comments
 (0)