utils.cpp
1 #include "utils.hpp"
2 #if defined(_MSC_VER)
3 /* Microsoft C/C++-compatible compiler */
4 #include <intrin.h>
5 #else
6 #include <x86intrin.h>
7 #endif
8 #include <cfloat>
9 #include <cmath>
10 
11 double fastsqrt(double x)
12 {
13  if (x<static_cast<double>(FLT_MIN) || x > static_cast<double>(FLT_MAX))
14  return std::sqrt(x);
15  double res = static_cast<double>(_mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(static_cast<float>(x)))));
16  return x*res*(1.5 - 0.5*res*res*x);
17 }
18 
19 bool is_nan(double x)
20 {
21  int b1 = (x>=0);
22  int b2 = (x<0);
23  return (1 != b1+b2);
24 }
25 
26 vector<double> linspace(double xl, double xh, int n)
27 {
28  vector<double> res(static_cast<size_t>(n),0);
29  for(size_t i=0;i<size_t(n);++i)
30  res[i] = xl + (xh-xl)*static_cast<double>(i)/
31  static_cast<double>(n-1);
32  return res;
33 }
34 
35 vector<double> arange(double x_min, double x_max, double dx)
36 {
37  assert((x_max-x_min)/dx>0 && "dx has wrong sign");
38  vector<double> res;
39  for(double x=x_min;x<x_max;x+=dx)
40  res.push_back(x);
41  return res;
42 }
43 
44 double min(vector<double> const& v)
45 {
46  double res = v[0];
47  for(size_t i=1;i<v.size();++i)
48  res = std::min(res,v[size_t(i)]);
49  return res;
50 }
51 
52 double max(vector<double> const& v)
53 {
54  double res = v[0];
55  for(size_t i=1;i<v.size();++i)
56  res = std::max(res,v[size_t(i)]);
57  return res;
58 }
Various useful functions.
double max(vector< double > const &v)
returns the maximal term in a vector
Definition: utils.cpp:52
double fastsqrt(double x)
Fast approximate sqrt.
Definition: utils.cpp:11
vector< double > linspace(double xl, double xh, int n)
Uniformly spaced array (like the matlab function with the same name)
Definition: utils.cpp:26
double min(vector< double > const &v)
Returns the minimal term in a vector.
Definition: utils.cpp:44
vector< double > arange(double x_min, double x_max, double dx)
Uniformly spaced array (line numpy function with the same name)
Definition: utils.cpp:35
bool is_nan(double x)
Checks whether a number is a nan.
Definition: utils.cpp:19