fastmath.cpp File Reference
#include "main.h"

Functions

void check (bool b, bool ref)
 
template<typename T >
void check_inf_nan (bool dryrun)
 
 EIGEN_DECLARE_TEST (fastmath)
 

Function Documentation

◆ check()

void check ( bool  b,
bool  ref 
)

◆ check_inf_nan()

template<typename T >
void check_inf_nan ( bool  dryrun)
38  {
40  m.setRandom();
41  m(3) = std::numeric_limits<T>::quiet_NaN();
42 
43  if (dryrun) {
44  std::cout << "std::isfinite(" << m(3) << ") = ";
45  check((std::isfinite)(m(3)), false);
46  std::cout << " ; numext::isfinite = ";
47  check((numext::isfinite)(m(3)), false);
48  std::cout << "\n";
49  std::cout << "std::isinf(" << m(3) << ") = ";
50  check((std::isinf)(m(3)), false);
51  std::cout << " ; numext::isinf = ";
52  check((numext::isinf)(m(3)), false);
53  std::cout << "\n";
54  std::cout << "std::isnan(" << m(3) << ") = ";
55  check((std::isnan)(m(3)), true);
56  std::cout << " ; numext::isnan = ";
57  check((numext::isnan)(m(3)), true);
58  std::cout << "\n";
59  std::cout << "allFinite: ";
60  check(m.allFinite(), 0);
61  std::cout << "\n";
62  std::cout << "hasNaN: ";
63  check(m.hasNaN(), 1);
64  std::cout << "\n";
65  std::cout << "\n";
66  } else {
67  if ((std::isfinite)(m(3))) {
68  g_test_level = 1;
69  VERIFY(!(numext::isfinite)(m(3)));
70  g_test_level = 0;
71  }
72  if ((std::isinf)(m(3))) {
73  g_test_level = 1;
74  VERIFY(!(numext::isinf)(m(3)));
75  g_test_level = 0;
76  }
77  if (!(std::isnan)(m(3))) {
78  g_test_level = 1;
79  VERIFY((numext::isnan)(m(3)));
80  g_test_level = 0;
81  }
82  if ((std::isfinite)(m(3))) {
83  g_test_level = 1;
84  VERIFY(!m.allFinite());
85  g_test_level = 0;
86  }
87  if (!(std::isnan)(m(3))) {
88  g_test_level = 1;
89  VERIFY(m.hasNaN());
90  g_test_level = 0;
91  }
92  }
94  m(4) /= hidden_zero;
95  if (dryrun) {
96  std::cout << "std::isfinite(" << m(4) << ") = ";
97  check((std::isfinite)(m(4)), false);
98  std::cout << " ; numext::isfinite = ";
99  check((numext::isfinite)(m(4)), false);
100  std::cout << "\n";
101  std::cout << "std::isinf(" << m(4) << ") = ";
102  check((std::isinf)(m(4)), true);
103  std::cout << " ; numext::isinf = ";
104  check((numext::isinf)(m(4)), true);
105  std::cout << "\n";
106  std::cout << "std::isnan(" << m(4) << ") = ";
107  check((std::isnan)(m(4)), false);
108  std::cout << " ; numext::isnan = ";
109  check((numext::isnan)(m(4)), false);
110  std::cout << "\n";
111  std::cout << "allFinite: ";
112  check(m.allFinite(), 0);
113  std::cout << "\n";
114  std::cout << "hasNaN: ";
115  check(m.hasNaN(), 1);
116  std::cout << "\n";
117  std::cout << "\n";
118  } else {
119  if ((std::isfinite)(m(3))) {
120  g_test_level = 1;
121  VERIFY(!(numext::isfinite)(m(4)));
122  g_test_level = 0;
123  }
124  if (!(std::isinf)(m(3))) {
125  g_test_level = 1;
126  VERIFY((numext::isinf)(m(4)));
127  g_test_level = 0;
128  }
129  if ((std::isnan)(m(3))) {
130  g_test_level = 1;
131  VERIFY(!(numext::isnan)(m(4)));
132  g_test_level = 0;
133  }
134  if ((std::isfinite)(m(3))) {
135  g_test_level = 1;
136  VERIFY(!m.allFinite());
137  g_test_level = 0;
138  }
139  if (!(std::isnan)(m(3))) {
140  g_test_level = 1;
141  VERIFY(m.hasNaN());
142  g_test_level = 0;
143  }
144  }
145  m(3) = 0;
146  if (dryrun) {
147  std::cout << "std::isfinite(" << m(3) << ") = ";
148  check((std::isfinite)(m(3)), true);
149  std::cout << " ; numext::isfinite = ";
150  check((numext::isfinite)(m(3)), true);
151  std::cout << "\n";
152  std::cout << "std::isinf(" << m(3) << ") = ";
153  check((std::isinf)(m(3)), false);
154  std::cout << " ; numext::isinf = ";
155  check((numext::isinf)(m(3)), false);
156  std::cout << "\n";
157  std::cout << "std::isnan(" << m(3) << ") = ";
158  check((std::isnan)(m(3)), false);
159  std::cout << " ; numext::isnan = ";
160  check((numext::isnan)(m(3)), false);
161  std::cout << "\n";
162  std::cout << "allFinite: ";
163  check(m.allFinite(), 0);
164  std::cout << "\n";
165  std::cout << "hasNaN: ";
166  check(m.hasNaN(), 0);
167  std::cout << "\n";
168  std::cout << "\n\n";
169  } else {
170  if (!(std::isfinite)(m(3))) {
171  g_test_level = 1;
172  VERIFY((numext::isfinite)(m(3)));
173  g_test_level = 0;
174  }
175  if ((std::isinf)(m(3))) {
176  g_test_level = 1;
177  VERIFY(!(numext::isinf)(m(3)));
178  g_test_level = 0;
179  }
180  if ((std::isnan)(m(3))) {
181  g_test_level = 1;
182  VERIFY(!(numext::isnan)(m(3)));
183  g_test_level = 0;
184  }
185  if ((std::isfinite)(m(3))) {
186  g_test_level = 1;
187  VERIFY(!m.allFinite());
188  g_test_level = 0;
189  }
190  if ((std::isnan)(m(3))) {
191  g_test_level = 1;
192  VERIFY(!m.hasNaN());
193  g_test_level = 0;
194  }
195  }
196 }
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
#define min(a, b)
Definition: datatypes.h:22
void check(bool b, bool ref)
Definition: fastmath.cpp:12
int * m
Definition: level2_cplx_impl.h:294
#define isfinite(X)
Definition: main.h:111
#define VERIFY(a)
Definition: main.h:362
#define isnan(X)
Definition: main.h:109
#define isinf(X)
Definition: main.h:110
static int g_test_level
Definition: main.h:190

References check(), Eigen::g_test_level, isfinite, isinf, isnan, m, min, and VERIFY.

◆ EIGEN_DECLARE_TEST()

EIGEN_DECLARE_TEST ( fastmath  )
198  {
199  std::cout << "*** float *** \n\n";
200  check_inf_nan<float>(true);
201  std::cout << "*** double ***\n\n";
202  check_inf_nan<double>(true);
203  std::cout << "*** long double *** \n\n";
204  check_inf_nan<long double>(true);
205 
206  check_inf_nan<float>(false);
207  check_inf_nan<double>(false);
208  check_inf_nan<long double>(false);
209 }