OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
Public Member Functions | Public Attributes | Friends | List of all members
ossimRationalNumber Class Reference

#include <ossimRationalNumber.h>

Public Member Functions

 ossimRationalNumber ()
 
 ossimRationalNumber (ossim_int32 num, ossim_int32 den)
 
 ossimRationalNumber (ossim_int32 num)
 
double toDouble () const
 
float toFloat () const
 
void normalize ()
 
const ossimRationalNumberoperator= (ossim_int32 n)
 
const ossimRationalNumberoperator= (double n)
 
ossimRationalNumber operator- () const
 
const ossimRationalNumberoperator+= (const ossimRationalNumber &r)
 
const ossimRationalNumberoperator-= (const ossimRationalNumber &r)
 
const ossimRationalNumberoperator*= (const ossimRationalNumber &r)
 
const ossimRationalNumberoperator/= (const ossimRationalNumber &r)
 
const ossimRationalNumberoperator+= (ossim_int32 i)
 
const ossimRationalNumberoperator-= (ossim_int32 i)
 
const ossimRationalNumberoperator*= (ossim_int32 i)
 
const ossimRationalNumberoperator/= (ossim_int32 i)
 
ossimRationalNumber operator+ (const ossimRationalNumber &r) const
 
ossimRationalNumber operator- (const ossimRationalNumber &r) const
 
ossimRationalNumber operator* (const ossimRationalNumber &r) const
 
ossimRationalNumber operator/ (const ossimRationalNumber &r) const
 
ossimRationalNumber operator+ (ossim_int32 i) const
 
ossimRationalNumber operator- (ossim_int32 i) const
 
ossimRationalNumber operator* (ossim_int32 i) const
 
ossimRationalNumber operator/ (ossim_int32 i) const
 
bool operator== (const ossimRationalNumber &r) const
 
bool operator== (ossim_int32 i) const
 
const ossimRationalNumberoperator++ ()
 
const ossimRationalNumberoperator-- ()
 
const ossimRationalNumberassign (ossim_int32 n, ossim_int32 d)
 
const ossimRationalNumberassign (double value, long precision=10000)
 

Public Attributes

ossim_int32 theNum
 
ossim_int32 theDen
 

Friends

std::ostream & operator<< (std::ostream &out, const ossimRationalNumber &rhs)
 
ossimRationalNumber operator+ (ossim_int32 i, ossimRationalNumber &r)
 
ossimRationalNumber operator- (ossim_int32 i, ossimRationalNumber &r)
 
ossimRationalNumber operator* (ossim_int32 i, ossimRationalNumber &r)
 
ossimRationalNumber operator/ (ossim_int32 i, ossimRationalNumber &r)
 

Detailed Description

Definition at line 15 of file ossimRationalNumber.h.

Constructor & Destructor Documentation

◆ ossimRationalNumber() [1/3]

ossimRationalNumber::ossimRationalNumber ( )
inline

Definition at line 25 of file ossimRationalNumber.h.

Referenced by operator*(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), operator/(), and operator/=().

26  :theNum(1),
27  theDen(1)
28  {
29  }

◆ ossimRationalNumber() [2/3]

ossimRationalNumber::ossimRationalNumber ( ossim_int32  num,
ossim_int32  den 
)
inline

Definition at line 30 of file ossimRationalNumber.h.

32  :theNum(num),
33  theDen(den)
34  {
35  }

◆ ossimRationalNumber() [3/3]

ossimRationalNumber::ossimRationalNumber ( ossim_int32  num)
inline

Definition at line 36 of file ossimRationalNumber.h.

37  :theNum(num),
38  theDen(1)
39  {}

Member Function Documentation

◆ assign() [1/2]

const ossimRationalNumber & ossimRationalNumber::assign ( ossim_int32  n,
ossim_int32  d 
)
inline

Definition at line 122 of file ossimRationalNumber.h.

References n, normalize(), theDen, and theNum.

123 {
124  theNum = n;
125  theDen = d;
126  normalize();
127 
128  return *this;
129 }
os2<< "> n<< " > nendobj n

◆ assign() [2/2]

const ossimRationalNumber & ossimRationalNumber::assign ( double  value,
long  precision = 10000 
)

default estimation is out to the 10000 place. Will set this rational to a value that is close to the passed in number.

Definition at line 39 of file ossimRationalNumber.cpp.

References normalize(), and theNum.

40 {
41  ossim_sint32 s = 1;
42  if(value <= 0.0)
43  {
44  s = -1;
45  value *= -1.0;
46  }
47  ossim_int32 integerPart = (ossim_int32)std::floor(value);
48  ossim_int32 decimalPart = (ossim_int32)((value - integerPart)*precision);
49  ossimRationalNumber temp(integerPart);
50  ossimRationalNumber temp2(decimalPart, precision);
51  temp2.normalize();
52  *this = (temp + temp2);
53  theNum *= s;
54  normalize();
55  return *this;
56 }
signed int ossim_sint32
int ossim_int32

◆ normalize()

void ossimRationalNumber::normalize ( )

Definition at line 12 of file ossimRationalNumber.cpp.

References ossim::gcd(), theDen, and theNum.

Referenced by assign().

13 {
14  if (theDen == 0)
15  {
16  return;
17  }
18 
19  // Handle the case of zero separately, to avoid division by zero
20  if (theNum == 0)
21  {
22  theDen = 1;
23  return;
24  }
25 
27 
28  theNum /= g;
29  theDen /= g;
30 
31  // Ensure that the denominator is positive
32  if (theDen < 0)
33  {
34  theNum = -theNum;
35  theDen = -theDen;
36  }
37 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator*() [1/2]

ossimRationalNumber ossimRationalNumber::operator* ( const ossimRationalNumber r) const

Definition at line 197 of file ossimRationalNumber.cpp.

References ossim::gcd(), theDen, and theNum.

Referenced by operator*().

198 {
199  ossimRationalNumber result = *this;
200  // Avoid overflow and preserve normalization
201  ossim_int32 gcd1 = ossim::gcd(result.theNum, r.theDen);
202  ossim_int32 gcd2 = ossim::gcd(r.theNum, result.theDen);
203  result.theNum = (result.theNum/gcd1) * (r.theNum/gcd2);
204  result.theDen = (result.theDen/gcd2) * (r.theDen/gcd1);
205 
206  return result;
207 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator*() [2/2]

ossimRationalNumber ossimRationalNumber::operator* ( ossim_int32  i) const
inline

Definition at line 142 of file ossimRationalNumber.h.

References operator*(), and ossimRationalNumber().

143 {
144  return operator * (ossimRationalNumber(i));
145 }
ossimRationalNumber operator*(const ossimRationalNumber &r) const

◆ operator*=() [1/2]

const ossimRationalNumber & ossimRationalNumber::operator*= ( const ossimRationalNumber r)

Definition at line 102 of file ossimRationalNumber.cpp.

References ossim::gcd(), theDen, and theNum.

Referenced by operator*=().

103 {
104  // Avoid overflow and preserve normalization
105  ossim_int32 gcd1 = ossim::gcd(theNum, r.theDen);
106  ossim_int32 gcd2 = ossim::gcd(r.theNum, theDen);
107  theNum = (theNum/gcd1) * (r.theNum/gcd2);
108  theDen = (theDen/gcd2) * (r.theDen/gcd1);
109 
110  return *this;
111 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator*=() [2/2]

const ossimRationalNumber & ossimRationalNumber::operator*= ( ossim_int32  i)
inline

Definition at line 140 of file ossimRationalNumber.cpp.

References operator*=(), and ossimRationalNumber().

141 {
143 }
const ossimRationalNumber & operator*=(const ossimRationalNumber &r)

◆ operator+() [1/2]

ossimRationalNumber ossimRationalNumber::operator+ ( const ossimRationalNumber r) const

Definition at line 150 of file ossimRationalNumber.cpp.

References ossim::gcd(), ossimRationalNumber(), theDen, and theNum.

Referenced by operator+().

151 {
152  // This calculation avoids overflow, and minimises the number of expensive
153  // calculations. Thanks to Nickolay Mladenov for this algorithm.
154  //
155  // Proof:
156  // We have to compute a/b + c/d, where gcd(a,b)=1 and gcd(b,c)=1.
157  // Let g = gcd(b,d), and b = b1*g, d=d1*g. Then gcd(b1,d1)=1
158  //
159  // The result is (a*d1 + c*b1) / (b1*d1*g).
160  // Now we have to normalize this ratio.
161  // Let's assume h | gcd((a*d1 + c*b1), (b1*d1*g)), and h > 1
162  // If h | b1 then gcd(h,d1)=1 and hence h|(a*d1+c*b1) => h|a.
163  // But since gcd(a,b1)=1 we have h=1.
164  // Similarly h|d1 leads to h=1.
165  // So we have that h | gcd((a*d1 + c*b1) , (b1*d1*g)) => h|g
166  // Finally we have gcd((a*d1 + c*b1), (b1*d1*g)) = gcd((a*d1 + c*b1), g)
167  // Which proves that instead of normalizing the result, it is better to
168  // divide num and den by gcd((a*d1 + c*b1), g)
169 
171  ossim_int32 den = theDen;
172  ossim_int32 num = theNum;
173  den /= g; // = b1 from the calculations above
174  num = num * (r.theDen / g) + r.theNum * den;
175  g = ossim::gcd(num, g);
176  num /= g;
177  den *= r.theDen/g;
178 
179  return ossimRationalNumber(num, den);
180 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator+() [2/2]

ossimRationalNumber ossimRationalNumber::operator+ ( ossim_int32  i) const
inline

Definition at line 132 of file ossimRationalNumber.h.

References operator+(), and ossimRationalNumber().

133 {
134  return operator + (ossimRationalNumber(i));
135 }
ossimRationalNumber operator+(const ossimRationalNumber &r) const

◆ operator++()

const ossimRationalNumber & ossimRationalNumber::operator++ ( )
inline

Definition at line 172 of file ossimRationalNumber.h.

References theDen, and theNum.

173 {
174  theNum += theDen;
175 
176  return *this;
177 }

◆ operator+=() [1/2]

const ossimRationalNumber & ossimRationalNumber::operator+= ( const ossimRationalNumber r)

Definition at line 58 of file ossimRationalNumber.cpp.

References ossim::gcd(), theDen, and theNum.

Referenced by operator+=().

59 {
60  // This calculation avoids overflow, and minimises the number of expensive
61  // calculations. Thanks to Nickolay Mladenov for this algorithm.
62  //
63  // Proof:
64  // We have to compute a/b + c/d, where gcd(a,b)=1 and gcd(b,c)=1.
65  // Let g = gcd(b,d), and b = b1*g, d=d1*g. Then gcd(b1,d1)=1
66  //
67  // The result is (a*d1 + c*b1) / (b1*d1*g).
68  // Now we have to normalize this ratio.
69  // Let's assume h | gcd((a*d1 + c*b1), (b1*d1*g)), and h > 1
70  // If h | b1 then gcd(h,d1)=1 and hence h|(a*d1+c*b1) => h|a.
71  // But since gcd(a,b1)=1 we have h=1.
72  // Similarly h|d1 leads to h=1.
73  // So we have that h | gcd((a*d1 + c*b1) , (b1*d1*g)) => h|g
74  // Finally we have gcd((a*d1 + c*b1), (b1*d1*g)) = gcd((a*d1 + c*b1), g)
75  // Which proves that instead of normalizing the result, it is better to
76  // divide num and den by gcd((a*d1 + c*b1), g)
77 
79  theDen /= g; // = b1 from the calculations above
80  theNum = theNum * (r.theDen / g) + r.theNum * theDen;
81  g = ossim::gcd(theNum, g);
82  theNum /= g;
83  theDen *= r.theDen/g;
84 
85  return *this;
86 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator+=() [2/2]

const ossimRationalNumber & ossimRationalNumber::operator+= ( ossim_int32  i)
inline

Definition at line 130 of file ossimRationalNumber.cpp.

References operator+=(), and ossimRationalNumber().

131 {
133 }
const ossimRationalNumber & operator+=(const ossimRationalNumber &r)

◆ operator-() [1/3]

ossimRationalNumber ossimRationalNumber::operator- ( ) const
inline

Definition at line 63 of file ossimRationalNumber.h.

Referenced by operator-().

◆ operator-() [2/3]

ossimRationalNumber ossimRationalNumber::operator- ( const ossimRationalNumber r) const

Definition at line 182 of file ossimRationalNumber.cpp.

References ossim::gcd(), theDen, and theNum.

183 {
184  ossimRationalNumber result = *this;
185  // This calculation avoids overflow, and minimises the number of expensive
186  // calculations. It corresponds exactly to the += case above
187  ossim_int32 g = ossim::gcd(result.theDen, r.theDen);
188  result.theDen /= g;
189  result.theNum = result.theNum * (r.theDen / g) - r.theNum * result.theDen;
190  g = ossim::gcd(result.theNum, g);
191  result.theNum /= g;
192  result.theDen *= r.theDen/g;
193 
194  return result;
195 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator-() [3/3]

ossimRationalNumber ossimRationalNumber::operator- ( ossim_int32  i) const
inline

Definition at line 137 of file ossimRationalNumber.h.

References operator-(), and ossimRationalNumber().

138 {
139  return operator - (ossimRationalNumber(i));
140 }
ossimRationalNumber operator-() const

◆ operator--()

const ossimRationalNumber & ossimRationalNumber::operator-- ( )
inline

Definition at line 179 of file ossimRationalNumber.h.

References theDen, and theNum.

180 {
181  theNum -= theDen;
182 
183  return *this;
184 }

◆ operator-=() [1/2]

const ossimRationalNumber & ossimRationalNumber::operator-= ( const ossimRationalNumber r)

Definition at line 88 of file ossimRationalNumber.cpp.

References ossim::gcd(), theDen, and theNum.

Referenced by operator-=().

89 {
90  // This calculation avoids overflow, and minimises the number of expensive
91  // calculations. It corresponds exactly to the += case above
93  theDen /= g;
94  theNum = theNum * (r.theDen / g) - r.theNum * theDen;
95  g = ossim::gcd(theNum, g);
96  theNum /= g;
97  theDen *= r.theDen/g;
98 
99  return *this;
100 }
int ossim_int32
IntType gcd(IntType n, IntType m)
Definition: ossimCommon.h:271

◆ operator-=() [2/2]

const ossimRationalNumber & ossimRationalNumber::operator-= ( ossim_int32  i)
inline

Definition at line 135 of file ossimRationalNumber.cpp.

References operator-=(), and ossimRationalNumber().

136 {
138 }
const ossimRationalNumber & operator-=(const ossimRationalNumber &r)

◆ operator/() [1/2]

ossimRationalNumber ossimRationalNumber::operator/ ( const ossimRationalNumber r) const

Definition at line 209 of file ossimRationalNumber.cpp.

References OSSIM_INT_NAN, ossimRationalNumber(), theDen, and theNum.

Referenced by operator/().

210 {
211  ossim_int32 zero(0);
212 
213  if (r.theNum == zero)
214  {
216  }
217 
218  return (*this)*(ossimRationalNumber(r.theDen, r.theNum));
219 }
#define OSSIM_INT_NAN
int ossim_int32

◆ operator/() [2/2]

ossimRationalNumber ossimRationalNumber::operator/ ( ossim_int32  i) const
inline

Definition at line 147 of file ossimRationalNumber.h.

References operator/(), and ossimRationalNumber().

148 {
149  return operator / (ossimRationalNumber(i));
150 }
ossimRationalNumber operator/(const ossimRationalNumber &r) const

◆ operator/=() [1/2]

const ossimRationalNumber & ossimRationalNumber::operator/= ( const ossimRationalNumber r)

Definition at line 113 of file ossimRationalNumber.cpp.

References OSSIM_INT_NAN, ossimRationalNumber(), theDen, and theNum.

Referenced by operator/=().

114 {
115  ossim_int32 zero(0);
116 
117  if (r.theNum == zero)
118  {
121 
122  return *this;
123  }
124  *this = (*this)*(ossimRationalNumber(r.theDen, r.theNum));
125 
126  return *this;
127 }
#define OSSIM_INT_NAN
int ossim_int32

◆ operator/=() [2/2]

const ossimRationalNumber & ossimRationalNumber::operator/= ( ossim_int32  i)
inline

Definition at line 145 of file ossimRationalNumber.cpp.

References operator/=(), and ossimRationalNumber().

146 {
148 }
const ossimRationalNumber & operator/=(const ossimRationalNumber &r)

◆ operator=() [1/2]

const ossimRationalNumber& ossimRationalNumber::operator= ( ossim_int32  n)
inline

Definition at line 53 of file ossimRationalNumber.h.

References n.

54  {
55  return assign(n, 1);
56  }
const ossimRationalNumber & assign(ossim_int32 n, ossim_int32 d)
os2<< "> n<< " > nendobj n

◆ operator=() [2/2]

const ossimRationalNumber& ossimRationalNumber::operator= ( double  n)
inline

Definition at line 58 of file ossimRationalNumber.h.

References n.

59  {
60  return assign(n);
61  }
const ossimRationalNumber & assign(ossim_int32 n, ossim_int32 d)
os2<< "> n<< " > nendobj n

◆ operator==() [1/2]

bool ossimRationalNumber::operator== ( const ossimRationalNumber r) const
inline

Definition at line 186 of file ossimRationalNumber.h.

References theDen, and theNum.

187 {
188  return ((theNum == r.theNum) && (theDen == r.theDen));
189 }

◆ operator==() [2/2]

bool ossimRationalNumber::operator== ( ossim_int32  i) const
inline

Definition at line 191 of file ossimRationalNumber.h.

References theDen, and theNum.

192 {
193  return ((theDen == ossim_int32(1)) && (theNum == i));
194 }
int ossim_int32

◆ toDouble()

double ossimRationalNumber::toDouble ( ) const
inline

Definition at line 40 of file ossimRationalNumber.h.

41  {
42  return (static_cast<double>(theNum)/
43  static_cast<double>(theDen));
44  }

◆ toFloat()

float ossimRationalNumber::toFloat ( ) const
inline

Definition at line 45 of file ossimRationalNumber.h.

46  {
47  return (static_cast<float>(theNum)/
48  static_cast<float>(theDen));
49  }

Friends And Related Function Documentation

◆ operator*

ossimRationalNumber operator* ( ossim_int32  i,
ossimRationalNumber r 
)
friend

Definition at line 162 of file ossimRationalNumber.h.

163 {
164  return ossimRationalNumber(i)*r;
165 }

◆ operator+

ossimRationalNumber operator+ ( ossim_int32  i,
ossimRationalNumber r 
)
friend

Definition at line 152 of file ossimRationalNumber.h.

153 {
154  return ossimRationalNumber(i)+r;
155 }

◆ operator-

ossimRationalNumber operator- ( ossim_int32  i,
ossimRationalNumber r 
)
friend

Definition at line 157 of file ossimRationalNumber.h.

158 {
159  return ossimRationalNumber(i)-r;
160 }

◆ operator/

ossimRationalNumber operator/ ( ossim_int32  i,
ossimRationalNumber r 
)
friend

Definition at line 167 of file ossimRationalNumber.h.

168 {
169  return ossimRationalNumber(i)/r;
170 }

◆ operator<<

std::ostream& operator<< ( std::ostream &  out,
const ossimRationalNumber rhs 
)
friend

Definition at line 19 of file ossimRationalNumber.h.

20  {
21  out<<rhs.theNum << "/" << rhs.theDen;
22 
23  return out;
24  }

Member Data Documentation

◆ theDen

ossim_int32 ossimRationalNumber::theDen

◆ theNum

ossim_int32 ossimRationalNumber::theNum

The documentation for this class was generated from the following files: