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

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