Skip to content

Commit 2ef3477

Browse files
committed
feature #509 Polyfill fpow (stof)
This PR was merged into the 1.x branch. Discussion ---------- Polyfill `fpow` Commits ------- 11e1030 Polyfill `fpow`
2 parents 4140adc + 11e1030 commit 2ef3477

File tree

4 files changed

+354
-0
lines changed

4 files changed

+354
-0
lines changed

src/Php84/Php84.php

+5
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,11 @@ public static function array_all(array $array, callable $callback): bool
109109
return true;
110110
}
111111

112+
public static function fpow(float $num, float $exponent): float
113+
{
114+
return $num ** $exponent;
115+
}
116+
112117
public static function mb_trim(string $string, ?string $characters = null, ?string $encoding = null): string
113118
{
114119
return self::mb_internal_trim('{^[%s]+|[%1$s]+$}Du', $string, $characters, $encoding, __FUNCTION__);

src/Php84/README.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ This component provides features added to PHP 8.4 core:
77
- [`array_find`, `array_find_key`, `array_any` and `array_all`](https://wiki.php.net/rfc/array_find)
88
- [`Deprecated`](https://wiki.php.net/rfc/deprecated_attribute)
99
- `CURL_HTTP_VERSION_3` and `CURL_HTTP_VERSION_3ONLY` constants
10+
- [`fpow`](https://wiki.php.net/rfc/raising_zero_to_power_of_negative_number)
1011

1112
More information can be found in the
1213
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).

src/Php84/bootstrap.php

+4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ function array_any(array $array, callable $callback): bool { return p\Php84::arr
3939
function array_all(array $array, callable $callback): bool { return p\Php84::array_all($array, $callback); }
4040
}
4141

42+
if (!function_exists('fpow')) {
43+
function fpow(float $num, float $exponent): float { return p\Php84::fpow($num, $exponent); }
44+
}
45+
4246
if (extension_loaded('mbstring')) {
4347
if (!function_exists('mb_ucfirst')) {
4448
function mb_ucfirst(string $string, ?string $encoding = null): string { return p\Php84::mb_ucfirst($string, $encoding); }

tests/Php84/Php84Test.php

+344
Original file line numberDiff line numberDiff line change
@@ -319,4 +319,348 @@ public static function mbRTrimProvider(): iterable
319319

320320
yield ["foo\n", "foo\n", 'o'];
321321
}
322+
323+
/**
324+
* @dataProvider fpowProvider
325+
*/
326+
public function testFpow(float $num, float $exponent, float $expected)
327+
{
328+
$result = fpow($num, $exponent);
329+
330+
if (is_nan($expected)) {
331+
$this->assertNan($result);
332+
} else {
333+
// The PHP testsuite performs assertions on the text representation of results. As we copied their test cases, we need to do the same.
334+
$this->assertSame((string) $expected, (string) $result);
335+
}
336+
}
337+
338+
public static function fpowProvider(): iterable
339+
{
340+
// Cases tested in https://github.com/php/php-src/blob/php-8.4.2/ext/standard/tests/math/fpow.phpt
341+
yield [0, 0, 1];
342+
yield [0, 1, 0];
343+
yield [0, -1, INF];
344+
yield [0, 1.0, 0];
345+
yield [0, -1.0, INF];
346+
yield [0, 2, 0];
347+
yield [0, -2, INF];
348+
yield [0, 2.1, 0];
349+
yield [0, -2.1, INF];
350+
yield [0, 0.1, 0];
351+
yield [0, -0.1, INF];
352+
yield [0, 0.0, 1];
353+
yield [0, -0.0, 1];
354+
yield [0, 10, 0];
355+
yield [0, -10, INF];
356+
yield [0, INF, 0];
357+
yield [0, -INF, INF];
358+
yield [0, NAN, NAN];
359+
yield [1, 0, 1];
360+
yield [1, 1, 1];
361+
yield [1, -1, 1];
362+
yield [1, 1.0, 1];
363+
yield [1, -1.0, 1];
364+
yield [1, 2, 1];
365+
yield [1, -2, 1];
366+
yield [1, 2.1, 1];
367+
yield [1, -2.1, 1];
368+
yield [1, 0.1, 1];
369+
yield [1, -0.1, 1];
370+
yield [1, 0.0, 1];
371+
yield [1, -0.0, 1];
372+
yield [1, 10, 1];
373+
yield [1, -10, 1];
374+
yield [1, INF, 1];
375+
yield [1, -INF, 1];
376+
yield [1, NAN, 1];
377+
yield [-1, 0, 1];
378+
yield [-1, 1, -1];
379+
yield [-1, -1, -1];
380+
yield [-1, 1.0, -1];
381+
yield [-1, -1.0, -1];
382+
yield [-1, 2, 1];
383+
yield [-1, -2, 1];
384+
yield [-1, 2.1, NAN];
385+
yield [-1, -2.1, NAN];
386+
yield [-1, 0.1, NAN];
387+
yield [-1, -0.1, NAN];
388+
yield [-1, 0.0, 1];
389+
yield [-1, -0.0, 1];
390+
yield [-1, 10, 1];
391+
yield [-1, -10, 1];
392+
yield [-1, INF, 1];
393+
yield [-1, -INF, 1];
394+
yield [-1, NAN, NAN];
395+
yield [1.0, 0, 1];
396+
yield [1.0, 1, 1];
397+
yield [1.0, -1, 1];
398+
yield [1.0, 1.0, 1];
399+
yield [1.0, -1.0, 1];
400+
yield [1.0, 2, 1];
401+
yield [1.0, -2, 1];
402+
yield [1.0, 2.1, 1];
403+
yield [1.0, -2.1, 1];
404+
yield [1.0, 0.1, 1];
405+
yield [1.0, -0.1, 1];
406+
yield [1.0, 0.0, 1];
407+
yield [1.0, -0.0, 1];
408+
yield [1.0, 10, 1];
409+
yield [1.0, -10, 1];
410+
yield [1.0, INF, 1];
411+
yield [1.0, -INF, 1];
412+
yield [1.0, NAN, 1];
413+
yield [-1.0, 0, 1];
414+
yield [-1.0, 1, -1];
415+
yield [-1.0, -1, -1];
416+
yield [-1.0, 1.0, -1];
417+
yield [-1.0, -1.0, -1];
418+
yield [-1.0, 2, 1];
419+
yield [-1.0, -2, 1];
420+
yield [-1.0, 2.1, NAN];
421+
yield [-1.0, -2.1, NAN];
422+
yield [-1.0, 0.1, NAN];
423+
yield [-1.0, -0.1, NAN];
424+
yield [-1.0, 0.0, 1];
425+
yield [-1.0, -0.0, 1];
426+
yield [-1.0, 10, 1];
427+
yield [-1.0, -10, 1];
428+
yield [-1.0, INF, 1];
429+
yield [-1.0, -INF, 1];
430+
yield [-1.0, NAN, NAN];
431+
yield [2, 0, 1];
432+
yield [2, 1, 2];
433+
yield [2, -1, 0.5];
434+
yield [2, 1.0, 2];
435+
yield [2, -1.0, 0.5];
436+
yield [2, 2, 4];
437+
yield [2, -2, 0.25];
438+
yield [2, 2.1, 4.2870938501452];
439+
yield [2, -2.1, 0.2332582478842];
440+
yield [2, 0.1, 1.0717734625363];
441+
yield [2, -0.1, 0.93303299153681];
442+
yield [2, 0.0, 1];
443+
yield [2, -0.0, 1];
444+
yield [2, 10, 1024];
445+
yield [2, -10, 0.0009765625];
446+
yield [2, INF, INF];
447+
yield [2, -INF, 0];
448+
yield [2, NAN, NAN];
449+
yield [-2, 0, 1];
450+
yield [-2, 1, -2];
451+
yield [-2, -1, -0.5];
452+
yield [-2, 1.0, -2];
453+
yield [-2, -1.0, -0.5];
454+
yield [-2, 2, 4];
455+
yield [-2, -2, 0.25];
456+
yield [-2, 2.1, NAN];
457+
yield [-2, -2.1, NAN];
458+
yield [-2, 0.1, NAN];
459+
yield [-2, -0.1, NAN];
460+
yield [-2, 0.0, 1];
461+
yield [-2, -0.0, 1];
462+
yield [-2, 10, 1024];
463+
yield [-2, -10, 0.0009765625];
464+
yield [-2, INF, INF];
465+
yield [-2, -INF, 0];
466+
yield [-2, NAN, NAN];
467+
yield [2.1, 0, 1];
468+
yield [2.1, 1, 2.1];
469+
yield [2.1, -1, 0.47619047619048];
470+
yield [2.1, 1.0, 2.1];
471+
yield [2.1, -1.0, 0.47619047619048];
472+
yield [2.1, 2, 4.41];
473+
yield [2.1, -2, 0.22675736961451];
474+
yield [2.1, 2.1, 4.7496380917422];
475+
yield [2.1, -2.1, 0.21054235726688];
476+
yield [2.1, 0.1, 1.0770154403044];
477+
yield [2.1, -0.1, 0.92849179554696];
478+
yield [2.1, 0.0, 1];
479+
yield [2.1, -0.0, 1];
480+
yield [2.1, 10, 1667.9880978201];
481+
yield [2.1, -10, 0.0005995246616609];
482+
yield [2.1, INF, INF];
483+
yield [2.1, -INF, 0];
484+
yield [2.1, NAN, NAN];
485+
yield [-2.1, 0, 1];
486+
yield [-2.1, 1, -2.1];
487+
yield [-2.1, -1, -0.47619047619048];
488+
yield [-2.1, 1.0, -2.1];
489+
yield [-2.1, -1.0, -0.47619047619048];
490+
yield [-2.1, 2, 4.41];
491+
yield [-2.1, -2, 0.22675736961451];
492+
yield [-2.1, 2.1, NAN];
493+
yield [-2.1, -2.1, NAN];
494+
yield [-2.1, 0.1, NAN];
495+
yield [-2.1, -0.1, NAN];
496+
yield [-2.1, 0.0, 1];
497+
yield [-2.1, -0.0, 1];
498+
yield [-2.1, 10, 1667.9880978201];
499+
yield [-2.1, -10, 0.0005995246616609];
500+
yield [-2.1, INF, INF];
501+
yield [-2.1, -INF, 0];
502+
yield [-2.1, NAN, NAN];
503+
yield [0.1, 0, 1];
504+
yield [0.1, 1, 0.1];
505+
yield [0.1, -1, 10];
506+
yield [0.1, 1.0, 0.1];
507+
yield [0.1, -1.0, 10];
508+
yield [0.1, 2, 0.01];
509+
yield [0.1, -2, 100];
510+
yield [0.1, 2.1, 0.0079432823472428];
511+
yield [0.1, -2.1, 125.89254117942];
512+
yield [0.1, 0.1, 0.79432823472428];
513+
yield [0.1, -0.1, 1.2589254117942];
514+
yield [0.1, 0.0, 1];
515+
yield [0.1, -0.0, 1];
516+
yield [0.1, 10, 1.0E-10];
517+
yield [0.1, -10, 10000000000];
518+
yield [0.1, INF, 0];
519+
yield [0.1, -INF, INF];
520+
yield [0.1, NAN, NAN];
521+
yield [-0.1, 0, 1];
522+
yield [-0.1, 1, -0.1];
523+
yield [-0.1, -1, -10];
524+
yield [-0.1, 1.0, -0.1];
525+
yield [-0.1, -1.0, -10];
526+
yield [-0.1, 2, 0.01];
527+
yield [-0.1, -2, 100];
528+
yield [-0.1, 2.1, NAN];
529+
yield [-0.1, -2.1, NAN];
530+
yield [-0.1, 0.1, NAN];
531+
yield [-0.1, -0.1, NAN];
532+
yield [-0.1, 0.0, 1];
533+
yield [-0.1, -0.0, 1];
534+
yield [-0.1, 10, 1.0E-10];
535+
yield [-0.1, -10, 10000000000];
536+
yield [-0.1, INF, 0];
537+
yield [-0.1, -INF, INF];
538+
yield [-0.1, NAN, NAN];
539+
yield [0.0, 0, 1];
540+
yield [0.0, 1, 0];
541+
yield [0.0, -1, INF];
542+
yield [0.0, 1.0, 0];
543+
yield [0.0, -1.0, INF];
544+
yield [0.0, 2, 0];
545+
yield [0.0, -2, INF];
546+
yield [0.0, 2.1, 0];
547+
yield [0.0, -2.1, INF];
548+
yield [0.0, 0.1, 0];
549+
yield [0.0, -0.1, INF];
550+
yield [0.0, 0.0, 1];
551+
yield [0.0, -0.0, 1];
552+
yield [0.0, 10, 0];
553+
yield [0.0, -10, INF];
554+
yield [0.0, INF, 0];
555+
yield [0.0, -INF, INF];
556+
yield [0.0, NAN, NAN];
557+
yield [-0.0, 0, 1];
558+
yield [-0.0, 1, -0.0];
559+
yield [-0.0, -1, -INF];
560+
yield [-0.0, 1.0, -0.0];
561+
yield [-0.0, -1.0, -INF];
562+
yield [-0.0, 2, 0];
563+
yield [-0.0, -2, INF];
564+
yield [-0.0, 2.1, 0];
565+
yield [-0.0, -2.1, INF];
566+
yield [-0.0, 0.1, 0];
567+
yield [-0.0, -0.1, INF];
568+
yield [-0.0, 0.0, 1];
569+
yield [-0.0, -0.0, 1];
570+
yield [-0.0, 10, 0];
571+
yield [-0.0, -10, INF];
572+
yield [-0.0, INF, 0];
573+
yield [-0.0, -INF, INF];
574+
yield [-0.0, NAN, NAN];
575+
yield [10, 0, 1];
576+
yield [10, 1, 10];
577+
yield [10, -1, 0.1];
578+
yield [10, 1.0, 10];
579+
yield [10, -1.0, 0.1];
580+
yield [10, 2, 100];
581+
yield [10, -2, 0.01];
582+
yield [10, 2.1, 125.89254117942];
583+
yield [10, -2.1, 0.0079432823472428];
584+
yield [10, 0.1, 1.2589254117942];
585+
yield [10, -0.1, 0.79432823472428];
586+
yield [10, 0.0, 1];
587+
yield [10, -0.0, 1];
588+
yield [10, 10, 10000000000];
589+
yield [10, -10, 1.0E-10];
590+
yield [10, INF, INF];
591+
yield [10, -INF, 0];
592+
yield [10, NAN, NAN];
593+
yield [-10, 0, 1];
594+
yield [-10, 1, -10];
595+
yield [-10, -1, -0.1];
596+
yield [-10, 1.0, -10];
597+
yield [-10, -1.0, -0.1];
598+
yield [-10, 2, 100];
599+
yield [-10, -2, 0.01];
600+
yield [-10, 2.1, NAN];
601+
yield [-10, -2.1, NAN];
602+
yield [-10, 0.1, NAN];
603+
yield [-10, -0.1, NAN];
604+
yield [-10, 0.0, 1];
605+
yield [-10, -0.0, 1];
606+
yield [-10, 10, 10000000000];
607+
yield [-10, -10, 1.0E-10];
608+
yield [-10, INF, INF];
609+
yield [-10, -INF, 0];
610+
yield [-10, NAN, NAN];
611+
yield [INF, 0, 1];
612+
yield [INF, 1, INF];
613+
yield [INF, -1, 0];
614+
yield [INF, 1.0, INF];
615+
yield [INF, -1.0, 0];
616+
yield [INF, 2, INF];
617+
yield [INF, -2, 0];
618+
yield [INF, 2.1, INF];
619+
yield [INF, -2.1, 0];
620+
yield [INF, 0.1, INF];
621+
yield [INF, -0.1, 0];
622+
yield [INF, 0.0, 1];
623+
yield [INF, -0.0, 1];
624+
yield [INF, 10, INF];
625+
yield [INF, -10, 0];
626+
yield [INF, INF, INF];
627+
yield [INF, -INF, 0];
628+
yield [INF, NAN, NAN];
629+
yield [-INF, 0, 1];
630+
yield [-INF, 1, -INF];
631+
yield [-INF, -1, -0.0];
632+
yield [-INF, 1.0, -INF];
633+
yield [-INF, -1.0, -0.0];
634+
yield [-INF, 2, INF];
635+
yield [-INF, -2, 0];
636+
yield [-INF, 2.1, INF];
637+
yield [-INF, -2.1, 0];
638+
yield [-INF, 0.1, INF];
639+
yield [-INF, -0.1, 0];
640+
yield [-INF, 0.0, 1];
641+
yield [-INF, -0.0, 1];
642+
yield [-INF, 10, INF];
643+
yield [-INF, -10, 0];
644+
yield [-INF, INF, INF];
645+
yield [-INF, -INF, 0];
646+
yield [-INF, NAN, NAN];
647+
yield [NAN, 0, 1];
648+
yield [NAN, 1, NAN];
649+
yield [NAN, -1, NAN];
650+
yield [NAN, 1.0, NAN];
651+
yield [NAN, -1.0, NAN];
652+
yield [NAN, 2, NAN];
653+
yield [NAN, -2, NAN];
654+
yield [NAN, 2.1, NAN];
655+
yield [NAN, -2.1, NAN];
656+
yield [NAN, 0.1, NAN];
657+
yield [NAN, -0.1, NAN];
658+
yield [NAN, 0.0, 1];
659+
yield [NAN, -0.0, 1];
660+
yield [NAN, 10, NAN];
661+
yield [NAN, -10, NAN];
662+
yield [NAN, INF, NAN];
663+
yield [NAN, -INF, NAN];
664+
yield [NAN, NAN, NAN];
665+
}
322666
}

0 commit comments

Comments
 (0)