1 #ifndef ONCE_FP_MPFR_FLOAT_
2 #define ONCE_FP_MPFR_FLOAT_
9 /* A default of 256 bits will be used unless changed with this function.
10 Note that all existing and cached GMP objects will be resized to the
11 specified precision (which can be a somewhat heavy operation).
13 static void setDefaultMantissaBits(unsigned long bits);
15 static unsigned long getCurrentDefaultMantissaBits();
17 /* The default constructor initializes the object to the value 0.
18 It's efficient to instantiate such zero-initialized objects because
19 all of them will share the same mpfr data. (Also any object initialized
20 with or assigned the explicit value of zero will also share that one
21 mpfr data.) Thus multiple zero-initialized MpfrFloat instances won't
22 consume significant amounts of memory (until they are modified to
23 contain some other value, of course).
27 Note that initializing an MpfrFloat object with, for example, 0.1 will
28 suffer from accuracy problems (at least if the MpfrFloat object has
29 more mantissa bits than a double). The C++ double value 0.1 has only
30 53 mantissa bits, while the MpfrFloat object usually has more. If the
31 MpfrFloat object is initialized with a double, only that many bits of
32 accuracy will end up in the value of the MpfrFloat object. This can
33 create significant rounding/accuracy problems in some cases.
34 If you need to initialize the MpfrObject with some value (which cannot
35 be represented accurately by base-2 floating point numbers, eg. 0.1)
36 at full mantissa precision, you have to use parseValue("0.1") instead,
37 rather than relying on the constructor taking a double type value.
40 MpfrFloat(double value);
41 MpfrFloat(long double value);
42 MpfrFloat(long value);
44 MpfrFloat(const char* value, char** endptr);
48 MpfrFloat(const MpfrFloat&);
50 MpfrFloat& operator=(const MpfrFloat&);
51 MpfrFloat& operator=(double value);
52 MpfrFloat& operator=(long double value);
53 MpfrFloat& operator=(long value);
54 MpfrFloat& operator=(int value);
55 //MpfrFloat& operator=(const char* value);
57 void parseValue(const char* value);
58 void parseValue(const char* value, char** endptr);
61 /* This function can be used to retrieve the raw mpfr_t data structure
62 used by this object. (The template trick is used to avoid a dependency
63 of this header file with <mpfr.h>.)
64 In other words, it can be called like:
67 floatValue.get_raw_mpfr_data(raw_mpfr_data);
69 Note that the returned mpfr_t should be considered as read-only and
70 not be modified from the outside because it may be shared among
71 several objects. If the calling code needs to modify the data, it
72 should copy it for itself first with the appropriate MPFR library
75 template<typename Mpfr_t>
76 void get_raw_mpfr_data(Mpfr_t& dest_mpfr_t);
79 /* Note that the returned char* points to an internal (shared) buffer
80 which will be valid until the next time this function is called
83 const char* getAsString(unsigned precision) const;
85 bool isInteger() const;
87 double toDouble() const;
89 MpfrFloat& operator+=(const MpfrFloat&);
90 MpfrFloat& operator+=(double);
91 MpfrFloat& operator-=(const MpfrFloat&);
92 MpfrFloat& operator-=(double);
93 MpfrFloat& operator*=(const MpfrFloat&);
94 MpfrFloat& operator*=(double);
95 MpfrFloat& operator/=(const MpfrFloat&);
96 MpfrFloat& operator/=(double);
97 MpfrFloat& operator%=(const MpfrFloat&);
102 MpfrFloat operator+(const MpfrFloat&) const;
103 MpfrFloat operator+(double) const;
104 MpfrFloat operator-(const MpfrFloat&) const;
105 MpfrFloat operator-(double) const;
106 MpfrFloat operator*(const MpfrFloat&) const;
107 MpfrFloat operator*(double) const;
108 MpfrFloat operator/(const MpfrFloat&) const;
109 MpfrFloat operator/(double) const;
110 MpfrFloat operator%(const MpfrFloat&) const;
112 MpfrFloat operator-() const;
114 bool operator<(const MpfrFloat&) const;
115 bool operator<(double) const;
116 bool operator<=(const MpfrFloat&) const;
117 bool operator<=(double) const;
118 bool operator>(const MpfrFloat&) const;
119 bool operator>(double) const;
120 bool operator>=(const MpfrFloat&) const;
121 bool operator>=(double) const;
122 bool operator==(const MpfrFloat&) const;
123 bool operator==(double) const;
124 bool operator!=(const MpfrFloat&) const;
125 bool operator!=(double) const;
127 static MpfrFloat log(const MpfrFloat&);
128 static MpfrFloat log2(const MpfrFloat&);
129 static MpfrFloat log10(const MpfrFloat&);
130 static MpfrFloat exp(const MpfrFloat&);
131 static MpfrFloat exp2(const MpfrFloat&);
132 static MpfrFloat exp10(const MpfrFloat&);
133 static MpfrFloat cos(const MpfrFloat&);
134 static MpfrFloat sin(const MpfrFloat&);
135 static MpfrFloat tan(const MpfrFloat&);
136 static MpfrFloat sec(const MpfrFloat&);
137 static MpfrFloat csc(const MpfrFloat&);
138 static MpfrFloat cot(const MpfrFloat&);
139 static void sincos(const MpfrFloat&, MpfrFloat& sin, MpfrFloat& cos);
140 static MpfrFloat acos(const MpfrFloat&);
141 static MpfrFloat asin(const MpfrFloat&);
142 static MpfrFloat atan(const MpfrFloat&);
143 static MpfrFloat atan2(const MpfrFloat&, const MpfrFloat&);
144 static MpfrFloat hypot(const MpfrFloat&, const MpfrFloat&);
145 static MpfrFloat cosh(const MpfrFloat&);
146 static MpfrFloat sinh(const MpfrFloat&);
147 static MpfrFloat tanh(const MpfrFloat&);
148 static MpfrFloat acosh(const MpfrFloat&);
149 static MpfrFloat asinh(const MpfrFloat&);
150 static MpfrFloat atanh(const MpfrFloat&);
151 static MpfrFloat sqrt(const MpfrFloat&);
152 static MpfrFloat cbrt(const MpfrFloat&);
153 static MpfrFloat root(const MpfrFloat&, unsigned long root);
154 static MpfrFloat pow(const MpfrFloat&, const MpfrFloat&);
155 static MpfrFloat pow(const MpfrFloat&, long exponent);
156 static MpfrFloat abs(const MpfrFloat&);
157 static MpfrFloat dim(const MpfrFloat&, const MpfrFloat&);
158 static MpfrFloat round(const MpfrFloat&);
159 static MpfrFloat ceil(const MpfrFloat&);
160 static MpfrFloat floor(const MpfrFloat&);
161 static MpfrFloat trunc(const MpfrFloat&);
163 static MpfrFloat parseString(const char* str, char** endptr);
165 // These values are cached (and recalculated every time the mantissa bits
166 // change), so it's efficient to call these repeatedly:
167 static MpfrFloat const_pi();
168 static MpfrFloat const_e();
169 static MpfrFloat const_log2();
170 static MpfrFloat someEpsilon();
174 struct MpfrFloatData;
175 class MpfrFloatDataContainer;
177 MpfrFloatData* mData;
179 enum DummyType { kNoInitialization };
180 MpfrFloat(DummyType);
181 MpfrFloat(MpfrFloatData*);
184 static MpfrFloatDataContainer& mpfrFloatDataContainer();
186 friend MpfrFloat operator+(double lhs, const MpfrFloat& rhs);
187 friend MpfrFloat operator-(double lhs, const MpfrFloat& rhs);
190 MpfrFloat operator+(double lhs, const MpfrFloat& rhs);
191 MpfrFloat operator-(double lhs, const MpfrFloat& rhs);
192 MpfrFloat operator*(double lhs, const MpfrFloat& rhs);
193 MpfrFloat operator/(double lhs, const MpfrFloat& rhs);
194 MpfrFloat operator%(double lhs, const MpfrFloat& rhs);
196 inline bool operator<(double lhs, const MpfrFloat& rhs) { return rhs > lhs; }
197 inline bool operator<=(double lhs, const MpfrFloat& rhs) { return rhs >= lhs; }
198 inline bool operator>(double lhs, const MpfrFloat& rhs) { return rhs < lhs; }
199 inline bool operator>=(double lhs, const MpfrFloat& rhs) { return rhs <= lhs; }
200 inline bool operator==(double lhs, const MpfrFloat& rhs) { return rhs == lhs; }
201 inline bool operator!=(double lhs, const MpfrFloat& rhs) { return rhs != lhs; }
203 // This function takes into account the value of os.precision()
204 std::ostream& operator<<(std::ostream& os, const MpfrFloat& value);