Skip to content

Commit b3f8147

Browse files
committed
Added function fpow
1 parent 5827783 commit b3f8147

File tree

4 files changed

+327
-1
lines changed

4 files changed

+327
-1
lines changed

ext/standard/basic_functions.stub.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3274,6 +3274,11 @@ function fmod(float $num1, float $num2): float {}
32743274
*/
32753275
function fdiv(float $num1, float $num2): float {}
32763276

3277+
/**
3278+
* @compile-time-eval
3279+
*/
3280+
function fpow(float $num1, float $num2): float {}
3281+
32773282
/* microtime.c */
32783283

32793284
#ifdef HAVE_GETTIMEOFDAY

ext/standard/basic_functions_arginfo.h

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/standard/math.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,6 +1389,20 @@ PHP_FUNCTION(fdiv)
13891389
}
13901390
/* }}} */
13911391

1392+
/* {{{ Perform floating-point exponentiation with IEEE-754 semantics. */
1393+
PHP_FUNCTION(fpow)
1394+
{
1395+
double dividend, divisor;
1396+
1397+
ZEND_PARSE_PARAMETERS_START(2, 2)
1398+
Z_PARAM_DOUBLE(dividend)
1399+
Z_PARAM_DOUBLE(divisor)
1400+
ZEND_PARSE_PARAMETERS_END();
1401+
1402+
RETURN_DOUBLE(pow(dividend, divisor));
1403+
}
1404+
/* }}} */
1405+
13921406
/* {{{ Returns the integer quotient of the division of dividend by divisor */
13931407
PHP_FUNCTION(intdiv)
13941408
{

ext/standard/tests/math/fpow.phpt

Lines changed: 303 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,303 @@
1+
--TEST--
2+
fpow() function
3+
--FILE--
4+
<?php
5+
6+
$numbers = [0, 1, -1, 1.0, -1.0, 2, -2, 2.1, -2.1, 0.1, -0.1, 0.0 -0.0, 10, -10, INF, -INF, NAN];
7+
8+
foreach($numbers as $base) {
9+
foreach($numbers as $exp) {
10+
print str_pad($base, 4,' ', STR_PAD_LEFT).' ** ' . str_pad($exp,4) .' = '. fpow($base, $exp) . PHP_EOL;
11+
}
12+
}
13+
?>
14+
--EXPECT--
15+
0 ** 0 = 1
16+
0 ** 1 = 0
17+
0 ** -1 = INF
18+
0 ** 1 = 0
19+
0 ** -1 = INF
20+
0 ** 2 = 0
21+
0 ** -2 = INF
22+
0 ** 2.1 = 0
23+
0 ** -2.1 = INF
24+
0 ** 0.1 = 0
25+
0 ** -0.1 = INF
26+
0 ** 0 = 1
27+
0 ** 10 = 0
28+
0 ** -10 = INF
29+
0 ** INF = 0
30+
0 ** -INF = INF
31+
0 ** NAN = NAN
32+
1 ** 0 = 1
33+
1 ** 1 = 1
34+
1 ** -1 = 1
35+
1 ** 1 = 1
36+
1 ** -1 = 1
37+
1 ** 2 = 1
38+
1 ** -2 = 1
39+
1 ** 2.1 = 1
40+
1 ** -2.1 = 1
41+
1 ** 0.1 = 1
42+
1 ** -0.1 = 1
43+
1 ** 0 = 1
44+
1 ** 10 = 1
45+
1 ** -10 = 1
46+
1 ** INF = 1
47+
1 ** -INF = 1
48+
1 ** NAN = 1
49+
-1 ** 0 = 1
50+
-1 ** 1 = -1
51+
-1 ** -1 = -1
52+
-1 ** 1 = -1
53+
-1 ** -1 = -1
54+
-1 ** 2 = 1
55+
-1 ** -2 = 1
56+
-1 ** 2.1 = NAN
57+
-1 ** -2.1 = NAN
58+
-1 ** 0.1 = NAN
59+
-1 ** -0.1 = NAN
60+
-1 ** 0 = 1
61+
-1 ** 10 = 1
62+
-1 ** -10 = 1
63+
-1 ** INF = 1
64+
-1 ** -INF = 1
65+
-1 ** NAN = NAN
66+
1 ** 0 = 1
67+
1 ** 1 = 1
68+
1 ** -1 = 1
69+
1 ** 1 = 1
70+
1 ** -1 = 1
71+
1 ** 2 = 1
72+
1 ** -2 = 1
73+
1 ** 2.1 = 1
74+
1 ** -2.1 = 1
75+
1 ** 0.1 = 1
76+
1 ** -0.1 = 1
77+
1 ** 0 = 1
78+
1 ** 10 = 1
79+
1 ** -10 = 1
80+
1 ** INF = 1
81+
1 ** -INF = 1
82+
1 ** NAN = 1
83+
-1 ** 0 = 1
84+
-1 ** 1 = -1
85+
-1 ** -1 = -1
86+
-1 ** 1 = -1
87+
-1 ** -1 = -1
88+
-1 ** 2 = 1
89+
-1 ** -2 = 1
90+
-1 ** 2.1 = NAN
91+
-1 ** -2.1 = NAN
92+
-1 ** 0.1 = NAN
93+
-1 ** -0.1 = NAN
94+
-1 ** 0 = 1
95+
-1 ** 10 = 1
96+
-1 ** -10 = 1
97+
-1 ** INF = 1
98+
-1 ** -INF = 1
99+
-1 ** NAN = NAN
100+
2 ** 0 = 1
101+
2 ** 1 = 2
102+
2 ** -1 = 0.5
103+
2 ** 1 = 2
104+
2 ** -1 = 0.5
105+
2 ** 2 = 4
106+
2 ** -2 = 0.25
107+
2 ** 2.1 = 4.2870938501452
108+
2 ** -2.1 = 0.2332582478842
109+
2 ** 0.1 = 1.0717734625363
110+
2 ** -0.1 = 0.93303299153681
111+
2 ** 0 = 1
112+
2 ** 10 = 1024
113+
2 ** -10 = 0.0009765625
114+
2 ** INF = INF
115+
2 ** -INF = 0
116+
2 ** NAN = NAN
117+
-2 ** 0 = 1
118+
-2 ** 1 = -2
119+
-2 ** -1 = -0.5
120+
-2 ** 1 = -2
121+
-2 ** -1 = -0.5
122+
-2 ** 2 = 4
123+
-2 ** -2 = 0.25
124+
-2 ** 2.1 = NAN
125+
-2 ** -2.1 = NAN
126+
-2 ** 0.1 = NAN
127+
-2 ** -0.1 = NAN
128+
-2 ** 0 = 1
129+
-2 ** 10 = 1024
130+
-2 ** -10 = 0.0009765625
131+
-2 ** INF = INF
132+
-2 ** -INF = 0
133+
-2 ** NAN = NAN
134+
2.1 ** 0 = 1
135+
2.1 ** 1 = 2.1
136+
2.1 ** -1 = 0.47619047619048
137+
2.1 ** 1 = 2.1
138+
2.1 ** -1 = 0.47619047619048
139+
2.1 ** 2 = 4.41
140+
2.1 ** -2 = 0.22675736961451
141+
2.1 ** 2.1 = 4.7496380917422
142+
2.1 ** -2.1 = 0.21054235726688
143+
2.1 ** 0.1 = 1.0770154403044
144+
2.1 ** -0.1 = 0.92849179554696
145+
2.1 ** 0 = 1
146+
2.1 ** 10 = 1667.9880978201
147+
2.1 ** -10 = 0.0005995246616609
148+
2.1 ** INF = INF
149+
2.1 ** -INF = 0
150+
2.1 ** NAN = NAN
151+
-2.1 ** 0 = 1
152+
-2.1 ** 1 = -2.1
153+
-2.1 ** -1 = -0.47619047619048
154+
-2.1 ** 1 = -2.1
155+
-2.1 ** -1 = -0.47619047619048
156+
-2.1 ** 2 = 4.41
157+
-2.1 ** -2 = 0.22675736961451
158+
-2.1 ** 2.1 = NAN
159+
-2.1 ** -2.1 = NAN
160+
-2.1 ** 0.1 = NAN
161+
-2.1 ** -0.1 = NAN
162+
-2.1 ** 0 = 1
163+
-2.1 ** 10 = 1667.9880978201
164+
-2.1 ** -10 = 0.0005995246616609
165+
-2.1 ** INF = INF
166+
-2.1 ** -INF = 0
167+
-2.1 ** NAN = NAN
168+
0.1 ** 0 = 1
169+
0.1 ** 1 = 0.1
170+
0.1 ** -1 = 10
171+
0.1 ** 1 = 0.1
172+
0.1 ** -1 = 10
173+
0.1 ** 2 = 0.01
174+
0.1 ** -2 = 100
175+
0.1 ** 2.1 = 0.0079432823472428
176+
0.1 ** -2.1 = 125.89254117942
177+
0.1 ** 0.1 = 0.79432823472428
178+
0.1 ** -0.1 = 1.2589254117942
179+
0.1 ** 0 = 1
180+
0.1 ** 10 = 1.0E-10
181+
0.1 ** -10 = 10000000000
182+
0.1 ** INF = 0
183+
0.1 ** -INF = INF
184+
0.1 ** NAN = NAN
185+
-0.1 ** 0 = 1
186+
-0.1 ** 1 = -0.1
187+
-0.1 ** -1 = -10
188+
-0.1 ** 1 = -0.1
189+
-0.1 ** -1 = -10
190+
-0.1 ** 2 = 0.01
191+
-0.1 ** -2 = 100
192+
-0.1 ** 2.1 = NAN
193+
-0.1 ** -2.1 = NAN
194+
-0.1 ** 0.1 = NAN
195+
-0.1 ** -0.1 = NAN
196+
-0.1 ** 0 = 1
197+
-0.1 ** 10 = 1.0E-10
198+
-0.1 ** -10 = 10000000000
199+
-0.1 ** INF = 0
200+
-0.1 ** -INF = INF
201+
-0.1 ** NAN = NAN
202+
0 ** 0 = 1
203+
0 ** 1 = 0
204+
0 ** -1 = INF
205+
0 ** 1 = 0
206+
0 ** -1 = INF
207+
0 ** 2 = 0
208+
0 ** -2 = INF
209+
0 ** 2.1 = 0
210+
0 ** -2.1 = INF
211+
0 ** 0.1 = 0
212+
0 ** -0.1 = INF
213+
0 ** 0 = 1
214+
0 ** 10 = 0
215+
0 ** -10 = INF
216+
0 ** INF = 0
217+
0 ** -INF = INF
218+
0 ** NAN = NAN
219+
10 ** 0 = 1
220+
10 ** 1 = 10
221+
10 ** -1 = 0.1
222+
10 ** 1 = 10
223+
10 ** -1 = 0.1
224+
10 ** 2 = 100
225+
10 ** -2 = 0.01
226+
10 ** 2.1 = 125.89254117942
227+
10 ** -2.1 = 0.0079432823472428
228+
10 ** 0.1 = 1.2589254117942
229+
10 ** -0.1 = 0.79432823472428
230+
10 ** 0 = 1
231+
10 ** 10 = 10000000000
232+
10 ** -10 = 1.0E-10
233+
10 ** INF = INF
234+
10 ** -INF = 0
235+
10 ** NAN = NAN
236+
-10 ** 0 = 1
237+
-10 ** 1 = -10
238+
-10 ** -1 = -0.1
239+
-10 ** 1 = -10
240+
-10 ** -1 = -0.1
241+
-10 ** 2 = 100
242+
-10 ** -2 = 0.01
243+
-10 ** 2.1 = NAN
244+
-10 ** -2.1 = NAN
245+
-10 ** 0.1 = NAN
246+
-10 ** -0.1 = NAN
247+
-10 ** 0 = 1
248+
-10 ** 10 = 10000000000
249+
-10 ** -10 = 1.0E-10
250+
-10 ** INF = INF
251+
-10 ** -INF = 0
252+
-10 ** NAN = NAN
253+
INF ** 0 = 1
254+
INF ** 1 = INF
255+
INF ** -1 = 0
256+
INF ** 1 = INF
257+
INF ** -1 = 0
258+
INF ** 2 = INF
259+
INF ** -2 = 0
260+
INF ** 2.1 = INF
261+
INF ** -2.1 = 0
262+
INF ** 0.1 = INF
263+
INF ** -0.1 = 0
264+
INF ** 0 = 1
265+
INF ** 10 = INF
266+
INF ** -10 = 0
267+
INF ** INF = INF
268+
INF ** -INF = 0
269+
INF ** NAN = NAN
270+
-INF ** 0 = 1
271+
-INF ** 1 = -INF
272+
-INF ** -1 = -0
273+
-INF ** 1 = -INF
274+
-INF ** -1 = -0
275+
-INF ** 2 = INF
276+
-INF ** -2 = 0
277+
-INF ** 2.1 = INF
278+
-INF ** -2.1 = 0
279+
-INF ** 0.1 = INF
280+
-INF ** -0.1 = 0
281+
-INF ** 0 = 1
282+
-INF ** 10 = INF
283+
-INF ** -10 = 0
284+
-INF ** INF = INF
285+
-INF ** -INF = 0
286+
-INF ** NAN = NAN
287+
NAN ** 0 = 1
288+
NAN ** 1 = NAN
289+
NAN ** -1 = NAN
290+
NAN ** 1 = NAN
291+
NAN ** -1 = NAN
292+
NAN ** 2 = NAN
293+
NAN ** -2 = NAN
294+
NAN ** 2.1 = NAN
295+
NAN ** -2.1 = NAN
296+
NAN ** 0.1 = NAN
297+
NAN ** -0.1 = NAN
298+
NAN ** 0 = 1
299+
NAN ** 10 = NAN
300+
NAN ** -10 = NAN
301+
NAN ** INF = NAN
302+
NAN ** -INF = NAN
303+
NAN ** NAN = NAN

0 commit comments

Comments
 (0)