Proposal for `BcMath\Number::sum()`, `max()`, and `min()`
| From: | Saki Takamachi | Date: | Sun, 15 Jun 2025 09:07:31 +0000 |
| Subject: | Proposal for `BcMath\Number::sum()`, `max()`, and `min()` | ||
| Groups: | php.internals | ||
| Request: | Send a blank email to internals+get-127661@lists.php.net to get a copy of this message | ||
Hi internals!
I would like to propose adding three static methods —
sum(), max(), and
min() — to BcMath\Number.
Before moving forward, I’d like to gauge whether there is general interest or demand for such
functionality.
Of course, I'm aware that these operations can be implemented easily in userland code. However,
having them as built-in methods provides a clear performance advantage.
In a quick benchmark using a prototype implementation, I observed that sum() was
approximately 5x faster than a userland implementation, while max() and
min() were roughly 2x faster.
I also experimented with an avg() method, but found that the performance difference
between built-in and userland implementations was negligible. For that reason, I'm not
including it in this proposal.
The proposed method signatures are as follows:
```
public static function sum(array $nums, ?int $scale = null): Number {}
public static function max(array $nums, ?int $scale = null): Number {}
public static function min(array $nums, ?int $scale = null): Number {}
```
Each element in $nums should be of type Number, string, or
int.
For reference, here are the userland implementations I used for comparison:
sum:
```
$nums = [/* omit */];
$num_0 = new BcMath\Number(0);
foreach ($nums as $num) {
$num_0 += $num;
}
```
max (and min with slight modification):
```
$nums = [/* omit */];
$num_0 = array_shift($nums);
foreach ($nums as $num) {
$num_0 = $num_0 >= $num ? $num_0 : $num;
}
```
Regards,
Saki