summaryrefslogtreecommitdiff
path: root/src/util/Math.c
blob: 7ce8d680b50cbe1f8e0c80b71e2d8a083219380c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
 /*@@
   @file      Math.c
   @date      2012-10-17
   @author    Erik Schnetter
   @desc
              Miscellaneous math routines, providing fallback C
              implementations for broken C++ compilers, and providing
              dummy implementations for broken C compilers.
   @enddesc
 @@*/

#include <math.h>
#include <cctk_Config.h>
#include <cctk_Math.h>



double CCTK_copysign(double x, double y)
{
#ifdef HAVE_COPYSIGN
  return copysign(x, y);
#else
  return y >= 0.0 ? fabs(x) : -fabs(x);
#endif
}

double CCTK_FNAME(CCTK_copysign)(double *x, double *y);
double CCTK_FNAME(CCTK_copysign)(double *x, double *y)
{
  return CCTK_copysign(*x, *y);
}



int CCTK_fpclassify(double x)
{
#ifdef HAVE_FPCLASSIFY
  return fpclassify(x);
#else
  return 0;                     /* don't know what else to return */
#endif
}

int CCTK_FNAME(CCTK_fpclassify)(double *x);
int CCTK_FNAME(CCTK_fpclassify)(double *x)
{
  return CCTK_fpclassify(*x);
}



int CCTK_isfinite(double x)
{
#ifdef HAVE_ISFINITE
  return isfinite(x);
#else
  return 1;                     /* default */
#endif
}

int CCTK_FNAME(CCTK_isfinite)(double *x);
int CCTK_FNAME(CCTK_isfinite)(double *x)
{
  return CCTK_isfinite(*x);
}



int CCTK_isinf(double x)
{
#ifdef HAVE_ISINF
  return isinf(x);
#else
  return 0;                     /* default */
#endif
}

int CCTK_FNAME(CCTK_isinf)(double *x);
int CCTK_FNAME(CCTK_isinf)(double *x)
{
  return CCTK_isinf(*x);
}



int CCTK_isnan(double x)
{
#ifdef HAVE_ISNAN
  return isnan(x);
#else
  return 0;                     /* default */
#endif
}

int CCTK_FNAME(CCTK_isnan)(double *x);
int CCTK_FNAME(CCTK_isnan)(double *x)
{
  return CCTK_isnan(*x);
}



int CCTK_isnormal(double x)
{
#ifdef HAVE_ISNORMAL
  return isnormal(x);
#else
  return 1;                     /* default */
#endif
}

int CCTK_FNAME(CCTK_isnormal)(double *x);
int CCTK_FNAME(CCTK_isnormal)(double *x)
{
  return CCTK_isnormal(*x);
}



int CCTK_signbit(double x)
{
#ifdef HAVE_SIGNBIT
  return signbit(x);
#else
  return x < 0.0;
#endif
}

int CCTK_FNAME(CCTK_signbit)(double *x);
int CCTK_FNAME(CCTK_signbit)(double *x)
{
  return CCTK_signbit(*x);
}