gmp 0.4.1-x86-mingw32 → 0.4.3-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +14 -0
- data/README.rdoc +49 -17
- data/benchmark/runbench.rb +165 -165
- data/ext/gmp.c +63 -30
- data/ext/gmp.so +0 -0
- data/ext/gmpf.c +207 -3
- data/ext/gmpf.h +0 -132
- data/ext/gmprandstate.c +56 -2
- data/ext/libmpfr-1.dll +0 -0
- data/ext/ruby_gmp.h +39 -0
- data/manual.pdf +0 -0
- data/manual.tex +67 -7
- data/test/mpfr_tsqrt.rb +53 -0
- data/test/tc_f_precision.rb +99 -34
- data/test/tc_mpfr_functions.rb +45 -0
- data/test/tc_mpfr_random.rb +49 -0
- data/test/test_helper.rb +1 -0
- data/test/unit_tests.rb +9 -14
- metadata +8 -3
data/ext/gmprandstate.c
CHANGED
@@ -205,12 +205,13 @@ VALUE r_gmprandstate_urandomb(VALUE self, VALUE arg)
|
|
205
205
|
|
206
206
|
/*
|
207
207
|
* call-seq:
|
208
|
-
* rand_state.urandomm(
|
208
|
+
* rand_state.urandomm(integer)
|
209
209
|
*
|
210
210
|
* From the GMP Manual:
|
211
211
|
*
|
212
212
|
* Generate a uniformly distributed random integer in the range 0 to
|
213
|
-
*
|
213
|
+
* _integer-1_, inclusive. _integer_ can be an instance of GMP::Z,
|
214
|
+
* Fixnum, or Bignum
|
214
215
|
*/
|
215
216
|
VALUE r_gmprandstate_urandomm(VALUE self, VALUE arg)
|
216
217
|
{
|
@@ -241,6 +242,54 @@ VALUE r_gmprandstate_urandomm(VALUE self, VALUE arg)
|
|
241
242
|
return res;
|
242
243
|
}
|
243
244
|
|
245
|
+
|
246
|
+
#ifdef MPFR
|
247
|
+
/**********************************************************************
|
248
|
+
* MPFR Random Numbers *
|
249
|
+
**********************************************************************/
|
250
|
+
|
251
|
+
/*
|
252
|
+
* call-seq:
|
253
|
+
* rand_state.mpfr_urandomb()
|
254
|
+
*
|
255
|
+
* From the MPFR Manual:
|
256
|
+
*
|
257
|
+
* Generate a uniformly distributed random float in the interval 0 <= rop < 1.
|
258
|
+
*/
|
259
|
+
VALUE r_gmprandstate_mpfr_urandomb(int argc, VALUE *argv, VALUE self)
|
260
|
+
{
|
261
|
+
MP_RANDSTATE *self_val;
|
262
|
+
MP_FLOAT *res_val;
|
263
|
+
VALUE res;
|
264
|
+
unsigned long prec = 0;
|
265
|
+
|
266
|
+
if (argc > 1)
|
267
|
+
rb_raise (rb_eArgError, "wrong # of arguments(%d for 0 or 1)", argc);
|
268
|
+
|
269
|
+
mprandstate_get_struct (self,self_val);
|
270
|
+
|
271
|
+
if (argc == 1) {
|
272
|
+
if (FIXNUM_P (argv[0])) {
|
273
|
+
if (FIX2INT (argv[0]) >= 0)
|
274
|
+
prec = FIX2INT (argv[0]);
|
275
|
+
else
|
276
|
+
rb_raise (rb_eRangeError, "prec must be non-negative");
|
277
|
+
} else {
|
278
|
+
rb_raise (rb_eTypeError, "prec must be a Fixnum");
|
279
|
+
}
|
280
|
+
}
|
281
|
+
|
282
|
+
mpf_make_struct (res, res_val);
|
283
|
+
if (prec == 0) { mpf_init (res_val); }
|
284
|
+
else { mpf_init2 (res_val, prec); }
|
285
|
+
|
286
|
+
mpfr_urandomb (res_val, self_val);
|
287
|
+
|
288
|
+
return res;
|
289
|
+
}
|
290
|
+
#endif /* MPFR */
|
291
|
+
|
292
|
+
|
244
293
|
void init_gmprandstate()
|
245
294
|
{
|
246
295
|
mGMP = rb_define_module("GMP");
|
@@ -258,4 +307,9 @@ void init_gmprandstate()
|
|
258
307
|
// Integer Random Numbers
|
259
308
|
rb_define_method(cGMP_RandState, "urandomb", r_gmprandstate_urandomb, 1);
|
260
309
|
rb_define_method(cGMP_RandState, "urandomm", r_gmprandstate_urandomm, 1);
|
310
|
+
|
311
|
+
#ifdef MPFR
|
312
|
+
// Float Random Numbers
|
313
|
+
rb_define_method(cGMP_RandState, "mpfr_urandomb", r_gmprandstate_mpfr_urandomb, -1);
|
314
|
+
#endif /* MPFR */
|
261
315
|
}
|
data/ext/libmpfr-1.dll
ADDED
Binary file
|
data/ext/ruby_gmp.h
CHANGED
@@ -207,6 +207,40 @@ extern VALUE r_gmpf_eq(VALUE self, VALUE arg);
|
|
207
207
|
extern VALUE r_gmpf_cmp(VALUE self, VALUE arg);
|
208
208
|
extern int mpf_cmp_value(MP_FLOAT *OP, VALUE arg);
|
209
209
|
|
210
|
+
// MPFR
|
211
|
+
#ifdef MPFR
|
212
|
+
extern VALUE r_gmpfr_sqrt(VALUE self);
|
213
|
+
|
214
|
+
extern VALUE r_gmpfr_log(VALUE self);
|
215
|
+
extern VALUE r_gmpfr_log2(VALUE self);
|
216
|
+
extern VALUE r_gmpfr_log10(VALUE self);
|
217
|
+
extern VALUE r_gmpfr_exp(VALUE self);
|
218
|
+
|
219
|
+
extern VALUE r_gmpfr_cos(VALUE self);
|
220
|
+
extern VALUE r_gmpfr_sin(VALUE self);
|
221
|
+
extern VALUE r_gmpfr_tan(VALUE self);
|
222
|
+
extern VALUE r_gmpfr_sec(VALUE self);
|
223
|
+
extern VALUE r_gmpfr_csc(VALUE self);
|
224
|
+
extern VALUE r_gmpfr_cot(VALUE self);
|
225
|
+
|
226
|
+
extern VALUE r_gmpfr_acos(VALUE self);
|
227
|
+
extern VALUE r_gmpfr_asin(VALUE self);
|
228
|
+
extern VALUE r_gmpfr_atan(VALUE self);
|
229
|
+
|
230
|
+
extern VALUE r_gmpfr_cosh(VALUE self);
|
231
|
+
extern VALUE r_gmpfr_sinh(VALUE self);
|
232
|
+
extern VALUE r_gmpfr_tanh(VALUE self);
|
233
|
+
|
234
|
+
extern VALUE r_gmpfr_acosh(VALUE self);
|
235
|
+
extern VALUE r_gmpfr_asinh(VALUE self);
|
236
|
+
extern VALUE r_gmpfr_atanh(VALUE self);
|
237
|
+
|
238
|
+
extern VALUE r_gmpfrsg_const_log2();
|
239
|
+
extern VALUE r_gmpfrsg_const_pi();
|
240
|
+
extern VALUE r_gmpfrsg_const_euler();
|
241
|
+
extern VALUE r_gmpfrsg_const_catalan();
|
242
|
+
#endif /* MPFR */
|
243
|
+
|
210
244
|
// _unsorted_
|
211
245
|
extern VALUE r_gmpf_sgn(VALUE self);
|
212
246
|
extern VALUE r_gmpf_get_prec(VALUE self);
|
@@ -226,6 +260,11 @@ extern VALUE r_gmprandstate_seed(VALUE self, VALUE arg);
|
|
226
260
|
extern VALUE r_gmprandstate_urandomb(VALUE self, VALUE arg);
|
227
261
|
extern VALUE r_gmprandstate_urandomm(VALUE self, VALUE arg);
|
228
262
|
|
263
|
+
#ifdef MPFR
|
264
|
+
// Float Random Numbers
|
265
|
+
extern VALUE r_gmprandstate_mpfr_urandomb(int argc, VALUE *argv, VALUE self);
|
266
|
+
#endif /* MPFR */
|
267
|
+
|
229
268
|
|
230
269
|
/* from gmpbench_timing.c */
|
231
270
|
|
data/manual.pdf
CHANGED
Binary file
|
data/manual.tex
CHANGED
@@ -28,8 +28,8 @@
|
|
28
28
|
\huge{gmp} &\\
|
29
29
|
\midrule[3pt]
|
30
30
|
\multicolumn{2}{r}{\large{Ruby bindings to the GMP library}}\\
|
31
|
-
\multicolumn{2}{r}{\large{Edition 0.4.
|
32
|
-
\multicolumn{2}{r}{\large{
|
31
|
+
\multicolumn{2}{r}{\large{Edition 0.4.3}}\\
|
32
|
+
\multicolumn{2}{r}{\large{8 March 2010}}
|
33
33
|
\end{tabular}
|
34
34
|
|
35
35
|
\vfill
|
@@ -41,7 +41,7 @@
|
|
41
41
|
This manual describes how to use the gmp Ruby gem, which provides bindings to
|
42
42
|
the GNU multiple precision arithmetic library, version 4.3.x or 5.0.x.\\
|
43
43
|
\\
|
44
|
-
Copyright 2009 Sam Rawlins.\\
|
44
|
+
Copyright 2009, 2010 Sam Rawlins.\\
|
45
45
|
No license yet.
|
46
46
|
\newpage
|
47
47
|
|
@@ -201,7 +201,29 @@ The gmp gem includes the namespace \texttt{GMP} and four classes within \texttt{
|
|
201
201
|
|
202
202
|
In addition to the above four classes, there is also one constant within \texttt{GMP}:
|
203
203
|
\begin{itemize}
|
204
|
-
\item \texttt{GMP::GMP\_VERSION} - The version of GMP
|
204
|
+
\item \texttt{GMP::GMP\_VERSION} - The version of GMP linked into the gmp gem
|
205
|
+
\item \texttt{GMP::GMP\_CC} - The compiler that compiled GMP linked into the gmp gem
|
206
|
+
\item \texttt{GMP::GMP\_CFLAGS} - The compiler flags used to compile GMP linked into
|
207
|
+
the gmp gem
|
208
|
+
\item \texttt{GMP::GMP\_BITS\_PER\_LIMB} - The number of bits per limb
|
209
|
+
\end{itemize}
|
210
|
+
|
211
|
+
\section{MPFR basics}
|
212
|
+
|
213
|
+
The gmp gem can optionally link to MPFR, the Multiple Precision Floating-Point Reliable
|
214
|
+
Library. The x86-mswin32 version of the gmp gem comes with MPFR. This library uses the
|
215
|
+
floating-point type from GMP, and thus the MPFR functions mapped in the gmp gem become
|
216
|
+
methods in \texttt{GMP::F}.
|
217
|
+
|
218
|
+
There are additional constants within \texttt{GMP} when MPFR is linked:
|
219
|
+
\begin{itemize}
|
220
|
+
\item \texttt{GMP::MPFR\_VERSION} - The version of MPFR linked into the gmp gem.
|
221
|
+
\item \texttt{GMP::GMP\_RNDN} - Rounding mode representing "round to nearest."
|
222
|
+
\item \texttt{GMP::GMP\_RNDZ} - Rounding mode representing "round toward zero."
|
223
|
+
\item \texttt{GMP::GMP\_RNDU} - Rounding mode representing "round toward positive
|
224
|
+
infinity."
|
225
|
+
\item \texttt{GMP::GMP\_RNDD} - Rounding mode representing "round toward negative
|
226
|
+
infinity."
|
205
227
|
\end{itemize}
|
206
228
|
|
207
229
|
\newpage
|
@@ -693,8 +715,6 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
693
715
|
}
|
694
716
|
\end{tabular}
|
695
717
|
|
696
|
-
|
697
|
-
|
698
718
|
\subsection{Integer Logic and Bit Fiddling}
|
699
719
|
|
700
720
|
\begin{tabular}{p{\methwidth} l r}
|
@@ -742,6 +762,35 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
742
762
|
}
|
743
763
|
\end{tabular}
|
744
764
|
|
765
|
+
\newpage
|
766
|
+
\section{Rational Functions}
|
767
|
+
|
768
|
+
\subsection{Initializing, Assigning Rationals}
|
769
|
+
|
770
|
+
\begin{tabular}{p{\methwidth} l r}
|
771
|
+
\toprule
|
772
|
+
\textbf{new} & & GMP::Q.new $\rightarrow$ \textit{rational} \\
|
773
|
+
& & GMP::Q.new(\textit{numerator = 0}, \textit{denominator = 1}) $\rightarrow$ \textit{rational} \\
|
774
|
+
& & GMP::Q.new(\textit{str}) $\rightarrow$ \textit{rational} \\
|
775
|
+
\cmidrule(r){2-3}
|
776
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
777
|
+
This method creates a new \textit{GMP::Q} rational number. It takes two optional
|
778
|
+
arguments for the value of the numerator and denominator. These arguments can each be
|
779
|
+
an instance of several classes. Here are some
|
780
|
+
examples:\newline
|
781
|
+
|
782
|
+
\texttt{GMP::Q.new \qqqquad\qqqquad \#=> 0 (default) \newline
|
783
|
+
GMP::Q.new(1) \qqqquad\qquad\ \#=> 1 (Ruby Fixnum) \newline
|
784
|
+
GMP::Q.new(1,3) \qqqquad\ \#=> 1/3 (Ruby Fixnums) \newline
|
785
|
+
GMP::Q.new("127") \qqqquad\ \#=> 127 (Ruby String)\newline
|
786
|
+
GMP::Q.new(4294967296) \qquad \#=> 4294967296 (Ruby Bignum)\newline
|
787
|
+
GMP::Q.new(GMP::Z.new(31)) \#=> 31 (GMP Integer)}
|
788
|
+
}
|
789
|
+
\end{tabular}
|
790
|
+
\newline\newline
|
791
|
+
|
792
|
+
There is also a convenience method available, \texttt{GMP::Q()}.\\
|
793
|
+
|
745
794
|
\newpage
|
746
795
|
\section{Random Number Functions}
|
747
796
|
|
@@ -793,12 +842,23 @@ There is also a convenience method available, \texttt{GMP::Z()}.\\
|
|
793
842
|
|
794
843
|
\begin{tabular}{p{\methwidth} l r}
|
795
844
|
\toprule
|
796
|
-
\textbf{urandomb} & & $state$.urandomb($n$) $\rightarrow$ $
|
845
|
+
\textbf{urandomb} & & $state$.urandomb($n$) $\rightarrow$ $integer$ \\
|
797
846
|
\cmidrule(r){2-3}
|
798
847
|
& \multicolumn{2}{p{\defnwidth}}{
|
799
848
|
Generates a uniformly distributed random integer in the range $0$ to $2^n -1$,
|
800
849
|
inclusive.
|
801
850
|
}
|
802
851
|
\end{tabular}
|
852
|
+
\newline\newline
|
853
|
+
|
854
|
+
\begin{tabular}{p{\methwidth} l r}
|
855
|
+
\toprule
|
856
|
+
\textbf{urandomm} & & $state$.urandomm($n$) $\rightarrow$ $integer$ \\
|
857
|
+
\cmidrule(r){2-3}
|
858
|
+
& \multicolumn{2}{p{\defnwidth}}{
|
859
|
+
Generates a uniformly distributed random integer in the range $0$ to $n -1$,
|
860
|
+
inclusive. $n$ can be an instance of \gmpz, $Fixnum$, or $Bignum$.
|
861
|
+
}
|
862
|
+
\end{tabular}
|
803
863
|
|
804
864
|
\end{document}
|
data/test/mpfr_tsqrt.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MPFR_TSQRT < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@rand_state = GMP::RandState.new
|
6
|
+
end
|
7
|
+
|
8
|
+
# This really should be moved to be a method of GMP::F
|
9
|
+
def integer_component(f)
|
10
|
+
index_e = f.to_s.index('e')
|
11
|
+
exp = f.to_s[(index_e+1)..-1].to_i
|
12
|
+
return 0 if exp < 0
|
13
|
+
f.to_s[2..(index_e-1)][0,exp]
|
14
|
+
end
|
15
|
+
|
16
|
+
def check_diverse(as, p, qs)
|
17
|
+
q = GMP::F(as, p)
|
18
|
+
q = q.sqrt
|
19
|
+
assert_equal(integer_component(q), qs)
|
20
|
+
end
|
21
|
+
|
22
|
+
def property1(p, rounding)
|
23
|
+
current_rounding_mode = GMP::F.default_rounding_mode
|
24
|
+
GMP::F.default_rounding_mode = rounding
|
25
|
+
x = @rand_state.mpfr_urandomb(p)
|
26
|
+
y = @rand_state.mpfr_urandomb(p)
|
27
|
+
z = x**2 + y**2
|
28
|
+
z = x / z.sqrt
|
29
|
+
assert_between(-1, 1, z, "-1 <= x/sqrt(x^2+y^2) <= 1 should hold.")
|
30
|
+
GMP::F.default_rounding_mode = GMP.const_get(current_rounding_mode)
|
31
|
+
end
|
32
|
+
|
33
|
+
def property2(p, rounding)
|
34
|
+
current_rounding_mode = GMP::F.default_rounding_mode
|
35
|
+
GMP::F.default_rounding_mode = rounding
|
36
|
+
x = @rand_state.mpfr_urandomb(p)
|
37
|
+
y = (x ** 2).sqrt
|
38
|
+
assert_true(x == y, "sqrt(x^2) = x should hold.")
|
39
|
+
GMP::F.default_rounding_mode = GMP.const_get(current_rounding_mode)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_prec
|
43
|
+
(GMP::MPFR_PREC_MIN..128).each do |p|
|
44
|
+
property1(p, GMP::GMP_RNDN)
|
45
|
+
property1(p, GMP::GMP_RNDU)
|
46
|
+
property2(p, GMP::GMP_RNDN)
|
47
|
+
end
|
48
|
+
|
49
|
+
check_diverse("635030154261163106768013773815762607450069292760790610550915652722277604820131530404842415587328",
|
50
|
+
160,
|
51
|
+
"796887792767063979679855997149887366668464780637")
|
52
|
+
end
|
53
|
+
end
|
data/test/tc_f_precision.rb
CHANGED
@@ -2,47 +2,112 @@ require 'test_helper'
|
|
2
2
|
|
3
3
|
class TC_precision < Test::Unit::TestCase
|
4
4
|
def setup
|
5
|
+
begin
|
6
|
+
GMP::MPFR_VERSION
|
7
|
+
@initial_default_prec = GMP::F.default_prec
|
8
|
+
rescue
|
9
|
+
@initial_default_prec = GMP::F.default_prec
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_initial_default_precision
|
14
|
+
begin
|
15
|
+
GMP::MPFR_VERSION
|
16
|
+
assert_equal(53, GMP::F.default_prec, "The initial default precision with MPFR should be 53.")
|
17
|
+
rescue
|
18
|
+
assert_equal(64, GMP::F.default_prec, "The initial default precision without MPFR should be 64.")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_initial_default_precision2
|
5
23
|
@pi = GMP::F.new(3.14)
|
6
24
|
@seven_halves = GMP::F.new(GMP::Q.new(7,2), 1000)
|
25
|
+
assert_in_delta(0, GMP::F.new(), 1e-12)
|
26
|
+
assert_equal(@initial_default_prec, GMP::F.new().prec)
|
27
|
+
assert_in_delta(3.14000000000000012434, @pi, 1e-12)
|
28
|
+
assert_equal(@initial_default_prec, @pi.prec)
|
29
|
+
assert_in_delta(1, GMP::F.new(1), 1e-12)
|
30
|
+
assert_equal(@initial_default_prec, GMP::F.new(1).prec)
|
31
|
+
assert_in_delta(3.14, GMP::F.new("3.14"), 1e-12)
|
32
|
+
assert_equal(@initial_default_prec, GMP::F.new("3.14").prec)
|
33
|
+
assert_in_delta(4294967296, GMP::F.new(2**32), 1e-12)
|
34
|
+
assert_equal(@initial_default_prec, GMP::F.new(2**32).prec)
|
35
|
+
assert_in_delta(3, GMP::F.new(GMP::Z.new(3)), 1e-12)
|
36
|
+
assert_equal(@initial_default_prec, GMP::F.new(GMP::Z.new(3)).prec)
|
37
|
+
assert_in_delta(3.5, GMP::F.new(GMP::Q.new(7,2)), 1e-12)
|
38
|
+
assert_equal(@initial_default_prec, GMP::F.new(GMP::Q.new(7,2)).prec)
|
39
|
+
assert_in_delta(3.14000000000000012434, GMP::F.new(@pi), 1e-12)
|
40
|
+
assert_equal(@initial_default_prec, GMP::F.new(@pi).prec)
|
7
41
|
end
|
8
42
|
|
9
43
|
def test_default_precision
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
assert_equal(
|
15
|
-
|
16
|
-
assert_equal(
|
17
|
-
|
18
|
-
assert_equal(
|
19
|
-
|
20
|
-
assert_equal(
|
21
|
-
|
22
|
-
assert_equal(
|
23
|
-
|
24
|
-
assert_equal(
|
25
|
-
|
44
|
+
GMP::F.default_prec = 128
|
45
|
+
@pi = GMP::F.new(3.14)
|
46
|
+
@seven_halves = GMP::F.new(GMP::Q.new(7,2), 1000)
|
47
|
+
assert_in_delta(0, GMP::F.new(), 1e-12)
|
48
|
+
assert_equal(128, GMP::F.new().prec)
|
49
|
+
assert_in_delta(3.14000000000000012434, @pi, 1e-12)
|
50
|
+
assert_equal(128, @pi.prec)
|
51
|
+
assert_in_delta(1, GMP::F.new(1), 1e-12)
|
52
|
+
assert_equal(128, GMP::F.new(1).prec)
|
53
|
+
assert_in_delta(3.14, GMP::F.new("3.14"), 1e-12)
|
54
|
+
assert_equal(128, GMP::F.new("3.14").prec)
|
55
|
+
assert_in_delta(4294967296, GMP::F.new(2**32), 1e-12)
|
56
|
+
assert_equal(128, GMP::F.new(2**32).prec)
|
57
|
+
assert_in_delta(3, GMP::F.new(GMP::Z.new(3)), 1e-12)
|
58
|
+
assert_equal(128, GMP::F.new(GMP::Z.new(3)).prec)
|
59
|
+
assert_in_delta(3.5, GMP::F.new(GMP::Q.new(7,2)), 1e-12)
|
60
|
+
assert_equal(128, GMP::F.new(GMP::Q.new(7,2)).prec)
|
61
|
+
assert_in_delta(3.14000000000000012434, GMP::F.new(@pi), 1e-12)
|
62
|
+
assert_equal(128, GMP::F.new(@pi).prec)
|
63
|
+
GMP::F.default_prec = @initial_default_prec
|
26
64
|
end
|
27
65
|
|
28
66
|
def test_specific_precision
|
29
|
-
|
30
|
-
|
31
|
-
assert_equal(
|
32
|
-
assert_equal(1024,
|
33
|
-
|
34
|
-
assert_equal(1024,
|
35
|
-
|
36
|
-
assert_equal(1024,
|
37
|
-
|
38
|
-
assert_equal(1024,
|
39
|
-
|
40
|
-
assert_equal(1024,
|
41
|
-
|
42
|
-
assert_equal(1024,
|
43
|
-
|
44
|
-
assert_equal(1024,
|
45
|
-
assert_equal(
|
46
|
-
assert_equal(
|
67
|
+
@pi = GMP::F.new(3.14)
|
68
|
+
@seven_halves = GMP::F.new(GMP::Q.new(7,2), 1024)
|
69
|
+
assert_equal(0, GMP::F.new(3.14, 1024).to_s =~ /0\.31400000000000001243449787580175325274467468261718750*e\+1/)
|
70
|
+
assert_equal(1024, GMP::F.new(3.14, 1024).prec)
|
71
|
+
assert_in_delta(1, GMP::F.new(1, 1024), 1e-12)
|
72
|
+
assert_equal(1024, GMP::F.new(1, 1024).prec)
|
73
|
+
assert_in_delta(3.14, GMP::F.new("3.14", 1024), 1e-12)
|
74
|
+
assert_equal(1024, GMP::F.new("3.14", 1024).prec)
|
75
|
+
assert_in_delta(4294967296, GMP::F.new(2**32, 1024), 1e-12)
|
76
|
+
assert_equal(1024, GMP::F.new(2**32, 1024).prec)
|
77
|
+
assert_in_delta(3, GMP::F.new(GMP::Z.new(3), 1024), 1e-12)
|
78
|
+
assert_equal(1024, GMP::F.new(GMP::Z.new(3), 1024).prec)
|
79
|
+
assert_in_delta(3.5, @seven_halves, 1e-12)
|
80
|
+
assert_equal(1024, @seven_halves.prec)
|
81
|
+
assert_in_delta(3.5, GMP::F.new(@seven_halves), 1e-12)
|
82
|
+
assert_equal(1024, GMP::F.new(@seven_halves).prec)
|
83
|
+
assert_equal(0, GMP::F.new(@pi, 1024).to_s =~ /0\.31400000000000001243449787580175325274467468261718750*e\+1/)
|
84
|
+
assert_equal(1024, GMP::F.new(@pi, 1024).prec)
|
85
|
+
assert_in_delta(3.5, GMP::F.new(@seven_halves, 0), 1e-12)
|
86
|
+
assert_equal(@initial_default_prec, GMP::F.new(@seven_halves, 0).prec)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_set_default_prec
|
90
|
+
begin
|
91
|
+
GMP::MPFR_VERSION
|
92
|
+
GMP::F.default_prec = 100
|
93
|
+
assert_equal(100, GMP::F.default_prec, "GMP::F.default_prec should be assignable.")
|
94
|
+
GMP::F.default_prec = 130
|
95
|
+
assert_equal(130, GMP::F.default_prec, "GMP::F.default_prec should be assignable.")
|
96
|
+
GMP::F.default_prec = 1000
|
97
|
+
assert_equal(1000, GMP::F.default_prec, "GMP::F.default_prec should be assignable.")
|
98
|
+
assert_raise(RangeError) { GMP::F.default_prec = -64 }
|
99
|
+
assert_raise(TypeError) { GMP::F.default_prec = "Cow" }
|
100
|
+
rescue NameError => err
|
101
|
+
raise unless err.to_s == "uninitialized constant GMP::MPFR_VERSION"
|
102
|
+
GMP::F.default_prec = 100
|
103
|
+
assert_equal(128, GMP::F.default_prec, "GMP::F.default_prec should be assignable.")
|
104
|
+
GMP::F.default_prec = 130
|
105
|
+
assert_equal(160, GMP::F.default_prec, "GMP::F.default_prec should be assignable.")
|
106
|
+
GMP::F.default_prec = 1000
|
107
|
+
assert_equal(1024, GMP::F.default_prec, "GMP::F.default_prec should be assignable.")
|
108
|
+
assert_raise(RangeError) { GMP::F.default_prec = -64 }
|
109
|
+
assert_raise(TypeError) { GMP::F.default_prec = "Cow" }
|
110
|
+
end
|
111
|
+
GMP::F.default_prec = @initial_default_prec
|
47
112
|
end
|
48
113
|
end
|