1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
##
# Math Test
##
# Performs fuzzy check for equality on methods returning floats
# on the basis of the Math::TOLERANCE constant.
def check_float(a, b)
tolerance = Math::TOLERANCE
a = a.to_f
b = b.to_f
if a.finite? and b.finite?
(a-b).abs < tolerance
else
true
end
end
assert('Math.sin 0') do
check_float(Math.sin(0), 0)
end
assert('Math.sin PI/2') do
check_float(Math.sin(Math::PI / 2), 1)
end
assert('Math.cos 0') do
check_float(Math.cos(0), 1)
end
assert('Math.cos PI/2') do
check_float(Math.cos(Math::PI / 2), 0)
end
assert('Math.tan 0') do
check_float(Math.tan(0), 0)
end
assert('Math.tan PI/4') do
check_float(Math.tan(Math::PI / 4), 1)
end
assert('Fundamental trig identities') do
result = true
N = 13
N.times do |i|
a = Math::PI / N * i
ca = Math::PI / 2 - a
s = Math.sin(a)
c = Math.cos(a)
t = Math.tan(a)
result &= check_float(s, Math.cos(ca))
result &= check_float(t, 1 / Math.tan(ca))
result &= check_float(s ** 2 + c ** 2, 1)
result &= check_float(t ** 2 + 1, (1/c) ** 2)
result &= check_float((1/t) ** 2 + 1, (1/s) ** 2)
end
result
end
assert('Math.erf 0') do
check_float(Math.erf(0), 0)
end
assert('Math.exp 0') do
check_float(Math.exp(0), 1.0)
end
assert('Math.exp 1') do
check_float(Math.exp(1), 2.718281828459045)
end
assert('Math.exp 1.5') do
check_float(Math.exp(1.5), 4.4816890703380645)
end
assert('Math.log 1') do
check_float(Math.log(1), 0)
end
assert('Math.log E') do
check_float(Math.log(Math::E), 1.0)
end
assert('Math.log E**3') do
check_float(Math.log(Math::E**3), 3.0)
end
assert('Math.log2 1') do
check_float(Math.log2(1), 0.0)
end
assert('Math.log2 2') do
check_float(Math.log2(2), 1.0)
end
assert('Math.log10 1') do
check_float(Math.log10(1), 0.0)
end
assert('Math.log10 10') do
check_float(Math.log10(10), 1.0)
end
assert('Math.log10 10**100') do
check_float(Math.log10(10**100), 100.0)
end
assert('Math.sqrt') do
num = [0.0, 1.0, 2.0, 3.0, 4.0]
sqr = [0, 1, 4, 9, 16]
result = true
sqr.each_with_index do |v,i|
result &= check_float(Math.sqrt(v), num[i])
end
result
end
assert('Math.cbrt') do
num = [-2.0, -1.0, 0.0, 1.0, 2.0]
cub = [-8, -1, 0, 1, 8]
result = true
cub.each_with_index do |v,i|
result &= check_float(Math.cbrt(v), num[i])
end
result
end
assert('Math.hypot') do
check_float(Math.hypot(3, 4), 5.0)
end
assert('Math.frexp 1234') do
n = 1234
fraction, exponent = Math.frexp(n)
check_float(Math.ldexp(fraction, exponent), n)
end
assert('Math.erf 1') do
check_float(Math.erf(1), 0.842700792949715)
end
assert('Math.erfc 1') do
check_float(Math.erfc(1), 0.157299207050285)
end
assert('Math.erf -1') do
check_float(Math.erf(-1), -0.8427007929497148)
end
assert('Math.erfc -1') do
check_float(Math.erfc(-1), 1.8427007929497148)
end
|