gnu_mpc 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,109 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/atan.dat
4
+ describe MPC, '#atan' do
5
+ it 'should calculate the inverse tangent of a pure real argument' do
6
+ data = [
7
+ [["-0x16DCC57BB565FDp-52", 53, 16], [0], MPC.new([GMP::F(-7 ), -GMP::F(0)])],
8
+ [["-0x1F730BD281F69Bp-53", 53, 16], [0], MPC.new([GMP::F(-1.5 ), -GMP::F(0)])],
9
+ [["-0x1921FB54442D18p-53", 53, 16], [0], MPC.new([GMP::F(-1 ), -GMP::F(0)])],
10
+ [["-0x1700A7C5784634p-53", 53, 16], [0], MPC.new([GMP::F(-0.875), -GMP::F(0)])],
11
+ [["-0x1FD5BA9AAC2F6Ep-56", 53, 16], [0], MPC.new([GMP::F(-0.125), -GMP::F(0)])],
12
+ [[ "0x1FD5BA9AAC2F6Ep-56", 53, 16], [0], MPC.new([GMP::F( 0.125), -GMP::F(0)])],
13
+ [[ "0x1700A7C5784634p-53", 53, 16], [0], MPC.new([GMP::F( 0.875), -GMP::F(0)])],
14
+ [[ "0x1921FB54442D18p-53", 53, 16], [0], MPC.new([GMP::F( 1 ), -GMP::F(0)])],
15
+ [[ "0x1F730BD281F69Bp-53", 53, 16], [0], MPC.new([GMP::F( 1.5 ), -GMP::F(0)])],
16
+ [[ "0x16DCC57BB565FDp-52", 53, 16], [0], MPC.new([GMP::F( 7 ), -GMP::F(0)])]
17
+ ]
18
+ data.each do |expected_real, expected_imag, input|
19
+ actual = input.atan
20
+ actual.real.should eq GMP::F.new(*expected_real)
21
+ actual.imag.should eq GMP::F.new(*expected_imag)
22
+ end
23
+ end
24
+
25
+ it 'should calculate the inverse tangent of a pure imaginary argument' do
26
+ data = [
27
+ [["-0x1921FB54442D18p-52", 53, 16], ["-0x1269621134DB92p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F(-7 )])],
28
+ [[ "0x1921FB54442D18p-52", 53, 16], ["-0x1269621134DB92p-55", 53, 16], MPC.new([ GMP::F(0), GMP::F(-7 )])],
29
+ [["-0x1921FB54442D18p-52", 53, 16], ["-0x19C041F7ED8D33p-53", 53, 16], MPC.new([-GMP::F(0), GMP::F(-1.5 )])],
30
+ [[ "0x1921FB54442D18p-52", 53, 16], ["-0x19C041F7ED8D33p-53", 53, 16], MPC.new([ GMP::F(0), GMP::F(-1.5 )])],
31
+ [[0], ["-0x15AA16394D481Fp-52", 53, 16], MPC.new([-GMP::F(0), GMP::F(-0.875)])],
32
+ [[0], ["-0x1015891C9EAEF7p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F(-0.125)])],
33
+ [[0], [ "0x1015891C9EAEF7p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F( 0.125)])],
34
+ [[0], [ "0x15AA16394D481Fp-52", 53, 16], MPC.new([-GMP::F(0), GMP::F( 0.875)])],
35
+ [[ "0x1921FB54442D18p-52", 53, 16], [ "0x19C041F7ED8D33p-53", 53, 16], MPC.new([ GMP::F(0), GMP::F( 1.5 )])],
36
+ [["-0x1921FB54442D18p-52", 53, 16], [ "0x19C041F7ED8D33p-53", 53, 16], MPC.new([-GMP::F(0), GMP::F( 1.5 )])],
37
+ [[ "0x1921FB54442D18p-52", 53, 16], [ "0x1269621134DB92p-55", 53, 16], MPC.new([ GMP::F(0), GMP::F( 7 )])],
38
+ [["-0x1921FB54442D18p-52", 53, 16], [ "0x1269621134DB92p-55", 53, 16], MPC.new([-GMP::F(0), GMP::F( 7 )])],
39
+ [[0], [ "0x1FFFFFFFFFFF82p-52", 53, 16], MPC.new([ GMP::F(0), GMP::F("0x1ED9505E1BC3C2p-53", 53, 16)])]
40
+ ]
41
+ data.each do |expected_real, expected_imag, input|
42
+ actual = input.atan
43
+ actual.real.should eq GMP::F.new(*expected_real)
44
+ actual.imag.should eq GMP::F.new(*expected_imag)
45
+ end
46
+ end
47
+
48
+ it 'should calculate the inverse tangent of a pure imaginary argument, 512 precision' do
49
+ input = MPC.new([
50
+ GMP::F(0, 512),
51
+ GMP::F("0x1018734E311AB77B710F9212969B3C86E8F388BB7DA5BAF74ADE078F43D96456D088C8A0B2A370159DFB8D4A4BC51BCDA91F2DCD01B2EC610C62AA33FAD1688p-504", 512, 16)
52
+ ], 512)
53
+ actual = input.atan(MPC::MPC_RNDNZ, 512, 512)
54
+ actual.real.should eq GMP::F.new("0x6487ED5110B4611A62633145C06E0E68948127044533E63A0105DF531D89CD9128A5043CC71A026EF7CA8CD9E69D218D98158536F92F8A1BA7F09AB6B6A8E123p-510", 512, 16)
55
+ actual.imag.should eq GMP::F.new("0x5D137113B914461DA3202D77346EE4980DA5FD0BAD68F5A7928DCA9F632750D9BFFA00654C523929F15DED554EC6BC476DB2C46FA433E569227085E0BDEA86FFp-509", 512, 16)
56
+ end
57
+
58
+ it 'should calculate the inverse tangent of a pure imaginary argument, 12 precision' do
59
+ input = MPC.new([
60
+ GMP::F(0, 12),
61
+ GMP::F("0x9380000000", 12, 16)
62
+ ], 12)
63
+ actual = input.atan
64
+ actual.real.should eq GMP::F.new("0xC91p-11", 12, 16)
65
+ actual.imag.should eq GMP::F.new("0x6F1p-50", 12, 16)
66
+ end
67
+
68
+ it 'should calculate the inverse tangent of a general inputs' do
69
+ data = [
70
+ [["0x91EA521228BFC46ACAp-118", 72, 16], ["-0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDUN],
71
+ [["0x91EA521228BFC46AC9p-118", 72, 16], ["-0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDD],
72
+ [["0x91EA521228BFC46AC9p-118", 72, 16], ["-0x9E96A01DBAD6470973p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], ["-0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDU],
73
+ [["0x91EA521228BFC46ACAp-118", 72, 16], [ "0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], [ "0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDUN],
74
+ [["0x91EA521228BFC46AC9p-118", 72, 16], [ "0x9E96A01DBAD6470974p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], [ "0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDU],
75
+ [["0x91EA521228BFC46AC9p-118", 72, 16], [ "0x9E96A01DBAD6470973p-73", 72, 16], ["0x84C3E02A5C6DEE8410p-118", 72, 16], [ "0x99B43C52A95A21C220p-73", 72, 16], MPC::MPC_RNDDD],
76
+ ]
77
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
78
+ actual = MPC.new([GMP::F(*input_real), GMP::F(*input_imag)], 72).atan(rounding_mode)
79
+ actual.real.should eq GMP::F.new(*expected_real)
80
+ actual.imag.should eq GMP::F.new(*expected_imag)
81
+ end
82
+ end
83
+
84
+ it 'should calculate the inverse tangent of a general inputs, 156 precision' do
85
+ input = MPC.new([
86
+ GMP::F("-0xF0CE58073F866A53F25DB85DE8D503FBDD81051p-109", 156, 16),
87
+ GMP::F( "0xCF81D7C76BB9754A52056CB0F144B0C6700CC8Cp-128", 156, 16)
88
+ ], 156)
89
+ actual = input.atan
90
+ actual.real.should eq GMP::F.new("-0xC90FDAA22167B20DB08A0C3B1FF415CABE49624p-155", 156, 16)
91
+ actual.imag.should eq GMP::F.new("0xEA84E971BD52E49CCEE036E303D5ECB2D9D9B9Ap-222", 156, 16)
92
+ end
93
+
94
+ it 'should calculate the inverse tangent of a general inputs, 2 precision' do
95
+ actual = MPC.new([GMP::F("0x1p-7", 2, 16), GMP::F(-1, 2, 16)], 2).atan
96
+ actual.real.should eq GMP::F.new( 0.75, 2, 16)
97
+ actual.imag.should eq GMP::F.new(-3, 2, 16)
98
+
99
+ actual = MPC.new([GMP::F("0x1p-7", 2, 16), GMP::F(1, 2, 16)], 2).atan
100
+ actual.real.should eq GMP::F.new( 0.75, 2, 16)
101
+ actual.imag.should eq GMP::F.new( 3, 2, 16)
102
+ end
103
+
104
+ it 'should calculate the inverse tangent: "improve test coverage"' do
105
+ actual = MPC.new([GMP::F("-0xa.529626a89a1960@23", 57, 16), GMP::F("-0x3.9a5472b5709e74@14", 57, 16)], 57).atan
106
+ actual.real.should eq GMP::F.new("-0x1.921fb54442d184", 57, 16)
107
+ actual.imag.should eq GMP::F.new("-0x8.a7e33db93ecf18@-34", 57, 16)
108
+ end
109
+ end
@@ -0,0 +1,56 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/conj.dat
4
+ describe MPC, '#conj' do
5
+ it 'should calculate the conjugate of a pure real number' do
6
+ data = [
7
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 3], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 4], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 5], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 6], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 7], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 8], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 9], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 10], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 11], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 12], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 13], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 14], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 15], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 16], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 17], MPC.new([GMP::F("-0x123456789abcdep+52", 53, 16), GMP::F(0, 2)]), MPC::MPC_RNDUD],
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.conj(rounding_mode)
26
+ actual.real.should eq GMP::F.new(*expected_real)
27
+ actual.imag.should eq GMP::F.new(*expected_imag)
28
+ end
29
+ end
30
+
31
+ it 'should calculate the conjugate of a pure imaginary argument' do
32
+ data = [
33
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 53), GMP::F( "0x123456789abcdep+52", 53, 16)]), MPC::MPC_RNDNN],
34
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 51), GMP::F( "0x123456789abcdep+52", 54, 16)]), MPC::MPC_RNDZN],
35
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 49), GMP::F("-0x123456789abcdep+52", 55, 16)]), MPC::MPC_RNDUN],
36
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 47), GMP::F("-0x123456789abcdep+52", 56, 16)]), MPC::MPC_RNDUN],
37
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 45), GMP::F( "0x123456789abcdep+52", 57, 16)]), MPC::MPC_RNDZZ],
38
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 43), GMP::F( "0x123456789abcdep+52", 58, 16)]), MPC::MPC_RNDUZ],
39
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 41), GMP::F("-0x123456789abcdep+52", 59, 16)]), MPC::MPC_RNDDZ],
40
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 39), GMP::F("-0x123456789abcdep+52", 60, 16)]), MPC::MPC_RNDNZ],
41
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 37), GMP::F( "0x123456789abcdep+52", 61, 16)]), MPC::MPC_RNDUU],
42
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 35), GMP::F( "0x123456789abcdep+52", 62, 16)]), MPC::MPC_RNDDU],
43
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 33), GMP::F("-0x123456789abcdep+52", 63, 16)]), MPC::MPC_RNDNU],
44
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 31), GMP::F("-0x123456789abcdep+52", 64, 16)]), MPC::MPC_RNDZU],
45
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 29), GMP::F( "0x123456789abcdep+52", 65, 16)]), MPC::MPC_RNDDD],
46
+ [[0, 53], ["-0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 27), GMP::F( "0x123456789abcdep+52", 66, 16)]), MPC::MPC_RNDND],
47
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 25), GMP::F("-0x123456789abcdep+52", 67, 16)]), MPC::MPC_RNDZD],
48
+ [[0, 53], [ "0x123456789abcdep+52", 53, 16], MPC.new([GMP::F(0, 23), GMP::F("-0x123456789abcdep+52", 68, 16)]), MPC::MPC_RNDUD]
49
+ ]
50
+ data.each do |expected_real, expected_imag, input, rounding_mode|
51
+ actual = input.conj(rounding_mode)
52
+ actual.real.should eq GMP::F.new(*expected_real)
53
+ actual.imag.should eq GMP::F.new(*expected_imag)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,54 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/cos.dat
4
+ describe MPC, '#cos' do
5
+ it 'should calculate the cosine of a pure real argument' do
6
+ data = [
7
+ ["0x8a51407da8344p-52", MPC.new([GMP::F(-1, 7), GMP::F(0, 7)])],
8
+ ["0x8a51407da8344p-52", MPC.new([GMP::F( 1, 7), GMP::F(0, 7)])]
9
+ ]
10
+ data.each do |expected, input|
11
+ actual = input.cos(MPC::MPC_RNDNN, 50, 50)
12
+ actual.real.should eq GMP::F.new(expected, 50, 16)
13
+ actual.imag.should eq GMP::F(0)
14
+ end
15
+ end
16
+
17
+ it 'should calculate the cosine of a pure imaginary argument' do
18
+ data = [
19
+ ["0x18b07551d9f55p-48", MPC.new([GMP::F(0, 7), GMP::F(-1, 7)])],
20
+ ["0x18b07551d9f55p-48", MPC.new([GMP::F(0, 7), GMP::F( 1, 7)])]
21
+ ]
22
+ data.each do |expected, input|
23
+ actual = input.cos(MPC::MPC_RNDNN, 50, 50)
24
+ actual.real.should eq GMP::F.new(expected, 50, 16)
25
+ actual.imag.should eq GMP::F(0)
26
+ end
27
+ end
28
+
29
+ it 'should calculate the cosine of an argument with +1 and -1' do
30
+ data = [
31
+ ["0xd56f54b7a1accp-52", "-0xfd28666957478p-52", MPC.new([GMP::F(-1, 7), GMP::F(-1, 7)])],
32
+ ["0xd56f54b7a1accp-52", "0xfd28666957478p-52", MPC.new([GMP::F(-1, 7), GMP::F( 1, 7)])],
33
+ ["0xd56f54b7a1accp-52", "0xfd28666957478p-52", MPC.new([GMP::F( 1, 7), GMP::F(-1, 7)])],
34
+ ["0xd56f54b7a1accp-52", "-0xfd28666957478p-52", MPC.new([GMP::F( 1, 7), GMP::F( 1, 7)])]
35
+ ]
36
+ data.each do |expected_real, expected_imag, input|
37
+ actual = input.cos(MPC::MPC_RNDNN, 50, 50)
38
+ actual.real.should eq GMP::F.new(expected_real, 50, 16)
39
+ actual.imag.should eq GMP::F.new(expected_imag, 50, 16)
40
+ end
41
+ end
42
+
43
+ it 'should calculate the cosine of ieee-754 double precision numbers' do
44
+ data = [
45
+ [[514], [0], [0], ["0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDNN],
46
+ [["0x100FFFFFFFFFFFp-43", 53, 16], [0], [0], ["0x1BBDD1808C59A3p-50", 53, 16], MPC::MPC_RNDDD],
47
+ ]
48
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
49
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F.new(*input_imag)]).cos(rounding_mode)
50
+ actual.real.should eq GMP::F.new(*expected_real)
51
+ actual.imag.should eq GMP::F.new(*expected_imag)
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,26 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/cosh.dat
4
+ describe MPC, '#cosh' do
5
+ it 'should calculate the hyperbolic cosine of special values' do
6
+ data = [
7
+ [1, MPC.new([GMP::F(0, 2), GMP::F(0, 2)])]
8
+ ]
9
+ data.each do |expected, input|
10
+ actual = input.cosh(MPC::MPC_RNDNN, 2, 2)
11
+ actual.real.should eq GMP::F.new(expected, 2)
12
+ actual.imag.should eq GMP::F(0)
13
+ end
14
+ end
15
+
16
+ it 'should calculate the hyperbolic sine of ieee-754 double precision numbers' do
17
+ data = [
18
+ [["0x10000000000001p-53", 53, 16], ["0x10000000000001p-52", 53, 16], ["0x1DA2E1BD2C9EBCp-53", 53, 16], ["0x138AADEA15829Fp-52", 53, 16], MPC::MPC_RNDNN],
19
+ ]
20
+ data.each do |expected_real, expected_imag, input_real, input_imag, rounding_mode|
21
+ actual = MPC.new([GMP::F.new(*input_real), GMP::F.new(*input_imag)]).cosh(rounding_mode)
22
+ actual.real.should eq GMP::F.new(*expected_real)
23
+ actual.imag.should eq GMP::F.new(*expected_imag)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,62 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/exp.dat
4
+ describe MPC, '#exp' do
5
+ it 'should calculate the exponential of a pure real number' do
6
+ data = [
7
+ [["0x1936dc5690c08fp-44", 53, 16], [ 0, 2], MPC.new([GMP::F( 6, 53), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [["0x4b0556e084f3d0p-60", 53, 16], [ 0, 3], MPC.new([GMP::F(-4, 54), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [["0xec7325c6a6ed70p-53", 53, 16], [ 0, 4], MPC.new([GMP::F( 2, 55), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [["0x178b56362cef37p-54", 53, 16], [ 0, 5], MPC.new([GMP::F(-1, 56), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [["0x3699205c4e74b0p-48", 53, 16], [ 0, 6], MPC.new([GMP::F( 4, 57), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [["0x454aaa8efe0730p-57", 53, 16], [ 0, 7], MPC.new([GMP::F(-2, 58), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [["0x15bf0a8b145769p-51", 53, 16], [ 0, 8], MPC.new([GMP::F( 1, 59), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [["0xa2728f889ea6b0p-64", 53, 16], [ 0, 9], MPC.new([GMP::F(-6, 60), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [["0xec7325c6a6ed70p-53", 53, 16], [ 0, 10], MPC.new([GMP::F( 2, 61), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [["0x178b56362cef37p-54", 53, 16], [ 0, 11], MPC.new([GMP::F(-1, 62), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [["0x1936dc5690c08fp-44", 53, 16], [ 0, 12], MPC.new([GMP::F( 6, 63), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [["0x4b0556e084f3d0p-60", 53, 16], [ 0, 13], MPC.new([GMP::F(-4, 64), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [["0x15bf0a8b145769p-51", 53, 16], [ 0, 14], MPC.new([GMP::F( 1, 65), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [["0xa2728f889ea6b0p-64", 53, 16], [ 0, 15], MPC.new([GMP::F(-6, 66), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [["0x3699205c4e74b0p-48", 53, 16], [ 0, 16], MPC.new([GMP::F( 4, 66), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [["0x454aaa8efe0730p-57", 53, 16], [ 0, 17], MPC.new([GMP::F(-2, 66), GMP::F(0, 2)]), MPC::MPC_RNDUD]
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.exp(rounding_mode)
26
+ actual.real.should eq GMP::F.new(*expected_real)
27
+ actual.imag.should eq GMP::F.new(*expected_imag)
28
+ end
29
+ end
30
+
31
+ it 'should calculate the exponential of a pure imaginary number' do
32
+ data = [
33
+ [[ "0x1eb9b7097822f5p-53", 53, 16], ["-0x4787c62ac28b0p-52", 53, 16], MPC.new([GMP::F(0,53), GMP::F( 6, 53)]), MPC::MPC_RNDNN],
34
+ [["-0x53aa981b6c9300p-55", 53, 16], ["-0xc1bdceeee0f57p-52", 53, 16], MPC.new([GMP::F(0,51), GMP::F( 4, 54)]), MPC::MPC_RNDZN],
35
+ [["-0x6a88995d4dc810p-56", 53, 16], ["-0xe8c7b7568da23p-52", 53, 16], MPC.new([GMP::F(0,49), GMP::F(-2, 55)]), MPC::MPC_RNDUN],
36
+ [[ "0x114a280fb5068bp-53", 53, 16], ["-0xd76aa47848677p-52", 53, 16], MPC.new([GMP::F(0,47), GMP::F(-1, 56)]), MPC::MPC_RNDDN],
37
+ [["-0x53aa981b6c9300p-55", 53, 16], ["-0xc1bdceeee0f57p-52", 53, 16], MPC.new([GMP::F(0,45), GMP::F( 4, 57)]), MPC::MPC_RNDZZ],
38
+ [["-0x6a88995d4dc810p-56", 53, 16], [ "0x1d18f6ead1b445p-53", 53, 16], MPC.new([GMP::F(0,43), GMP::F( 2, 58)]), MPC::MPC_RNDUZ],
39
+ [[ "0x114a280fb5068bp-53", 53, 16], ["-0xd76aa47848677p-52", 53, 16], MPC.new([GMP::F(0,41), GMP::F(-1, 59)]), MPC::MPC_RNDDZ],
40
+ [[ "0x1eb9b7097822f5p-53", 53, 16], [ "0x4787c62ac28b0p-52", 53, 16], MPC.new([GMP::F(0,39), GMP::F(-6, 60)]), MPC::MPC_RNDNZ],
41
+ [["-0x6a88995d4dc810p-56", 53, 16], [ "0xe8c7b7568da23p-52", 53, 16], MPC.new([GMP::F(0,37), GMP::F( 2, 61)]), MPC::MPC_RNDUU],
42
+ [[ "0x114a280fb5068bp-53", 53, 16], [ "0x1aed548f090cefp-53", 53, 16], MPC.new([GMP::F(0,35), GMP::F( 1, 62)]), MPC::MPC_RNDDU],
43
+ [[ "0x1eb9b7097822f5p-53", 53, 16], [ "0x11e1f18ab0a2c1p-54", 53, 16], MPC.new([GMP::F(0,33), GMP::F(-6, 63)]), MPC::MPC_RNDNU],
44
+ [["-0x53aa981b6c9300p-55", 53, 16], [ "0x1837b9dddc1eafp-53", 53, 16], MPC.new([GMP::F(0,31), GMP::F(-4, 64)]), MPC::MPC_RNDZU],
45
+ [[ "0x114a280fb5068bp-53", 53, 16], [ "0xd76aa47848677p-52", 53, 16], MPC.new([GMP::F(0,29), GMP::F( 1, 65)]), MPC::MPC_RNDDD],
46
+ [[ "0x1eb9b7097822f5p-53", 53, 16], ["-0x11e1f18ab0a2c1p-54", 53, 16], MPC.new([GMP::F(0,27), GMP::F( 6, 66)]), MPC::MPC_RNDND],
47
+ [["-0x53aa981b6c9300p-55", 53, 16], [ "0xc1bdceeee0f57p-52", 53, 16], MPC.new([GMP::F(0,25), GMP::F(-4, 67)]), MPC::MPC_RNDZD],
48
+ [["-0x6a88995d4dc810p-56", 53, 16], ["-0xe8c7b7568da23p-52", 53, 16], MPC.new([GMP::F(0,23), GMP::F(-2, 68)]), MPC::MPC_RNDUD]
49
+ ]
50
+ data.each do |expected_real, expected_imag, input, rounding_mode|
51
+ actual = input.exp(rounding_mode)
52
+ actual.real.should eq GMP::F.new(*expected_real)
53
+ actual.imag.should eq GMP::F.new(*expected_imag)
54
+ end
55
+ end
56
+
57
+ it 'should calculate the exponential of input close to zero' do
58
+ actual = MPC.new([GMP::F("0x1E02AE0D0F6Fp-7213521", 53, 16), GMP::F("0x5D7A2148071Fp-7213522", 53, 16)]).exp(MPC::MPC_RNDNN)
59
+ actual.real.should eq GMP::F(1)
60
+ actual.imag.should eq GMP::F("0x5D7A2148071Fp-7213522", 53, 16)
61
+ end
62
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC, "methods with optional hash arguments" do
4
+ before do
5
+ #@z_sqr = MPC.new([GMP::F("0x10000000020000p+04", 53, 16), GMP::F("0x10000000effff", 53, 16)])
6
+ #@z = MPC.new([GMP::F("0x400008000180fp-22", 53, 16), GMP::F("0x7ffff0077efcbp-32", 53, 16)])
7
+ @z_sqr = MPC.new([GMP::F("-0x10000000020000p+04", 53, 16), GMP::F("0x10000000efffefp-04", 53, 16)])
8
+ @z = MPC.new([GMP::F("0x7ffff0077efcbp-32", 53, 16), GMP::F("0x400008000180fp-22", 53, 16)])
9
+ end
10
+
11
+ it "should allow #sqr to accept :rounding_mode hash argument" do
12
+ @z.sqr(:rounding_mode => MPC::MPC_RNDZZ).should eq @z_sqr
13
+ @z.sqr(:rounding => MPC::MPC_RNDZZ).should eq @z_sqr
14
+ @z.sqr(:round => MPC::MPC_RNDZZ).should eq @z_sqr
15
+ @z.sqr(:rnd => MPC::MPC_RNDZZ).should eq @z_sqr
16
+ end
17
+ end
@@ -0,0 +1,37 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/log.dat
4
+ describe MPC, '#log' do
5
+ it 'should calculate the logarithm of 1 + 0i' do
6
+ actual = MPC.new([1, 0]).log
7
+ actual.real.should eq 0
8
+ actual.imag.should eq 0
9
+ end
10
+
11
+ it 'should calculate the logarithm of -1 + 0i' do
12
+ actual = MPC.new([-1, 0]).log
13
+ actual.real.should eq 0
14
+ actual.imag.should eq GMP::F("0x3243F6A8885A3p-48", 53, 16)
15
+
16
+ actual = MPC.new([GMP::F(-1), -GMP::F(0)]).log
17
+ actual.real.should eq 0
18
+ actual.imag.should eq GMP::F("-0x3243F6A8885A3p-48", 53, 16)
19
+ end
20
+
21
+ it 'should calculate the logarithm of x +i*y with either x or y zero and the other non-zero' do
22
+ data = [
23
+ [["0xB5535E0FD3FBDp-50", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x11", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
24
+ [["0xB5535E0FD3FBDp-50", 53, 16], [ "0x3243F6A8885A3p-49", 53, 16], MPC.new([GMP::F(0, 2), GMP::F( "0x11", 5, 16)]), MPC::MPC_RNDNN],
25
+ [["0x5E38D81812CCBp-49", 53, 16], [ "0x3243F6A8885A3p-48", 53, 16], MPC.new([GMP::F("-0x13", 5, 16), GMP::F(0, 2)]), MPC::MPC_RNDNN],
26
+ [["0x5E38D81812CCBp-49", 53, 16], ["-0x3243F6A8885A3p-48", 53, 16], MPC.new([GMP::F("-0x13", 5, 16), -GMP::F(0, 2)]), MPC::MPC_RNDNN],
27
+ [["0x5E38D81812CCBp-49", 53, 16], ["-0x3243F6A8885A3p-49", 53, 16], MPC.new([GMP::F(0, 2), GMP::F("-0x13", 5, 16)]), MPC::MPC_RNDNN],
28
+ ]
29
+ data.each do |expected_real, expected_imag, input, rounding_mode|
30
+ actual = input.log(rounding_mode)
31
+ actual.real.should eq GMP::F.new(*expected_real)
32
+ actual.imag.should eq GMP::F.new(*expected_imag)
33
+ end
34
+ end
35
+
36
+ ### There are still more tests in log.data, each a result of some bug or other thing
37
+ end
@@ -0,0 +1,41 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe "MPC_SINGLE_FUNCTION args" do
4
+ before do
5
+ @functions = [
6
+ :sin, :cos, :tan,
7
+ :sinh, :cosh, :tanh,
8
+ :asin, :acos, :atan
9
+ ]
10
+ @z = MPC.new(0,0)
11
+ end
12
+ it "should accept no arguments" do
13
+ @functions.each do |func|
14
+ expect { @z.send(func) }.to_not raise_error(ArgumentError)
15
+ end
16
+ end
17
+
18
+ it "should accept a single rounding mode argument, MPC_RNDNN" do
19
+ @functions.each do |func|
20
+ expect { @z.send(func, MPC::MPC_RNDNN) }.to_not raise_error(ArgumentError)
21
+ end
22
+ end
23
+
24
+ it "should accept a single rounding mode argument, MPC_RNDZD" do
25
+ @functions.each do |func|
26
+ expect { @z.send(func, MPC::MPC_RNDZD) }.to_not raise_error(ArgumentError)
27
+ end
28
+ end
29
+
30
+ it "should accept a single rounding mode argument and a single precision" do
31
+ @functions.each do |func|
32
+ expect { @z.send(func, MPC::MPC_RNDZZ, 128) }.to_not raise_error(ArgumentError)
33
+ end
34
+ end
35
+
36
+ it "should accept a single rounding mode argument and two precisions" do
37
+ @functions.each do |func|
38
+ expect { @z.send(func, MPC::MPC_RNDZZ, 128, 256) }.to_not raise_error(ArgumentError)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,30 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ # All tests adapted from MPC 1.0.1's tests/neg.dat
4
+ describe MPC, '#@-' do
5
+ it 'should calculate the negation of a pure real argument' do
6
+ data = [
7
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 2], MPC.new([GMP::F( "0x123456789abcdep+52", 53, 16), GMP::F(0, 17)]), MPC::MPC_RNDNN],
8
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 3], MPC.new([GMP::F("-0x123456789abcdep+52", 54, 16), GMP::F(0, 16)]), MPC::MPC_RNDZN],
9
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 4], MPC.new([GMP::F( "0x123456789abcdep+52", 55, 16), GMP::F(0, 15)]), MPC::MPC_RNDUN],
10
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 5], MPC.new([GMP::F("-0x123456789abcdep+52", 56, 16), GMP::F(0, 14)]), MPC::MPC_RNDDN],
11
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 6], MPC.new([GMP::F( "0x123456789abcdep+52", 57, 16), GMP::F(0, 13)]), MPC::MPC_RNDZZ],
12
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 7], MPC.new([GMP::F("-0x123456789abcdep+52", 58, 16), GMP::F(0, 12)]), MPC::MPC_RNDUZ],
13
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 8], MPC.new([GMP::F( "0x123456789abcdep+52", 59, 16), GMP::F(0, 11)]), MPC::MPC_RNDDZ],
14
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 9], MPC.new([GMP::F("-0x123456789abcdep+52", 60, 16), GMP::F(0, 10)]), MPC::MPC_RNDNZ],
15
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 10], MPC.new([GMP::F( "0x123456789abcdep+52", 61, 16), GMP::F(0, 9)]), MPC::MPC_RNDUU],
16
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 11], MPC.new([GMP::F("-0x123456789abcdep+52", 62, 16), GMP::F(0, 8)]), MPC::MPC_RNDDU],
17
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 12], MPC.new([GMP::F( "0x123456789abcdep+52", 63, 16), GMP::F(0, 7)]), MPC::MPC_RNDNU],
18
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 13], MPC.new([GMP::F("-0x123456789abcdep+52", 64, 16), GMP::F(0, 6)]), MPC::MPC_RNDZU],
19
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 14], MPC.new([GMP::F( "0x123456789abcdep+52", 65, 16), GMP::F(0, 5)]), MPC::MPC_RNDDD],
20
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 15], MPC.new([GMP::F("-0x123456789abcdep+52", 66, 16), GMP::F(0, 4)]), MPC::MPC_RNDND],
21
+ [["-0x123456789abcdep+52", 53, 16], [ 0, 16], MPC.new([GMP::F( "0x123456789abcdep+52", 67, 16), GMP::F(0, 3)]), MPC::MPC_RNDZD],
22
+ [[ "0x123456789abcdep+52", 53, 16], [ 0, 17], MPC.new([GMP::F("-0x123456789abcdep+52", 68, 16), GMP::F(0, 2)]), MPC::MPC_RNDUD]
23
+ ]
24
+ data.each do |expected_real, expected_imag, input, rounding_mode|
25
+ actual = input.neg(rounding_mode)
26
+ actual.real.should eq GMP::F.new(*expected_real)
27
+ actual.imag.should eq GMP::F.new(*expected_imag)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,97 @@
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
+
3
+ describe MPC, '#initialize without precision or rounding args' do
4
+ before do
5
+ @z1 = GMP::Z(8)
6
+ @z2 = GMP::Z(-13)
7
+ @q1 = GMP::Q(1,3)
8
+ @q2 = GMP::Q(-2,3)
9
+ @f1 = GMP::F(1.5)
10
+ @f2 = GMP::F(-2.5)
11
+ end
12
+ it 'should not raise anything when initialized with no args' do
13
+ expect { MPC.new() }.to_not raise_error
14
+ end
15
+
16
+ it 'should not raise anything when initialized with 0' do
17
+ expect { MPC.new(0) }.to_not raise_error
18
+ end
19
+
20
+ it 'should not raise anything when initialized with a negative Fixnum' do
21
+ expect { MPC.new(-32) }.to_not raise_error
22
+ end
23
+
24
+ it 'should not raise anything when initialized with a positive Fixnum' do
25
+ expect { MPC.new(32) }.to_not raise_error
26
+ end
27
+
28
+ it 'should not raise anything when initialized with 0.0' do
29
+ expect { MPC.new(0.0) }.to_not raise_error
30
+ end
31
+
32
+ it 'should not raise anything when initialized with a positive Float' do
33
+ expect { MPC.new(3.14) }.to_not raise_error
34
+ expect { MPC.new(1.618) }.to_not raise_error
35
+ end
36
+
37
+ it 'should not raise anything when initialized with a positive GMP::Z' do
38
+ expect { MPC.new(@z1) }.to_not raise_error
39
+ end
40
+
41
+ it 'should not raise anything when initialized with a negative GMP::Z' do
42
+ expect { MPC.new(@z2) }.to_not raise_error
43
+ end
44
+
45
+ it 'should not raise anything when initialized with a positive GMP::Q' do
46
+ expect { MPC.new(@q1) }.to_not raise_error
47
+ end
48
+
49
+ it 'should not raise anything when initialized with a negative GMP::Q' do
50
+ expect { MPC.new(@q2) }.to_not raise_error
51
+ end
52
+
53
+ it 'should not raise anything when initialized with a positive GMP::F' do
54
+ expect { MPC.new(@f1) }.to_not raise_error
55
+ end
56
+
57
+ it 'should not raise anything when initialized with a negative GMP::F' do
58
+ expect { MPC.new(@f2) }.to_not raise_error
59
+ end
60
+
61
+ it 'should not raise anything when initialized with an Array of 0\'s' do
62
+ expect { MPC.new([0,0]) }.to_not raise_error
63
+ end
64
+
65
+ it 'should not raise anything when initialized with an Array of Fixnum\'s' do
66
+ expect { MPC.new([-2**10, 2**11]) }.to_not raise_error
67
+ end
68
+
69
+ it 'should not raise anything when initialized with an Array of Float\'s' do
70
+ expect { MPC.new([1.4142135623730951, 1.4142135623730951]) }.to_not raise_error
71
+ end
72
+
73
+ it 'should not raise anything when initialized with an Array of GMP::Z\'s' do
74
+ expect { MPC.new([@z1, @z2]) }.to_not raise_error
75
+ end
76
+
77
+ it 'should not raise anything when initialized with an Array of GMP::Q\'s' do
78
+ expect { MPC.new([@q1, @q2]) }.to_not raise_error
79
+ end
80
+
81
+ it 'should not raise anything when initialized with an Array of GMP::F\'s' do
82
+ expect { MPC.new([@f1, @f2]) }.to_not raise_error
83
+ end
84
+
85
+ it 'should raise TypeError when initialized with an Array of mixed types' do
86
+ expect { MPC.new([0, 0.0]) }.to raise_error(TypeError)
87
+ expect { MPC.new([0, @z1]) }.to raise_error(TypeError)
88
+ expect { MPC.new([@f1, 0.0]) }.to raise_error(TypeError)
89
+ expect { MPC.new([@z1, @f1]) }.to raise_error(TypeError)
90
+ expect { MPC.new([@q1, 42]) }.to raise_error(TypeError)
91
+ end
92
+
93
+ it 'should initialize default values correctly' do
94
+ MPC.new(0).should eq MPC.new()
95
+ MPC.new(0.0).should eq MPC.new()
96
+ end
97
+ end