1" test float functions
2
3if !has('float')
4  finish
5end
6
7func Test_abs()
8  call assert_equal('1.23', string(abs(1.23)))
9  call assert_equal('1.23', string(abs(-1.23)))
10  call assert_equal('0.0', string(abs(0.0)))
11  call assert_equal('0.0', string(abs(1.0/(1.0/0.0))))
12  call assert_equal('0.0', string(abs(-1.0/(1.0/0.0))))
13  call assert_equal('inf', string(abs(1.0/0.0)))
14  call assert_equal('inf', string(abs(-1.0/0.0)))
15  call assert_equal('nan', string(abs(0.0/0.0)))
16endfunc
17
18func Test_sqrt()
19  call assert_equal('0.0', string(sqrt(0.0)))
20  call assert_equal('1.414214', string(sqrt(2.0)))
21  call assert_equal('inf', string(sqrt(1.0/0.0)))
22  call assert_equal('nan', string(sqrt(-1.0)))
23  call assert_equal('nan', string(sqrt(0.0/0.0)))
24endfunc
25
26func Test_log()
27  call assert_equal('0.0', string(log(1.0)))
28  call assert_equal('-0.693147', string(log(0.5)))
29  call assert_equal('-inf', string(log(0.0)))
30  call assert_equal('nan', string(log(-1.0)))
31  call assert_equal('inf', string(log(1.0/0.0)))
32  call assert_equal('nan', string(log(0.0/0.0)))
33endfunc
34
35func Test_log10()
36  call assert_equal('0.0', string(log10(1.0)))
37  call assert_equal('2.0', string(log10(100.0)))
38  call assert_equal('2.079181', string(log10(120.0)))
39  call assert_equal('-inf', string(log10(0.0)))
40  call assert_equal('nan', string(log10(-1.0)))
41  call assert_equal('inf', string(log10(1.0/0.0)))
42  call assert_equal('nan', string(log10(0.0/0.0)))
43endfunc
44
45func Test_exp()
46  call assert_equal('1.0', string(exp(0.0)))
47  call assert_equal('7.389056', string(exp(2.0)))
48  call assert_equal('0.367879', string(exp(-1.0)))
49  call assert_equal('inf', string(exp(1.0/0.0)))
50  call assert_equal('0.0', string(exp(-1.0/0.0)))
51  call assert_equal('nan', string(exp(0.0/0.0)))
52endfunc
53
54func Test_sin()
55  call assert_equal('0.0', string(sin(0.0)))
56  call assert_equal('0.841471', string(sin(1.0)))
57  call assert_equal('-0.479426', string(sin(-0.5)))
58  call assert_equal('nan', string(sin(0.0/0.0)))
59  call assert_equal('nan', string(sin(1.0/0.0)))
60  call assert_equal('0.0', string(sin(1.0/(1.0/0.0))))
61  call assert_equal('-0.0', string(sin(-1.0/(1.0/0.0))))
62endfunc
63
64func Test_asin()
65  call assert_equal('0.0', string(asin(0.0)))
66  call assert_equal('1.570796', string(asin(1.0)))
67  call assert_equal('-0.523599', string(asin(-0.5)))
68  call assert_equal('nan', string(asin(1.1)))
69  call assert_equal('nan', string(asin(1.0/0.0)))
70  call assert_equal('nan', string(asin(0.0/0.0)))
71endfunc
72
73func Test_sinh()
74  call assert_equal('0.0', string(sinh(0.0)))
75  call assert_equal('0.521095', string(sinh(0.5)))
76  call assert_equal('-1.026517', string(sinh(-0.9)))
77  call assert_equal('inf', string(sinh(1.0/0.0)))
78  call assert_equal('-inf', string(sinh(-1.0/0.0)))
79  call assert_equal('nan', string(sinh(0.0/0.0)))
80endfunc
81
82func Test_cos()
83  call assert_equal('1.0', string(cos(0.0)))
84  call assert_equal('0.540302', string(cos(1.0)))
85  call assert_equal('0.877583', string(cos(-0.5)))
86  call assert_equal('nan', string(cos(0.0/0.0)))
87  call assert_equal('nan', string(cos(1.0/0.0)))
88endfunc
89
90func Test_acos()
91  call assert_equal('1.570796', string(acos(0.0)))
92  call assert_equal('0.0', string(acos(1.0)))
93  call assert_equal('3.141593', string(acos(-1.0)))
94  call assert_equal('2.094395', string(acos(-0.5)))
95  call assert_equal('nan', string(acos(1.1)))
96  call assert_equal('nan', string(acos(1.0/0.0)))
97  call assert_equal('nan', string(acos(0.0/0.0)))
98endfunc
99
100func Test_cosh()
101  call assert_equal('1.0', string(cosh(0.0)))
102  call assert_equal('1.127626', string(cosh(0.5)))
103  call assert_equal('inf', string(cosh(1.0/0.0)))
104  call assert_equal('inf', string(cosh(-1.0/0.0)))
105  call assert_equal('nan', string(cosh(0.0/0.0)))
106endfunc
107
108func Test_tan()
109  call assert_equal('0.0', string(tan(0.0)))
110  call assert_equal('0.546302', string(tan(0.5)))
111  call assert_equal('-0.546302', string(tan(-0.5)))
112  call assert_equal('nan', string(tan(1.0/0.0)))
113  call assert_equal('nan', string(cos(0.0/0.0)))
114  call assert_equal('0.0', string(tan(1.0/(1.0/0.0))))
115  call assert_equal('-0.0', string(tan(-1.0/(1.0/0.0))))
116endfunc
117
118func Test_atan()
119  call assert_equal('0.0', string(atan(0.0)))
120  call assert_equal('0.463648', string(atan(0.5)))
121  call assert_equal('-0.785398', string(atan(-1.0)))
122  call assert_equal('1.570796', string(atan(1.0/0.0)))
123  call assert_equal('-1.570796', string(atan(-1.0/0.0)))
124  call assert_equal('nan', string(atan(0.0/0.0)))
125endfunc
126
127func Test_atan2()
128  call assert_equal('-2.356194', string(atan2(-1, -1)))
129  call assert_equal('2.356194', string(atan2(1, -1)))
130  call assert_equal('0.0', string(atan2(1.0, 1.0/0.0)))
131  call assert_equal('1.570796', string(atan2(1.0/0.0, 1.0)))
132  call assert_equal('nan', string(atan2(0.0/0.0, 1.0)))
133endfunc
134
135func Test_tanh()
136  call assert_equal('0.0', string(tanh(0.0)))
137  call assert_equal('0.462117', string(tanh(0.5)))
138  call assert_equal('-0.761594', string(tanh(-1.0)))
139  call assert_equal('1.0', string(tanh(1.0/0.0)))
140  call assert_equal('-1.0', string(tanh(-1.0/0.0)))
141  call assert_equal('nan', string(tanh(0.0/0.0)))
142endfunc
143
144func Test_fmod()
145  call assert_equal('0.13', string(fmod(12.33, 1.22)))
146  call assert_equal('-0.13', string(fmod(-12.33, 1.22)))
147  call assert_equal('nan', string(fmod(1.0/0.0, 1.0)))
148  " On Windows we get "nan" instead of 1.0, accept both.
149  let res = string(fmod(1.0, 1.0/0.0))
150  if res != 'nan'
151    call assert_equal('1.0', res)
152  endif
153  call assert_equal('nan', string(fmod(1.0, 0.0)))
154endfunc
155
156func Test_pow()
157  call assert_equal('1.0', string(pow(0.0, 0.0)))
158  call assert_equal('8.0', string(pow(2.0, 3.0)))
159  call assert_equal('nan', string(pow(2.0, 0.0/0.0)))
160  call assert_equal('nan', string(pow(0.0/0.0, 3.0)))
161  call assert_equal('nan', string(pow(0.0/0.0, 3.0)))
162  call assert_equal('inf', string(pow(2.0, 1.0/0.0)))
163  call assert_equal('inf', string(pow(1.0/0.0, 3.0)))
164endfunc
165
166func Test_str2float()
167  call assert_equal('1.0', string(str2float('1')))
168  call assert_equal('1.0', string(str2float(' 1 ')))
169  call assert_equal('1.0', string(str2float(' 1.0 ')))
170  call assert_equal('1.23', string(str2float('1.23')))
171  call assert_equal('1.23', string(str2float('1.23abc')))
172  call assert_equal('1.0e40', string(str2float('1e40')))
173
174  call assert_equal('1.0', string(str2float('+1')))
175  call assert_equal('1.0', string(str2float('+1')))
176  call assert_equal('1.0', string(str2float(' +1 ')))
177  call assert_equal('1.0', string(str2float(' + 1 ')))
178
179  call assert_equal('-1.0', string(str2float('-1')))
180  call assert_equal('-1.0', string(str2float('-1')))
181  call assert_equal('-1.0', string(str2float(' -1 ')))
182  call assert_equal('-1.0', string(str2float(' - 1 ')))
183
184  call assert_equal('inf', string(str2float('1e1000')))
185  call assert_equal('inf', string(str2float('inf')))
186  call assert_equal('-inf', string(str2float('-inf')))
187  call assert_equal('inf', string(str2float('Inf')))
188  call assert_equal('nan', string(str2float('nan')))
189  call assert_equal('nan', string(str2float('NaN')))
190endfunc
191
192func Test_floor()
193  call assert_equal('2.0', string(floor(2.0)))
194  call assert_equal('2.0', string(floor(2.11)))
195  call assert_equal('2.0', string(floor(2.99)))
196  call assert_equal('-3.0', string(floor(-2.11)))
197  call assert_equal('-3.0', string(floor(-2.99)))
198  call assert_equal('nan', string(floor(0.0/0.0)))
199  call assert_equal('inf', string(floor(1.0/0.0)))
200  call assert_equal('-inf', string(floor(-1.0/0.0)))
201endfunc
202
203func Test_ceil()
204  call assert_equal('2.0', string(ceil(2.0)))
205  call assert_equal('3.0', string(ceil(2.11)))
206  call assert_equal('3.0', string(ceil(2.99)))
207  call assert_equal('-2.0', string(ceil(-2.11)))
208  call assert_equal('-2.0', string(ceil(-2.99)))
209  call assert_equal('nan', string(ceil(0.0/0.0)))
210  call assert_equal('inf', string(ceil(1.0/0.0)))
211  call assert_equal('-inf', string(ceil(-1.0/0.0)))
212endfunc
213
214func Test_round()
215  call assert_equal('2.0', string(round(2.1)))
216  call assert_equal('3.0', string(round(2.5)))
217  call assert_equal('3.0', string(round(2.9)))
218  call assert_equal('-2.0', string(round(-2.1)))
219  call assert_equal('-3.0', string(round(-2.5)))
220  call assert_equal('-3.0', string(round(-2.9)))
221  call assert_equal('nan', string(round(0.0/0.0)))
222  call assert_equal('inf', string(round(1.0/0.0)))
223  call assert_equal('-inf', string(round(-1.0/0.0)))
224endfunc
225
226func Test_trunc()
227  call assert_equal('2.0', string(trunc(2.1)))
228  call assert_equal('2.0', string(trunc(2.5)))
229  call assert_equal('2.0', string(trunc(2.9)))
230  call assert_equal('-2.0', string(trunc(-2.1)))
231  call assert_equal('-2.0', string(trunc(-2.5)))
232  call assert_equal('-2.0', string(trunc(-2.9)))
233  call assert_equal('nan', string(trunc(0.0/0.0)))
234  call assert_equal('inf', string(trunc(1.0/0.0)))
235  call assert_equal('-inf', string(trunc(-1.0/0.0)))
236endfunc
237
238func Test_isnan()
239  call assert_equal(0, isnan(1.0))
240  call assert_equal(1, isnan(0.0/0.0))
241  call assert_equal(0, isnan(1.0/0.0))
242  call assert_equal(0, isnan('a'))
243  call assert_equal(0, isnan([]))
244endfunc
245