Advertisement
Guest User

Untitled

a guest
Nov 29th, 2012
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.64 KB | None | 0 0
  1. mpf_class2.h:
  2.  
  3.  
  4. #pragma once
  5.  
  6. extern "C++" {
  7. #include <gmpxx.h>
  8. }
  9. #include<string>
  10. /*
  11. Extension class for mpf_class2
  12. by: Quincy Lam
  13. mpf_class already implements:
  14. - operator=
  15. */
  16.  
  17. class mpf_class2 : public mpf_class
  18. {
  19.     /*
  20.     Wraps mpf_t in operator overloads
  21.     Written by Quincy Lam
  22.     Defining a copy constructor shall break bu_log
  23.     */
  24. public:
  25.  
  26.     mpf_class2(double d);
  27.     mpf_class2(signed long sl);
  28.     mpf_class2(signed si);
  29.     mpf_class2(const mpf_class2& c);
  30.  
  31.     mpf_class2& operator+=(const mpf_class2& rhs);
  32.     mpf_class2& operator+=(unsigned long rhs);
  33.     mpf_class2& operator+=(double rhs);
  34.     const mpf_class2 operator+(const mpf_class2& rhs) const;
  35.     mpf_class2& operator-=(const mpf_class2& rhs);
  36.     mpf_class2& operator-=(unsigned long rhs);
  37.     mpf_class2& operator-=(double rhs);
  38.     const mpf_class2 operator-(const mpf_class2& rhs) const;
  39.     mpf_class2& operator*=(const mpf_class2& rhs);
  40.     mpf_class2& operator*=(unsigned long rhs);
  41.     mpf_class2& operator*=(double rhs);
  42.     const mpf_class2 operator*(const mpf_class2& rhs) const;
  43.     mpf_class2& operator/=(const mpf_class2& rhs);
  44.     mpf_class2& operator/=(unsigned long rhs);
  45.     mpf_class2& operator/=(double rhs);
  46.     const mpf_class2 operator/(const mpf_class2& rhs) const;
  47.     mpf_class2& operator=(const mpf_class2& rhs);
  48.     mpf_class2& operator=(signed long rhs);
  49.     mpf_class2& operator=(unsigned long rhs);
  50.     mpf_class2& operator=(double rhs);
  51.     bool operator==(const mpf_class2& rhs) const;
  52.     bool operator!=(const mpf_class2& rhs) const;
  53.     bool operator<(const mpf_class2& rhs) const;
  54.     bool operator>(const mpf_class2& rhs) const;
  55.     bool operator<=(const mpf_class2& rhs) const;
  56.     bool operator>=(const mpf_class2& rhs) const;
  57.     const mpf_class2 operator-() const;
  58.  
  59.     operator double() const;
  60.     operator std::string() const;
  61.     /*
  62.     operator signed long() const;
  63.     */
  64.     static const long precision;
  65. };
  66.  
  67.  
  68. mpf_class2.cpp:
  69.  
  70.  
  71. #include "mpf_class2.h"
  72. const long mpf_class2::precision = 8*500;
  73.  
  74.  
  75. mpf_class2& mpf_class2::operator+=(const mpf_class2& rhs)
  76. {
  77.     mpf_add(get_mpf_t(), get_mpf_t(), rhs.get_mpf_t());
  78.     return *this;
  79. }
  80.  
  81. mpf_class2& mpf_class2::operator+=(unsigned long rhs)
  82. {
  83.     mpf_add_ui(get_mpf_t(), get_mpf_t(), rhs);
  84.     return *this;
  85. }
  86.  
  87. mpf_class2& mpf_class2::operator+=(double rhs)
  88. {
  89.     operator+=(mpf_class2(rhs));
  90.     return *this;
  91. }
  92.  
  93. const mpf_class2 mpf_class2::operator+(const mpf_class2& rhs) const
  94. {
  95.     mpf_class2 r(*this);
  96.     r += rhs;
  97.     return r;
  98. }
  99.  
  100. mpf_class2& mpf_class2::operator-=(const mpf_class2& rhs)
  101. {
  102.     mpf_sub(get_mpf_t(), get_mpf_t(), rhs.get_mpf_t());
  103.     return *this;
  104. }
  105.  
  106. mpf_class2& mpf_class2::operator-=(unsigned long rhs)
  107. {
  108.     mpf_sub_ui(get_mpf_t(), get_mpf_t(), rhs);
  109.     return *this;
  110. }
  111.  
  112. mpf_class2& mpf_class2::operator-=(double rhs)
  113. {
  114.     operator-=(mpf_class2(rhs));
  115.     return *this;
  116. }
  117.  
  118. const mpf_class2 mpf_class2::operator-(const mpf_class2& rhs) const
  119. {
  120.     mpf_class2 r(*this);
  121.     r -= rhs;
  122.     return r;
  123. }
  124.  
  125.  
  126. mpf_class2& mpf_class2::operator*=(const mpf_class2& rhs)
  127. {
  128.     mpf_mul(get_mpf_t(), get_mpf_t(), rhs.get_mpf_t());
  129.     return *this;
  130. }
  131.  
  132. mpf_class2& mpf_class2::operator*=(unsigned long rhs)
  133. {
  134.     mpf_mul_ui(get_mpf_t(), get_mpf_t(), rhs);
  135.     return *this;
  136. }
  137.  
  138. mpf_class2& mpf_class2::operator*=(double rhs)
  139. {
  140.     operator*=(mpf_class2(rhs));
  141.     return *this;
  142. }
  143.  
  144. const mpf_class2 mpf_class2::operator*(const mpf_class2& rhs) const
  145. {
  146.     mpf_class2 r(*this);
  147.     r *= rhs;
  148.     return r;
  149. }
  150.  
  151. mpf_class2& mpf_class2::operator/=(const mpf_class2& rhs)
  152. {
  153.     mpf_div(get_mpf_t(), get_mpf_t(), rhs.get_mpf_t());
  154.     return *this;
  155. }
  156.  
  157. mpf_class2& mpf_class2::operator/=(unsigned long rhs)
  158. {
  159.     mpf_div_ui(get_mpf_t(), get_mpf_t(), rhs);
  160.     return *this;
  161. }
  162.  
  163. mpf_class2& mpf_class2::operator/=(double rhs)
  164. {
  165.     operator/=(mpf_class2(rhs));
  166.     return *this;
  167. }
  168.  
  169. const mpf_class2 mpf_class2::operator/(const mpf_class2& rhs) const
  170. {
  171.     mpf_class2 r(*this);
  172.     r /= rhs;
  173.     return r;
  174. }
  175.  
  176. bool mpf_class2::operator==(const mpf_class2& rhs) const
  177. {
  178.     return cmp(*this, rhs) == 0;
  179. }
  180.  
  181. bool mpf_class2::operator!=(const mpf_class2& rhs) const
  182. {
  183.     return !(*this == rhs);
  184. }
  185.  
  186. bool mpf_class2::operator<(const mpf_class2& rhs) const
  187. {
  188.     return cmp(*this, rhs) < 0;
  189. }
  190.  
  191. bool mpf_class2::operator>(const mpf_class2& rhs) const
  192. {
  193.     return cmp(*this, rhs) > 0;
  194. }
  195.  
  196. bool mpf_class2::operator<=(const mpf_class2& rhs) const
  197. {
  198.     return cmp(*this, rhs) <= 0;
  199. }
  200.  
  201. bool mpf_class2::operator>=(const mpf_class2& rhs) const
  202. {
  203.     return cmp(*this, rhs) >= 0;
  204. }
  205.  
  206. const mpf_class2 mpf_class2::operator-() const
  207. {
  208.     mpf_class2 r = *this;
  209.     r *= (double)(-1);
  210.     return r;
  211. }
  212.  
  213. mpf_class2::operator double() const
  214. {
  215.     return get_d();
  216. }
  217.  
  218. mpf_class2::operator std::string() const
  219. {
  220.     const unsigned short digitCount = 50;
  221.     std::string s;
  222.     mp_exp_t e;
  223.     /*
  224.     Store 50 digits of f in base 10 and store the index of the decimal place
  225.     in e
  226.     */
  227.     s = get_str(e, 10, digitCount);
  228.  
  229.     /*
  230.     Insert one decimal point at position e
  231.     */
  232.     s.insert(e, 1, '.');
  233.     return s;
  234. }
  235. /*
  236. mpf_class2::operator signed long() const {
  237.     return get_si();
  238. }
  239. */
  240.  
  241. mpf_class2::mpf_class2(double d) : mpf_class(d)
  242. {
  243.     printf("double constructor with operand %f\n", d);
  244. }
  245.  
  246. mpf_class2::mpf_class2(signed long sl) : mpf_class(sl)
  247. {
  248.     printf("sl constructor with operand %i\n", sl);
  249. }
  250.  
  251. mpf_class2::mpf_class2(signed si) : mpf_class(si)
  252. {
  253.     printf("si constructor with operand %i\n", si);
  254. }
  255.  
  256. mpf_class2::mpf_class2(const mpf_class2& c) : mpf_class(c) {
  257.     printf("copy constructor\n");
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement