rfc:gmp_number

PHP RFC: Your Title Here

Introduction

GMP arithmetic with normal operator is added by https://wiki.php.net/rfc/operator_overloading_gmp

GMP numbers work like normal PHP number(int/float) with normal PHP arithmetic operators now.

This RFC proposes GMP number compatible with PHP number(int/float).

Current GMP implementation does not support GMP float/rational numbers. For the sake of completeness, GMP float support is needed at least. There are functions to be modified to treat GMP number as normal PHP numbers.

Proposal

Add GMP float support to GMP module

Add GMP float support to GMP module. * Add all GMP float API wrapper to module. * GMP float API wrapper supports PHP int/float and GMP int/float. Conversion is done automatically. * Default precision: 256 (?)

Extracted out to a separate RFC: GMP Floating Point Support

Add math function compatibility

Add math function compatibility.

  • Down grade GMP number (int/float) to PHP number (int/float) automatically.

Some other RFC may implement, full GMP number support in math functions, but this is out of this RFC scope.

Add variable function compatibility

Add variable function compatibility.

  • empty() - evaluated GMP int 0 and GMP float 0.0 as TRUE, otherwise FALSE.
  • is_scalar() - evaluated GMP number as TRUE.
  • (anything else?)

References

Current empty() and is_scalar() behavior

[yohgaki@dev php-src]$ ./php-bin -a Interactive shell

php > $g = gmp_init(123);
php > var_dump($v);
object(GMP)#3 (1) {
  ["num"]=>
  string(1) "0"
}
php > $v = $g * 0;

php > var_dump($v, empty($v), is_scalar($v));
object(GMP)#4 (1) {
  ["num"]=>
  string(3) "0"
}
bool(false)
bool(false)
Current math function behavior

GMP float is not supported.

php > $f = 2.2;
php > $gf = gmp_init($f);

Warning: gmp_init(): Unable to convert variable to GMP - wrong type in php shell code on line 1

max()/min()

php > $g = gmp_init(123);
php > var_dump($v);
object(GMP)#4 (1) {
  ["num"]=>
  string(1) "0"
}
php > $g = gmp_init(5);
php > var_dump(max(1,2,$g));
object(GMP)#1 (1) {
  ["num"]=>
  string(1) "5"
}
php > var_dump(min(1,2,$g));
int(1)
php > var_dump(min($g, 6, 7));
object(GMP)#1 (1) {
  ["num"]=>
  string(1) "5"
}
Current Ruby and PHP behavior
[yohgaki@dev php-src]$ irb
2.0.0p247 :001 > 10 / 3
 => 3 
2.0.0p247 :002 > 10.0 / 3
 => 3.3333333333333335 
2.0.0p247 :003 > 
[yohgaki@dev php-src]$ php -a
Interactive shell

php > $g = gmp_init('10');
php > echo $g / 3;
3

php > echo 10 / 3;
3.3333333333333

Backward Incompatible Changes

Proposed PHP Version(s)

PHP 5.6 or later

Open Issues

  • Ways to implement GMP object evaluation in empty(), is_scalar()
    • Treat GMP object as special object
    • Implement scalar object
    • Implement autoboxing like feature
  • How GMP number should behave (Like PHP or Ruby?)

Future Scope

Math functions is better to support GMP float.

Proposed Voting Choices

Yes/No

Patches and Tests

I really appreciate if anyone could make patch for this RFC.

Implementation

After the project is implemented, this section should contain

  1. the version(s) it was merged to
  2. a link to the git commit(s)
  3. a link to the PHP manual entry for the feature

References

Rejected Features

Keep this updated with features that were discussed on the mail lists.

rfc/gmp_number.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1