00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _SCL_MPF_H_
00009 #define _SCL_MPF_H_
00010
00011 #include <string>
00012 #include <iostream>
00013 #include <gmp.h>
00014 #include <realroot/scalar.hpp>
00015
00016 namespace mmx {
00017
00018 typedef __mpf_struct MPF;
00019
00020
00021
00022
00023 template<> inline
00024 void scalar<MPF>::init ( ) {mpf_init(&rep());}
00025
00026 template<> inline
00027 scalar<MPF>::scalar ( ) {
00028
00029 mpf_init(&rep());}
00030
00031 template<> inline
00032 scalar<MPF>::scalar(const scalar<MPF>& rhs)
00033 {
00034
00035 mpf_init_set(&rep(),&rhs.rep());
00036 }
00037
00038 template<> inline
00039 scalar<MPF>& scalar<MPF>::operator = (const scalar<MPF>& rhs)
00040 {
00041 if (this != &rhs) {
00042 mpf_set(&rep(), &rhs.rep());
00043 }
00044 return *this;
00045 }
00046
00047 template<> inline
00048 scalar<MPF>::scalar (signed long int sl) {mpf_init_set_si(&rep(),sl);}
00049
00050 template<> inline
00051 scalar<MPF>::scalar (unsigned long int ul) {mpf_init_set_ui(&rep(),ul);}
00052
00053 template<> inline
00054 scalar<MPF>::scalar (int si) {
00055
00056 mpf_init_set_si(&rep(), si);}
00057
00058 template<> inline
00059 scalar<MPF>::scalar (const char *string, unsigned int base)
00060 {
00061 if (mpf_init_set_str(&rep(), string, base))
00062 std::cerr << "scalar<MPF>: The string " << string
00063 << " is not a valid number in base " << base << std::endl;
00064 }
00065 template<> inline
00066 scalar<MPF>::scalar (double d)
00067 {
00068
00069 mpf_init_set_d(&rep(),d);
00070 }
00071
00072 template<> inline scalar<MPF>::~scalar (){mpf_clear(&rep());}
00073
00074 template<> inline
00075 bool scalar<MPF>::operator == (const scalar<MPF>& rhs) const
00076 {
00077 return mpf_cmp(&rep(), &rhs.rep()) == 0;
00078 }
00079
00080 template<> inline
00081 bool scalar<MPF>::operator == (long sl) const {
00082 return mpf_cmp_si(&rep(), sl) == 0;
00083 }
00084
00085 template<> inline
00086 bool scalar<MPF>::operator == (int si) const {
00087 return mpf_cmp_si(&rep(), (long) si) == 0;
00088 }
00089
00090 template<> inline
00091 bool scalar<MPF>::operator == (unsigned long ul) const
00092 {
00093 return mpf_cmp_ui(&rep(), ul) == 0;
00094 }
00095
00096
00097 template<> inline
00098 bool scalar<MPF>::operator != (const scalar<MPF>& rhs) const
00099 {
00100 return mpf_cmp(&rep(), &rhs.rep()) != 0;
00101 }
00102
00103 template<> inline
00104 bool scalar<MPF>::operator != (long sl) const {
00105 return mpf_cmp_si(&rep(), sl) != 0;
00106 }
00107
00108 template<> inline
00109 bool scalar<MPF>::operator != (int si) const {
00110 return mpf_cmp_si(&rep(), (long) si) != 0;
00111 }
00112
00113 template<> inline
00114 bool scalar<MPF>::operator != (unsigned long ul) const
00115 {
00116 return mpf_cmp_ui(&rep(), ul) != 0;
00117 }
00118
00119 template<> inline
00120 bool scalar<MPF>::operator > (const scalar<MPF>& rhs) const
00121 {
00122 return mpf_cmp(&rep(), &rhs.rep()) > 0;
00123 }
00124
00125 template<> inline
00126 bool scalar<MPF>::operator > (long sl) const {
00127 return mpf_cmp_si(&rep(), sl) > 0;
00128 }
00129
00130 template<> inline
00131 bool scalar<MPF>::operator > (int si) const {
00132 return mpf_cmp_si(&rep(), (long) si) > 0;
00133 }
00134
00135 template<> inline
00136 bool scalar<MPF>::operator > (unsigned long ul) const
00137 {
00138 return mpf_cmp_ui(&rep(), ul) > 0;
00139 }
00140
00141 template<> inline
00142 bool scalar<MPF>::operator >= (const scalar<MPF>& rhs) const
00143 {
00144 return mpf_cmp(&rep(), &rhs.rep()) >= 0;
00145 }
00146
00147 template<> inline
00148 bool scalar<MPF>::operator >= (long sl) const {
00149 return mpf_cmp_si(&rep(), sl) >= 0;
00150 }
00151
00152 template<> inline
00153 bool scalar<MPF>::operator >= (int si) const
00154 {
00155 return mpf_cmp_si(&rep(), (long) si) >= 0;
00156 }
00157
00158 template<> inline
00159 bool scalar<MPF>::operator >= (unsigned long ul) const
00160 {
00161 return mpf_cmp_ui(&rep(), ul) >= 0;
00162 }
00163
00164
00165 template<> inline
00166 bool scalar<MPF>::operator < (const scalar<MPF>& rhs) const
00167 {
00168 return mpf_cmp(&rep(), &rhs.rep()) < 0;
00169 }
00170
00171 template<> inline
00172 bool scalar<MPF>::operator < (long sl) const {
00173 return mpf_cmp_si(&rep(), sl) < 0;
00174 }
00175
00176 template<> inline
00177 bool scalar<MPF>::operator < (int si) const
00178 {
00179 return mpf_cmp_si(&rep(), (long) si) < 0;
00180 }
00181
00182 template<> inline
00183 bool scalar<MPF>::operator < (unsigned long ul) const
00184 {
00185 return mpf_cmp_ui(&rep(), ul) < 0;
00186 }
00187
00188
00189
00190 template<> inline
00191 bool scalar<MPF>::operator <= (const scalar<MPF>& rhs) const
00192 {
00193 return mpf_cmp(&rep(), &rhs.rep()) <= 0;
00194 }
00195
00196 template<> inline
00197 bool scalar<MPF>::operator <= (long sl) const {
00198 return mpf_cmp_si(&rep(), sl) <= 0;
00199 }
00200
00201 template<> inline
00202 bool scalar<MPF>::operator <= (int si) const
00203 {
00204 return mpf_cmp_si(&rep(), (long) si) <= 0;
00205 }
00206
00207 template<> inline
00208 bool scalar<MPF>::operator <= (unsigned long ul) const
00209 {
00210 return mpf_cmp_ui(&rep(), ul) <= 0;
00211 }
00212
00213
00214 template<> inline
00215 scalar<MPF>& scalar<MPF>::operator = (unsigned long ul)
00216 {
00217 mpf_set_ui(&rep(), ul); return *this;
00218 }
00219
00220 template<> inline
00221 scalar<MPF>& scalar<MPF>::operator = (long sl)
00222 {
00223 mpf_set_si(&rep(), sl); return *this;
00224 }
00225
00226 template<> inline
00227 scalar<MPF>& scalar<MPF>::operator = (int ul)
00228 {
00229 mpf_set_si(&rep(), ul); return *this;
00230 }
00231
00232 template<> inline
00233 scalar<MPF>& scalar<MPF>::operator += (const scalar<MPF>& rhs)
00234 {
00235 scalar<MPF> tmp;
00236
00237 mpf_add(&tmp.rep(), &rep(), &rhs.rep());
00238 mpf_swap(&tmp.rep(),&rep());
00239 return *this;
00240
00241 }
00242
00243 template<> inline
00244 scalar<MPF>& scalar<MPF>::operator += (unsigned long ul)
00245 {
00246 mpf_add_ui(&rep(), &rep(), ul); return *this;
00247 }
00248
00249 template<> inline
00250 scalar<MPF>& scalar<MPF>::operator += (long sl)
00251 {
00252 if (sl >= 0)
00253 mpf_add_ui(&rep(), &rep(), (unsigned long) sl);
00254 else
00255 mpf_sub_ui(&rep(), &rep(), ((unsigned long) -sl));
00256 return *this;
00257 }
00258
00259 template<> inline
00260 scalar<MPF>& scalar<MPF>::operator += (int ul)
00261 {
00262 *this += scalar<MPF>(ul); return *this;
00263 }
00264
00265
00266 template<> inline
00267 scalar<MPF>& scalar<MPF>::operator -= (const scalar<MPF>& rhs)
00268 {
00269 mpf_sub(&rep(), &rep(), &rhs.rep()); return *this;
00270 }
00271
00272 template<> inline
00273 scalar<MPF>& scalar<MPF>::operator -= (unsigned long ul)
00274 {
00275 mpf_sub_ui(&rep(), &rep(), ul); return *this;
00276 }
00277
00278 template<> inline
00279 scalar<MPF>& scalar<MPF>::operator -= (long sl)
00280 {
00281 if (sl >= 0)
00282 mpf_sub_ui(&rep(), &rep(), (unsigned long) sl);
00283 else
00284 mpf_add_ui(&rep(), &rep(), (unsigned long) sl);
00285 return *this;
00286 }
00287
00288 template<> inline
00289 scalar<MPF>& scalar<MPF>::operator -= (int ul)
00290 {
00291 *this -= scalar<MPF>(ul); return *this;
00292 }
00293
00294 template<> inline
00295 scalar<MPF>& scalar<MPF>::operator *= (const scalar<MPF>& rhs)
00296 {
00297 mpf_mul(&rep(), &rep(), &rhs.rep()); return *this;
00298 }
00299 template<> inline
00300 scalar<MPF>& scalar<MPF>::operator *= (unsigned long ul)
00301 {
00302 mpf_mul_ui(&rep(), &rep(), ul); return *this;
00303 }
00304 template<> inline
00305 scalar<MPF>& scalar<MPF>::operator *= (long sl)
00306 {
00307 if (sl >= 0)
00308 mpf_mul_ui(&rep(), &rep(), (unsigned long) sl);
00309 else
00310 {
00311 mpf_neg(&rep(),&rep());
00312 mpf_mul_ui(&rep(), &rep(),(unsigned long)(-sl));
00313 }
00314 return *this;
00315 }
00316 template<> inline
00317 scalar<MPF>& scalar<MPF>::operator *= (double d)
00318 {
00319 return *this*=(scalar<MPF>)d;
00320 }
00321
00322 template<> inline
00323 scalar<MPF>& scalar<MPF>::operator *= (int ul)
00324 {
00325 if (ul >= 0)
00326 mpf_mul_ui(&rep(), &rep(), (unsigned long) ul);
00327 else {
00328 mpf_mul_ui(&rep(), &rep(), (unsigned long) (-ul));
00329 mpf_neg(&rep(), &rep());
00330 }
00331 return *this;
00332 }
00333
00334 template<> inline
00335 scalar<MPF>& scalar<MPF>::operator /= (const scalar<MPF>& rhs)
00336 {
00337 mpf_div(&rep(), &rep(), &rhs.rep());
00338
00339 return *this;
00340 }
00341 template<> inline
00342 scalar<MPF>& scalar<MPF>::operator /= (unsigned long ul)
00343 {
00344 mpf_div_ui(&rep(), &rep(), ul); return *this;
00345 }
00346
00347 template<> inline
00348 scalar<MPF>& scalar<MPF>::operator /= (long sl)
00349 {
00350 if (sl >= 0)
00351 mpf_div_ui(&rep(), &rep(), (unsigned long) sl);
00352 else
00353 {
00354 mpf_neg(&rep(),&rep());
00355 mpf_div_ui(&rep(), &rep(), ((unsigned long) -sl));
00356 }
00357 return *this;
00358 }
00359 template<> inline
00360 scalar<MPF>& scalar<MPF>::operator /= (int sl)
00361 {
00362 if (sl >= 0)
00363 mpf_div_ui(&rep(), &rep(), (unsigned long) sl);
00364 else
00365 {
00366 mpf_neg(&rep(),&rep());
00367 mpf_div_ui(&rep(), &rep(), ((unsigned long) -sl));
00368 }
00369 return *this;
00370 }
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381 inline
00382 scalar<MPF> operator +(const scalar<MPF>& a1, const scalar<MPF>& a2)
00383 {
00384 scalar<MPF> result;
00385 mpf_add(&result.rep(), &a1.rep(), &a2.rep());
00386 return result;
00387 }
00388
00389 inline
00390 scalar<MPF> operator -(const scalar<MPF>& a1, const scalar<MPF>& a2)
00391 {
00392 scalar<MPF> result;
00393 mpf_sub(&result.rep(),&a1.rep(), &a2.rep());
00394 return result;
00395 }
00396
00397 inline
00398 scalar<MPF> operator -(const scalar<MPF>& a1)
00399 {
00400 scalar<MPF> r; mpf_neg(&r.rep(), &a1.rep()); return r;
00401 }
00402
00403 inline
00404 scalar<MPF> operator *(const scalar<MPF>& a1, const scalar<MPF>& a2)
00405 {
00406 scalar<MPF> result;
00407 mpf_mul(&result.rep(), &a1.rep(), &a2.rep());
00408 return result;
00409 }
00410
00411 inline
00412 scalar<MPF> operator /(const scalar<MPF>& a1, const scalar<MPF>& a2)
00413 {
00414 scalar<MPF> result;
00415 mpf_div(&result.rep(), &a1.rep(), &a2.rep());
00416 return result;
00417 }
00418
00420 template<> inline
00421 void scalar<MPF>::operator ++ ( )
00422 {
00423 mpf_add_ui(&rep(), &rep(), 1);
00424 }
00425
00427 template<> inline
00428 void scalar<MPF>::operator -- ( )
00429 {
00430 mpf_sub_ui(&rep(), &rep(), 1);
00431 }
00432
00433 inline void convert(scalar<MPF>& n, char *s)
00434 {
00435
00436 mpf_init_set_str(&n.rep(), s, 10);
00437
00438 }
00439
00440
00441
00442 inline
00443 std::ostream& operator << (std::ostream& os, const scalar<MPF>& b)
00444 {
00445 double temp;
00446 temp=mpf_get_d(&b.rep());
00447 os<<temp;
00448
00449 return os;
00450 }
00451
00452 inline
00453 std::istream& operator >> (std::istream& is, scalar<MPF>& b)
00454 {
00455 std::string s;is >> s;
00456 mpf_init_set_str(&b.rep(),s.c_str(), 10);
00457 return is;
00458 }
00459
00460
00461
00465 inline void Precision(unsigned long l)
00466 {
00467 mpf_set_default_prec(l);
00468 }
00469
00473 inline void Precision( scalar<MPF>& b, unsigned long l)
00474 {
00475 mpf_set_prec(&b.rep(),l);
00476 }
00477
00478 template<> inline
00479 void scalar<MPF>::Div2Exp (unsigned long exponent_of_2)
00480 {
00481 mpf_div_2exp(&rep(), &rep(), exponent_of_2);
00482 }
00483
00484 template<> inline void
00485 scalar<MPF>::abs ( )
00486 {
00487 if (mpf_sgn(&rep()) < 0)
00488 mpf_neg(&rep(),&rep());
00489 }
00490
00491 template<> inline
00492 scalar<MPF>& scalar<MPF>::negate ( )
00493 {
00494 mpf_neg(&rep(),&rep());
00495
00496 return *this;
00497 }
00498
00499 template<> inline
00500 void scalar<MPF>::sqrt ( )
00501 {
00502 mpf_sqrt(&rep(), &rep());
00503 }
00504
00505
00506 inline size_t log (const scalar<MPF>& b)
00507 {
00508 return mpf_size(&b.rep());
00509 }
00510
00511 inline int sign (const scalar<MPF>& b)
00512 {
00513 return mpf_sgn(&b.rep());
00514 }
00515
00516 inline int compare (const scalar<MPF>& b1, const scalar<MPF>& b2)
00517 {
00518 return mpf_cmp(&b1.rep(), &b2.rep());
00519 }
00520
00521 inline int compare (const scalar<MPF>& b, unsigned long ul)
00522 {
00523 return mpf_cmp_ui(&b.rep(), ul);
00524 }
00525
00526 inline int compare (const scalar<MPF>& b, long sl)
00527 {
00528 return mpf_cmp_si(&b.rep(), sl);
00529 }
00530
00531
00532
00533
00534
00535
00536
00537 inline void assign(double& r, const scalar<MPF>& z ) { r = mpf_get_d(&z.rep()); };
00538 inline void assign(scalar<MPF>& r, double d ) { mpf_set_d(&r.rep(),d); }
00539
00540 }
00541
00542 #endif // //SCL_MPF_H