OpendTect  6.3
math2_inc.h
Go to the documentation of this file.
1 /*+
2  * (C) dGB Beheer B.V.; (LICENSE) http://opendtect.org/OpendTect_license.txt
3  * AUTHOR : A.H. Bril
4  * DATE : Jan 2008
5 -*/
6 
7 
8 bool Math::IsNormalNumber( mTYPE x )
9 {
10 #ifdef __win__
11  return finite( x );
12 #else
13  return std::isfinite( x );
14 #endif
15 }
16 
17 
18 mTYPE Math::ACos( mTYPE c )
19 {
20  return (mTYPE) c >= 1 ? 0 : (c <= -1 ? mTYPE(M_PI) : acos( c ));
21 }
22 
23 
24 mTYPE Math::ASin( mTYPE s )
25 {
26  return (mTYPE) s >= 1 ? mTYPE(M_PI_2)
27  : (s <= -1 ? -mTYPE(M_PI_2) : asin( s ));
28 }
29 
30 
31 mTYPE Math::Log( mTYPE s )
32 {
33  return (mTYPE) s <= 0 ? mUdf(mTYPE) : log( s );
34 }
35 
36 
37 mTYPE Math::Log10( mTYPE s )
38 {
39  return (mTYPE) s <= 0 ? mUdf(mTYPE) : log10( s );
40 }
41 
42 
43 mTYPE Math::Sqrt( mTYPE s )
44 {
45  //A bit silly bu the space before the parantesis
46  //makes it avoid the sqrt test.
47  return (mTYPE) s <= 0 ? 0 : sqrt ( s );
48 }
49 
50 mTYPE Math::toDB( mTYPE s )
51 {
52  return (mTYPE) s <= 0 ? mUdf(mTYPE) : 20*log10( s );
53 }
54 
55 
56 mTYPE Math::PowerOf( mTYPE x, mTYPE y )
57 {
58  if ( mIsUdf(x) || mIsUdf(y) )
59  return x;
60 
61  if ( x == 0 )
62  return (mTYPE) (y ? 0 : 1);
63 
64  const bool isneg = x < 0 ? 1 : 0;
65  if ( isneg ) x = -x;
66 
67  mTYPE ret = exp( y * log(x) );
68  return isneg ? -ret : ret;
69 }
70 
71 
72 mTYPE Math::IntPowerOf( mTYPE x, int y )
73 {
74  if ( mIsUdf(x) )
75  return mUdf(mTYPE);
76 
77  if ( x == 0 )
78  return y ? (mTYPE)0 : (mTYPE)1;
79 
80  if ( x > 1.5 || x < -1.5 )
81  {
82  if ( y > 150 ) return mUdf(mTYPE);
83  if ( y < -150 ) return (mTYPE) 0;
84  if ( x > 1.99 || x < -1.99 )
85  {
86  if ( y > 100 ) return mUdf(mTYPE);
87  if ( y < -100 ) return (mTYPE) 0;
88  }
89  }
90  else if ( x < 0.5 && x > -0.5 )
91  {
92  if ( y > 100 ) return (mTYPE) 0;
93  if ( y < -100 ) return (mTYPE) 1;
94  }
95 
96  mTYPE ret = 1;
97  while ( y )
98  {
99  if ( y > 0 )
100  { ret *= x; y--; }
101  else
102  { ret /= x; y++; }
103  }
104  return ret;
105 }
106 
107 
108 mTYPE Math::BesselI0( mTYPE x )
109 {
110  if ( mIsUdf(x) )
111  return mUdf(mTYPE);
112 
113  double xx = (mTYPE)x;
114  xx *= xx;
115  double s = 1.;
116  double ds = 1.;
117  double d = 0.;
118  while ( ds > s * DBL_EPSILON )
119  {
120  d += 2.;
121  ds *= xx / ( d*d );
122  s += ds;
123  }
124 
125  return (mTYPE)s;
126 }
float PowerOf(float, float)
#define mIsUdf(val)
Use mIsUdf to check for undefinedness of simple types.
Definition: undefval.h:285
float ACos(float)
float ASin(float)
float Log10(float)
#define M_PI
Definition: commondefs.h:66
float toDB(float)
#define mUdf(type)
Use this macro to get the undefined for simple types.
Definition: undefval.h:270
#define finite
Definition: msvcdefs.h:40
float Log(float)
#define M_PI_2
Definition: commondefs.h:75
bool IsNormalNumber(float)
float Sqrt(float)
iT IntPowerOf(iT i, iPOW p)
Definition: math2.h:126
float BesselI0(float)

Generated at for the OpendTect seismic interpretation project. Copyright (C): dGB Beheer B. V. 2017