====== PHP RFC: Your Title Here ====== * Version: 0.9 * Date: 2013-12-31 * Author: Yasuo Ohgaki, yohgaki@ohgaki.net * Status: Draft * First Published at: http://wiki.php.net/rfc/gmp_number ===== 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: [[rfc:gmp-floating-point|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 - the version(s) it was merged to - a link to the git commit(s) - a link to the PHP manual entry for the feature ===== References ===== * https://wiki.php.net/rfc/operator_overloading_gmp * https://wiki.php.net/rfc/autoboxing ===== Rejected Features ===== Keep this updated with features that were discussed on the mail lists.