gmp 0.4.7 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +31 -0
- data/README.rdoc +16 -8
- data/benchmark/multiply +1 -1
- data/benchmark/multiply.gc +57 -0
- data/benchmark/pi +126 -0
- data/benchmark/srb.sh +21 -0
- data/ext/extconf.rb +3 -0
- data/ext/gmp.c +16 -7
- data/ext/gmpbench_timing.c +1 -1
- data/ext/gmpf.c +445 -104
- data/ext/gmpq.c +25 -17
- data/ext/gmpz.c +232 -120
- data/ext/mprnd.c +23 -5
- data/ext/ruby_gmp.h +75 -9
- data/lib/gmp.rb +9 -0
- data/manual.pdf +0 -0
- data/manual.tex +494 -60
- data/test/README +1 -0
- data/test/mpfr_tcbrt.rb +95 -0
- data/test/mpfr_tisnan.rb +70 -0
- data/test/mpfr_trec_sqrt.rb +62 -0
- data/test/mpfr_tsqrt.rb +142 -6
- data/test/tc_cmp.rb +4 -4
- data/test/tc_constants.rb +10 -0
- data/test/tc_division.rb +13 -2
- data/test/tc_f_arithmetics_coersion.rb +2 -2
- data/test/tc_f_precision.rb +4 -3
- data/test/tc_fib_fac_nextprime.rb +2 -2
- data/test/tc_floor_ceil_truncate.rb +2 -2
- data/test/tc_hashes.rb +0 -2
- data/test/tc_logical_roots.rb +1 -3
- data/test/tc_mpfr_constants.rb +11 -0
- data/test/tc_mpfr_functions.rb +22 -9
- data/test/tc_mpfr_random.rb +1 -3
- data/test/tc_mpfr_rounding.rb +10 -7
- data/test/tc_q.rb +1 -3
- data/test/tc_q_basic.rb +3 -5
- data/test/tc_random.rb +1 -3
- data/test/tc_sgn_neg_abs.rb +1 -3
- data/test/tc_swap.rb +1 -3
- data/test/tc_z.rb +3 -3
- data/test/tc_z_addmul.rb +92 -0
- data/test/tc_z_basic.rb +6 -8
- data/test/tc_z_exponentiation.rb +1 -3
- data/test/tc_z_gcd_lcm_invert.rb +1 -3
- data/test/tc_z_jac_leg_rem.rb +1 -3
- data/test/tc_z_logic.rb +2 -2
- data/test/tc_z_shifts_last_bits.rb +2 -2
- data/test/tc_z_to_d_to_i.rb +2 -2
- data/test/test_helper.rb +1 -1
- data/test/test_unit/assertions.rb +31 -0
- data/test/unit_tests.rb +33 -27
- metadata +31 -6
data/test/README
CHANGED
data/test/mpfr_tcbrt.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
require './test_helper'
|
2
|
+
|
3
|
+
class MPFR_TCBRT < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@one = GMP::F(1)
|
6
|
+
@zero = GMP::F(0)
|
7
|
+
@inf = @one/@zero
|
8
|
+
@nan = @inf - @inf
|
9
|
+
@neg_one = GMP::F(-1)
|
10
|
+
@neg_inf = @neg_one/@zero
|
11
|
+
@neg_zero = GMP::F("-0")
|
12
|
+
@rand_state = GMP::RandState.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# This really should be moved to be a method of GMP::F
|
16
|
+
def integer_component(f)
|
17
|
+
index_e = f.to_s.index('e')
|
18
|
+
exp = f.to_s[(index_e+1)..-1].to_i
|
19
|
+
return 0 if exp < 0
|
20
|
+
f.to_s[2..(index_e-1)][0,exp]
|
21
|
+
end
|
22
|
+
|
23
|
+
def special
|
24
|
+
x = @nan.cbrt(GMP::GMP_RNDN)
|
25
|
+
assert_true(x.nan?, "@nan.cbrt should be NaN")
|
26
|
+
x = @inf.cbrt(GMP::GMP_RNDN)
|
27
|
+
assert_true(x.infinite?, "@inf.cbrt should be +inf")
|
28
|
+
assert_true(x > 0, "@inf.cbrt should be +inf")
|
29
|
+
x = @neg_inf.cbrt(GMP::GMP_RNDN)
|
30
|
+
assert_true(x.infinite?, "@neg_inf.cbrt should be -inf")
|
31
|
+
assert_true(x < 0, "@neg_inf.cbrt should be -inf")
|
32
|
+
x = @zero.cbrt(GMP::GMP_RNDN)
|
33
|
+
assert_true(x.zero?, "@zero.cbrt should be +0")
|
34
|
+
assert_equal(GMP::F(0), x, "@zero.cbrt should be +0")
|
35
|
+
x = @neg_zero.cbrt(GMP::GMP_RNDN)
|
36
|
+
assert_true(x.zero?, "@neg_zero.cbrt should be -0")
|
37
|
+
assert_equal(GMP::F("-0"), x, "@neg_zero.cbrt should be -0")
|
38
|
+
|
39
|
+
x = GMP::F("8.39005285514734966412e-01", 53)
|
40
|
+
x = x.cbrt(GMP::GMP_RNDN)
|
41
|
+
y = GMP::F("9.43166207799662426048e-01")
|
42
|
+
assert_equal(y, x, "cbrt should be correct")
|
43
|
+
|
44
|
+
x = GMP::F("0.10000100001100101001001001011001", 32, 2)
|
45
|
+
x = x.cbrt(GMP::GMP_RNDN)
|
46
|
+
y = GMP::F("0.11001101011000100111000111111001", 32, 2)
|
47
|
+
assert_equal(y, x, "cbrt should be correct")
|
48
|
+
|
49
|
+
x = GMP::F("-0.1100001110110000010101011001011", 32, 2)
|
50
|
+
x = x.cbrt(GMP::GMP_RNDD)
|
51
|
+
y = GMP::F("-0.11101010000100100101000101011001", 32, 2)
|
52
|
+
assert_equal(y, x, "cbrt should be correct")
|
53
|
+
|
54
|
+
x = GMP::F("0.1010001111011101011011000111001011001101100011110110010011011011011010011001100101e-7", 82, 2)
|
55
|
+
y = x.cbrt(GMP::GMP_RNDD, 27)
|
56
|
+
x = GMP::F("0.101011110001110001000100011E-2", 82, 2)
|
57
|
+
assert_equal(x, y, "cbrt should be correct")
|
58
|
+
|
59
|
+
x = GMP::F("0.1010000000011010000000011001111110111110011101101000011110" +
|
60
|
+
"0010011010011100110110011111000111000101101101011001001110" +
|
61
|
+
"0101111001111100001010010100111011101100000011011000101100" +
|
62
|
+
"010000000011000101001010001001E-5", 204, 2)
|
63
|
+
y = x.cbrt(GMP::GMP_RNDD, 38)
|
64
|
+
x = GMP::F("0.10001001111010011011101000010110110010E-1", 204, 2)
|
65
|
+
assert_equal(x, y, "cbrt should be correct")
|
66
|
+
|
67
|
+
x = GMP::F("1.1000E-2", 5, 2)
|
68
|
+
x = x.cbrt(GMP::GMP_RNDN)
|
69
|
+
y = GMP::F("1.0111E-1", 5, 2)
|
70
|
+
assert_equal(y, x, "cbrt should be correct")
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_cbrt
|
74
|
+
special
|
75
|
+
|
76
|
+
(2..100).each do |p|
|
77
|
+
[GMP::GMP_RNDN, GMP::GMP_RNDZ, GMP::GMP_RNDD, GMP::GMP_RNDU].each do |rnd|
|
78
|
+
x = GMP::F(1).cbrt(rnd)
|
79
|
+
assert_equal(GMP::F(1), x, "1.cbrt should be 1 (prec #{p}) in rounding mode #{rnd}")
|
80
|
+
x = GMP::F(-1).cbrt(rnd)
|
81
|
+
assert_equal(GMP::F(-1), x, "-1.cbrt should be -1 (prec #{p}) in rounding mode #{rnd}")
|
82
|
+
|
83
|
+
next unless p>=5
|
84
|
+
|
85
|
+
(-12..12).each do |i|
|
86
|
+
x = GMP::F(27)
|
87
|
+
x *= GMP::F(2)**(3*i)
|
88
|
+
x = x.cbrt
|
89
|
+
assert_equal(GMP::F(3)*GMP::F(2)**i, x,
|
90
|
+
"27*2^#{3*i} should be 3*2^#{i} (prec #{p}, rounding mode #{rnd}")
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/test/mpfr_tisnan.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
require './test_helper'
|
2
|
+
|
3
|
+
class MPFR_ISNAN < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@rand_state = GMP::RandState.new
|
6
|
+
@one = GMP::F(1)
|
7
|
+
@zero = GMP::F(0)
|
8
|
+
@inf = @one/@zero
|
9
|
+
@neg_one = GMP::F(-1)
|
10
|
+
@neg_inf = @neg_one/@zero
|
11
|
+
@nan = @neg_inf - @neg_inf
|
12
|
+
@neg_zero = GMP::F("-0")
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_nan
|
16
|
+
assert_false(@inf.nan?, "@inf.nan? should be false")
|
17
|
+
assert_false(@neg_inf.nan?, "@neg_inf.nan? should be false")
|
18
|
+
assert_true(@nan.nan?, "@nan.nan? should be true")
|
19
|
+
assert_false(@one.nan?, "@one.nan? should be false")
|
20
|
+
assert_false(@zero.nan?, "@zero.nan? should be false")
|
21
|
+
assert_false(@neg_zero.nan?, "@neg_zero.nan? should be false")
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_infinite
|
25
|
+
assert_true(@inf.infinite?, "@inf.infinite? should be true")
|
26
|
+
assert_true(@neg_inf.infinite?, "@neg_inf.infinite? should be true")
|
27
|
+
assert_false(@nan.infinite?, "@nan.infinite? should be false")
|
28
|
+
assert_false(@one.infinite?, "@one.infinite? should be false")
|
29
|
+
assert_false(@zero.infinite?, "@zero.infinite? should be false")
|
30
|
+
assert_false(@neg_zero.infinite?, "@neg_zero.infinite? should be false")
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_finite
|
34
|
+
assert_false(@inf.finite?, "@inf.finite? should be false")
|
35
|
+
assert_false(@neg_inf.finite?, "@neg_inf.finite? should be false")
|
36
|
+
#assert_true(@nan.finite?, "@nan.finite? should be true") // eh...
|
37
|
+
assert_true(@one.finite?, "@one.finite? should be true")
|
38
|
+
assert_true(@zero.finite?, "@zero.finite? should be true")
|
39
|
+
assert_true(@neg_zero.finite?, "@neg_zero.finite? should be true")
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_number
|
43
|
+
assert_false(@inf.number?, "@inf.number? should be false")
|
44
|
+
assert_false(@neg_inf.number?, "@neg_inf.number? should be false")
|
45
|
+
assert_false(@nan.number?, "@nan.number? should be false")
|
46
|
+
assert_true(@one.number?, "@one.number? should be true")
|
47
|
+
assert_true(@zero.number?, "@zero.number? should be true")
|
48
|
+
assert_true(@neg_zero.number?, "@neg_zero.number? should be true")
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_zero
|
52
|
+
assert_false(@inf.zero?, "@inf.zero? should be false")
|
53
|
+
assert_false(@neg_inf.zero?, "@neg_inf.zero? should be false")
|
54
|
+
assert_false(@nan.zero?, "@nan.zero? should be false")
|
55
|
+
assert_false(@one.zero?, "@one.zero? should be false")
|
56
|
+
assert_true(@zero.zero?, "@zero.zero? should be true")
|
57
|
+
assert_true(@neg_zero.zero?, "@neg_zero.zero? should be true")
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_regular
|
61
|
+
if GMP::MPFR_VERSION >= "3.0.0"
|
62
|
+
assert_false(@inf.regular?, "@inf.regular? should be false")
|
63
|
+
assert_false(@neg_inf.regular?, "@neg_inf.regular? should be false")
|
64
|
+
assert_false(@nan.regular?, "@nan.regular? should be false")
|
65
|
+
assert_true(@one.regular?, "@one.regular? should be true")
|
66
|
+
assert_false(@zero.regular?, "@zero.regular? should be false")
|
67
|
+
assert_false(@neg_zero.regular?, "@neg_zero.regular? should be false")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require './test_helper'
|
2
|
+
|
3
|
+
class MPFR_TREC_SQRT < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@rand_state = GMP::RandState.new
|
6
|
+
@one = GMP::F(1)
|
7
|
+
@zero = GMP::F(0)
|
8
|
+
@inf = @one/@zero
|
9
|
+
@nan = @inf - @inf
|
10
|
+
@neg_zero = GMP::F("-0")
|
11
|
+
@neg_one = GMP::F(-1)
|
12
|
+
@neg_inf = @neg_one/@zero
|
13
|
+
end
|
14
|
+
|
15
|
+
# This really should be moved to be a method of GMP::F
|
16
|
+
def integer_component(f)
|
17
|
+
index_e = f.to_s.index('e')
|
18
|
+
exp = f.to_s[(index_e+1)..-1].to_i
|
19
|
+
return 0 if exp < 0
|
20
|
+
f.to_s[2..(index_e-1)][0,exp]
|
21
|
+
end
|
22
|
+
|
23
|
+
def special
|
24
|
+
x = @nan.rec_sqrt(GMP::GMP_RNDN)
|
25
|
+
assert_true(x.nan?, "@nan.rec_sqrt should be NaN")
|
26
|
+
x = @inf.rec_sqrt(GMP::GMP_RNDN)
|
27
|
+
assert_true(x.zero?, "@inf.rec_sqrt should be +0")
|
28
|
+
assert_true(x.hash != @neg_zero.hash, "@inf.rec_sqrt should be +0")
|
29
|
+
x = @neg_inf.rec_sqrt(GMP::GMP_RNDN)
|
30
|
+
assert_true(x.nan?, "@neg_inf.rec_sqrt should be NaN")
|
31
|
+
x = @zero.rec_sqrt(GMP::GMP_RNDN)
|
32
|
+
assert_true(x.infinite?, "@zero.rec_sqrt should be inf")
|
33
|
+
x = @neg_zero.rec_sqrt(GMP::GMP_RNDN)
|
34
|
+
assert_true(x.infinite?, "@neg_zero.rec_sqrt should be inf")
|
35
|
+
x = @neg_one.rec_sqrt(GMP::GMP_RNDN)
|
36
|
+
assert_true(x.nan?, "@neg_one.rec_sqrt should be NaN")
|
37
|
+
x = @one.rec_sqrt(GMP::GMP_RNDN)
|
38
|
+
assert_equal(@one, x, "@one.rec_sqrt should be 1")
|
39
|
+
|
40
|
+
# Can't do 0b1e-1 yet
|
41
|
+
#x = GMP::F("0b1.0001110110101001010100e-1", 23)
|
42
|
+
#y = x.rec_sqrt(GMP::GMP_RNDU, 33)
|
43
|
+
#x = GMP::F("0b1.01010110101110100100100101011", 33)
|
44
|
+
#assert_equal(x, y, "something about precision...")
|
45
|
+
end
|
46
|
+
|
47
|
+
def bad_case1
|
48
|
+
x = GMP::F("1.08310518720928b30e@-120", 72, 16, GMP::GMP_RNDN)
|
49
|
+
z = GMP::F("f.8@59", 6, 16, GMP::GMP_RNDN)
|
50
|
+
# z = rec_sqrt(x) rounded on 6 bits toward 0, the exact value being
|
51
|
+
# ~= f.bffffffffffffffffa11@59
|
52
|
+
y = x.rec_sqrt(GMP::GMP_RNDZ, 6)
|
53
|
+
assert_equal(y, z, "These should be equal...")
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_prec
|
57
|
+
special
|
58
|
+
bad_case1
|
59
|
+
#generic
|
60
|
+
#bad_cases
|
61
|
+
end
|
62
|
+
end
|
data/test/mpfr_tsqrt.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'test_helper'
|
1
|
+
require './test_helper'
|
2
2
|
|
3
3
|
class MPFR_TSQRT < Test::Unit::TestCase
|
4
4
|
def setup
|
@@ -13,12 +13,64 @@ class MPFR_TSQRT < Test::Unit::TestCase
|
|
13
13
|
f.to_s[2..(index_e-1)][0,exp]
|
14
14
|
end
|
15
15
|
|
16
|
+
def check24(as, rnd_mode, qs)
|
17
|
+
q = GMP::F(as, 24)
|
18
|
+
q = q.sqrt(rnd_mode)
|
19
|
+
assert_equal(q, GMP::F(qs), "Sqrt of #{as} (prec 24) should be #{qs}.")
|
20
|
+
end
|
21
|
+
|
16
22
|
def check_diverse(as, p, qs)
|
17
23
|
q = GMP::F(as, p)
|
18
24
|
q = q.sqrt
|
19
25
|
assert_equal(integer_component(q), qs)
|
20
26
|
end
|
21
27
|
|
28
|
+
def check_float
|
29
|
+
check24("70368760954880.0", GMP::GMP_RNDN, "8.388609e6")
|
30
|
+
check24("281474943156224.0", GMP::GMP_RNDN, "1.6777215e7")
|
31
|
+
check24("70368777732096.0", GMP::GMP_RNDN, "8.388610e6")
|
32
|
+
check24("281474909601792.0", GMP::GMP_RNDN, "1.6777214e7")
|
33
|
+
check24("100216216748032.0", GMP::GMP_RNDN, "1.0010805e7")
|
34
|
+
check24("120137273311232.0", GMP::GMP_RNDN, "1.0960715e7")
|
35
|
+
check24("229674600890368.0", GMP::GMP_RNDN, "1.5155019e7")
|
36
|
+
check24("70368794509312.0", GMP::GMP_RNDN, "8.388611e6")
|
37
|
+
check24("281474876047360.0", GMP::GMP_RNDN, "1.6777213e7")
|
38
|
+
check24("91214552498176.0", GMP::GMP_RNDN, "9.550631e6")
|
39
|
+
|
40
|
+
check24("70368760954880.0", GMP::GMP_RNDZ, "8.388608e6")
|
41
|
+
check24("281474943156224.0", GMP::GMP_RNDZ, "1.6777214e7")
|
42
|
+
check24("70368777732096.0", GMP::GMP_RNDZ, "8.388609e6")
|
43
|
+
check24("281474909601792.0", GMP::GMP_RNDZ, "1.6777213e7")
|
44
|
+
check24("100216216748032.0", GMP::GMP_RNDZ, "1.0010805e7")
|
45
|
+
check24("120137273311232.0", GMP::GMP_RNDZ, "1.0960715e7")
|
46
|
+
check24("229674600890368.0", GMP::GMP_RNDZ, "1.5155019e7")
|
47
|
+
check24("70368794509312.0", GMP::GMP_RNDZ, "8.38861e6")
|
48
|
+
check24("281474876047360.0", GMP::GMP_RNDZ, "1.6777212e7")
|
49
|
+
check24("91214552498176.0", GMP::GMP_RNDZ, "9.550631e6")
|
50
|
+
|
51
|
+
check24("70368760954880.0", GMP::GMP_RNDU, "8.388609e6")
|
52
|
+
check24("281474943156224.0", GMP::GMP_RNDU, "1.6777215e7")
|
53
|
+
check24("70368777732096.0", GMP::GMP_RNDU, "8.388610e6")
|
54
|
+
check24("281474909601792.0", GMP::GMP_RNDU, "1.6777214e7")
|
55
|
+
check24("100216216748032.0", GMP::GMP_RNDU, "1.0010806e7")
|
56
|
+
check24("120137273311232.0", GMP::GMP_RNDU, "1.0960716e7")
|
57
|
+
check24("229674600890368.0", GMP::GMP_RNDU, "1.515502e7")
|
58
|
+
check24("70368794509312.0", GMP::GMP_RNDU, "8.388611e6")
|
59
|
+
check24("281474876047360.0", GMP::GMP_RNDU, "1.6777213e7")
|
60
|
+
check24("91214552498176.0", GMP::GMP_RNDU, "9.550632e6")
|
61
|
+
|
62
|
+
check24("70368760954880.0", GMP::GMP_RNDD, "8.388608e6")
|
63
|
+
check24("281474943156224.0", GMP::GMP_RNDD, "1.6777214e7")
|
64
|
+
check24("70368777732096.0", GMP::GMP_RNDD, "8.388609e6")
|
65
|
+
check24("281474909601792.0", GMP::GMP_RNDD, "1.6777213e7")
|
66
|
+
check24("100216216748032.0", GMP::GMP_RNDD, "1.0010805e7")
|
67
|
+
check24("120137273311232.0", GMP::GMP_RNDD, "1.0960715e7")
|
68
|
+
check24("229674600890368.0", GMP::GMP_RNDD, "1.5155019e7")
|
69
|
+
check24("70368794509312.0", GMP::GMP_RNDD, "8.38861e6")
|
70
|
+
check24("281474876047360.0", GMP::GMP_RNDD, "1.6777212e7")
|
71
|
+
check24("91214552498176.0", GMP::GMP_RNDD, "9.550631e6")
|
72
|
+
end
|
73
|
+
|
22
74
|
def special
|
23
75
|
x = GMP::F(0b1010000010100011011001010101010010001100001101011101110001011001 / 2, 64) # Ruby 0b does not support e,
|
24
76
|
y = x.sqrt(GMP::GMP_RNDN, 32) # ie 0b11e-2 = 0.75 doesnt work
|
@@ -47,12 +99,17 @@ class MPFR_TSQRT < Test::Unit::TestCase
|
|
47
99
|
z = GMP::F(-1)
|
48
100
|
z = x.sqrt(GMP::GMP_RNDN)
|
49
101
|
|
50
|
-
#
|
51
|
-
#
|
102
|
+
#z = GMP::F(0.1011010100000100100100100110011001011100100100000011000111011001011101101101110000110100001000100001100001011000E1, 160)
|
103
|
+
#x = z.sqrt
|
52
104
|
# z = x.sqrt
|
53
105
|
# x.prec = 53
|
54
106
|
end
|
55
107
|
|
108
|
+
def check_inexact(prec)
|
109
|
+
x = @rand_state.mpfr_urandomb(p)
|
110
|
+
|
111
|
+
end
|
112
|
+
|
56
113
|
def property1(p, rounding)
|
57
114
|
x = @rand_state.mpfr_urandomb(p)
|
58
115
|
y = @rand_state.mpfr_urandomb(p)
|
@@ -63,8 +120,20 @@ class MPFR_TSQRT < Test::Unit::TestCase
|
|
63
120
|
|
64
121
|
def property2(p, rounding)
|
65
122
|
x = @rand_state.mpfr_urandomb(p)
|
66
|
-
y = (x
|
67
|
-
assert_true(x == y, "sqrt(x^2)
|
123
|
+
y = (x * x).sqrt(rounding)
|
124
|
+
assert_true(x == y, "sqrt(#{x.to_s}^2) should be #{x.to_s}, but is #{y.to_s} (rounding: #{GMP::F.default_rounding_mode.inspect}, prec: #{p.to_s}).")
|
125
|
+
end
|
126
|
+
|
127
|
+
def check3(as, rounding, qs)
|
128
|
+
q = GMP::F(as, 53)
|
129
|
+
q = q.sqrt(rounding)
|
130
|
+
assert_equal(GMP::F(qs), q, "Sqrt of -0.0 should be something like 0.0.")
|
131
|
+
end
|
132
|
+
|
133
|
+
def check4(as, rounding, qs)
|
134
|
+
q = GMP::F(as, 53)
|
135
|
+
q = q.sqrt(rounding)
|
136
|
+
assert_equal(q, GMP::F(qs, GMP::F.default_prec, 16), "Sqrt of #{as} should be #{qs}.")
|
68
137
|
end
|
69
138
|
|
70
139
|
def test_prec
|
@@ -78,5 +147,72 @@ class MPFR_TSQRT < Test::Unit::TestCase
|
|
78
147
|
160,
|
79
148
|
"796887792767063979679855997149887366668464780637")
|
80
149
|
special
|
150
|
+
#check_nan
|
151
|
+
|
152
|
+
(2...200).each do |p|
|
153
|
+
200.times do
|
154
|
+
#check_inexact p
|
155
|
+
end
|
156
|
+
end
|
157
|
+
check_float
|
158
|
+
|
159
|
+
check3("-0.0", GMP::GMP_RNDN, "0.0")
|
160
|
+
|
161
|
+
check4("6.37983013646045901440e+32", GMP::GMP_RNDN, "5.9bc5036d09e0c@13")
|
162
|
+
check4("1.0", GMP::GMP_RNDN, "1")
|
163
|
+
check4("1.0", GMP::GMP_RNDZ, "1")
|
164
|
+
check4("3.725290298461914062500000e-9", GMP::GMP_RNDN, "4@-4")
|
165
|
+
check4("3.725290298461914062500000e-9", GMP::GMP_RNDZ, "4@-4")
|
166
|
+
|
167
|
+
check4("1190456976439861.0", GMP::GMP_RNDZ, "2.0e7957873529a@6")
|
168
|
+
check4("1219027943874417664.0", GMP::GMP_RNDZ, "4.1cf2af0e6a534@7")
|
169
|
+
# the following examples are bugs in Cygnus compiler/system, found by
|
170
|
+
# Fabrice Rouillier while porting mpfr to Windows
|
171
|
+
check4("9.89438396044940256501e-134", GMP::GMP_RNDU, "8.7af7bf0ebbee@-56")
|
172
|
+
check4("7.86528588050363751914e+31", GMP::GMP_RNDZ, "1.f81fc40f32062@13")
|
173
|
+
check4("0.99999999999999988897", GMP::GMP_RNDN, "f.ffffffffffff8@-1")
|
174
|
+
check4("1.00000000000000022204", GMP::GMP_RNDN, "1")
|
175
|
+
# the following examples come from the paper "Number-theoretic Test
|
176
|
+
# Generation for Directed Rounding" from Michael Parks, Table 4
|
177
|
+
check4("78652858805036375191418371571712.0", GMP::GMP_RNDN, "1.f81fc40f32063@13")
|
178
|
+
check4("38510074998589467860312736661504.0", GMP::GMP_RNDN, "1.60c012a92fc65@13")
|
179
|
+
check4("35318779685413012908190921129984.0", GMP::GMP_RNDN, "1.51d17526c7161@13")
|
180
|
+
check4("26729022595358440976973142425600.0", GMP::GMP_RNDN, "1.25e19302f7e51@13")
|
181
|
+
check4("22696567866564242819241453027328.0", GMP::GMP_RNDN, "1.0ecea7dd2ec3d@13")
|
182
|
+
check4("22696888073761729132924856434688.0", GMP::GMP_RNDN, "1.0ecf250e8e921@13")
|
183
|
+
check4("36055652513981905145251657416704.0", GMP::GMP_RNDN, "1.5552f3eedcf33@13")
|
184
|
+
check4("30189856268896404997497182748672.0", GMP::GMP_RNDN, "1.3853ee10c9c99@13")
|
185
|
+
check4("36075288240584711210898775080960.0", GMP::GMP_RNDN, "1.556abe212b56f@13")
|
186
|
+
check4("72154663483843080704304789585920.0", GMP::GMP_RNDN, "1.e2d9a51977e6e@13")
|
187
|
+
check4("78652858805036375191418371571712.0", GMP::GMP_RNDZ, "1.f81fc40f32062@13")
|
188
|
+
check4("38510074998589467860312736661504.0", GMP::GMP_RNDZ, "1.60c012a92fc64@13")
|
189
|
+
check4("35318779685413012908190921129984.0", GMP::GMP_RNDZ, "1.51d17526c716@13")
|
190
|
+
check4("26729022595358440976973142425600.0", GMP::GMP_RNDZ, "1.25e19302f7e5@13")
|
191
|
+
check4("22696567866564242819241453027328.0", GMP::GMP_RNDZ, "1.0ecea7dd2ec3c@13")
|
192
|
+
check4("22696888073761729132924856434688.0", GMP::GMP_RNDZ, "1.0ecf250e8e92@13")
|
193
|
+
check4("36055652513981905145251657416704.0", GMP::GMP_RNDZ, "1.5552f3eedcf32@13")
|
194
|
+
check4("30189856268896404997497182748672.0", GMP::GMP_RNDZ, "1.3853ee10c9c98@13")
|
195
|
+
check4("36075288240584711210898775080960.0", GMP::GMP_RNDZ, "1.556abe212b56e@13")
|
196
|
+
check4("72154663483843080704304789585920.0", GMP::GMP_RNDZ, "1.e2d9a51977e6d@13")
|
197
|
+
check4("78652858805036375191418371571712.0", GMP::GMP_RNDU, "1.f81fc40f32063@13")
|
198
|
+
check4("38510074998589467860312736661504.0", GMP::GMP_RNDU, "1.60c012a92fc65@13")
|
199
|
+
check4("35318779685413012908190921129984.0", GMP::GMP_RNDU, "1.51d17526c7161@13")
|
200
|
+
check4("26729022595358440976973142425600.0", GMP::GMP_RNDU, "1.25e19302f7e51@13")
|
201
|
+
check4("22696567866564242819241453027328.0", GMP::GMP_RNDU, "1.0ecea7dd2ec3d@13")
|
202
|
+
check4("22696888073761729132924856434688.0", GMP::GMP_RNDU, "1.0ecf250e8e921@13")
|
203
|
+
check4("36055652513981905145251657416704.0", GMP::GMP_RNDU, "1.5552f3eedcf33@13")
|
204
|
+
check4("30189856268896404997497182748672.0", GMP::GMP_RNDU, "1.3853ee10c9c99@13")
|
205
|
+
check4("36075288240584711210898775080960.0", GMP::GMP_RNDU, "1.556abe212b56f@13")
|
206
|
+
check4("72154663483843080704304789585920.0", GMP::GMP_RNDU, "1.e2d9a51977e6e@13")
|
207
|
+
check4("78652858805036375191418371571712.0", GMP::GMP_RNDD, "1.f81fc40f32062@13")
|
208
|
+
check4("38510074998589467860312736661504.0", GMP::GMP_RNDD, "1.60c012a92fc64@13")
|
209
|
+
check4("35318779685413012908190921129984.0", GMP::GMP_RNDD, "1.51d17526c716@13")
|
210
|
+
check4("26729022595358440976973142425600.0", GMP::GMP_RNDD, "1.25e19302f7e5@13")
|
211
|
+
check4("22696567866564242819241453027328.0", GMP::GMP_RNDD, "1.0ecea7dd2ec3c@13")
|
212
|
+
check4("22696888073761729132924856434688.0", GMP::GMP_RNDD, "1.0ecf250e8e92@13")
|
213
|
+
check4("36055652513981905145251657416704.0", GMP::GMP_RNDD, "1.5552f3eedcf32@13")
|
214
|
+
check4("30189856268896404997497182748672.0", GMP::GMP_RNDD, "1.3853ee10c9c98@13")
|
215
|
+
check4("36075288240584711210898775080960.0", GMP::GMP_RNDD, "1.556abe212b56e@13")
|
216
|
+
check4("72154663483843080704304789585920.0", GMP::GMP_RNDD, "1.e2d9a51977e6d@13")
|
81
217
|
end
|
82
|
-
end
|
218
|
+
end
|
data/test/tc_cmp.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require 'test_helper'
|
1
|
+
require './test_helper'
|
2
2
|
|
3
3
|
class TC_Cmp < Test::Unit::TestCase
|
4
4
|
def setup
|
@@ -61,7 +61,7 @@ class TC_Cmp < Test::Unit::TestCase
|
|
61
61
|
def test_cmp_z_int
|
62
62
|
assert_equal(@a <=> @e, -1, "GMP::Z should <=> correctly with Fixnum")
|
63
63
|
assert_equal(@e <=> @a, 1, "Fixnum should <=> correctly with GMP::Z")
|
64
|
-
assert_equal(@a <=> @f,
|
64
|
+
assert_equal(-1, @a <=> @f, "GMP::Z should <=> correctly with Bignum")
|
65
65
|
assert_equal(@f <=> @a, 1, "Bignum should <=> correctly with GMP::Z")
|
66
66
|
end
|
67
67
|
|
@@ -69,6 +69,6 @@ class TC_Cmp < Test::Unit::TestCase
|
|
69
69
|
assert_equal(@c <=> @e, -1, "GMP::Q should <=> correctly with Fixnum")
|
70
70
|
assert_equal(@e <=> @c, 1, "Fixnum should <=> correctly with GMP::Q")
|
71
71
|
assert_equal(@c <=> @f, -1, "GMP::Q should <=> correctly with Bignum")
|
72
|
-
assert_equal(@f <=> @c,
|
72
|
+
assert_equal(1, @f <=> @c, "Bignum should <=> correctly with GMP::Q")
|
73
73
|
end
|
74
|
-
end
|
74
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require './test_helper'
|
2
|
+
|
3
|
+
class TC_Constants < Test::Unit::TestCase
|
4
|
+
def test_constants
|
5
|
+
assert_instance_of(String, GMP::GMP_VERSION, "GMP::GMP_VERSION should be a String")
|
6
|
+
assert_instance_of(String, GMP::GMP_CC, "GMP::GMP_CC should be a String")
|
7
|
+
assert_instance_of(String, GMP::GMP_CFLAGS, "GMP::GMP_CFLAGS should be a String")
|
8
|
+
assert_instance_of(Fixnum, GMP::GMP_BITS_PER_LIMB, "GMP::GMP_BITS_PER_LIMB should be a Fixnum")
|
9
|
+
end
|
10
|
+
end
|