Edit report at http://bugs.php.net/bug.php?id=52906&edit=1

 ID:                 52906
 Updated by:         s...@php.net
 Reported by:        kkcagg at gmail dot com
 Summary:            gmp_mod returns negative result when non-negative is
                     expected
-Status:             Verified
+Status:             Closed
 Type:               Bug
 Package:            GNU MP related
 Operating System:   Linux
 PHP Version:        5.3.3
 Assigned To:        stas
 Block user comment: N

 New Comment:

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.

fixed, thanks


Previous Comments:
------------------------------------------------------------------------
[2010-10-01 02:12:24] s...@php.net

Automatic comment from SVN on behalf of stas
Revision: http://svn.php.net/viewvc/?view=revision&revision=303910
Log: Fix bug #52906     gmp_mod returns negative result when non-negative is
expected

------------------------------------------------------------------------
[2010-09-22 17:43:53] cataphr...@php.net

The following patch has been added/updated:

Patch Name: gmp_mod
Revision:   1285170233
URL:       
http://bugs.php.net/patch-display.php?bug=52906&patch=gmp_mod&revision=1285170233

------------------------------------------------------------------------
[2010-09-22 17:21:09] cataphr...@php.net

This is a bug in the PHP extension. Worse, the result differs if you
pass a GMP resource instead of an integer:



$ php -r "echo gmp_intval(gmp_mod(-2, gmp_add(6,1)));"

5



The problem is that gmp_zval_binary_ui_op_ex changes the sign of the
result if it uses the unsigned integer variant of the GMP API and the
first operand is negative. This may be the correct for other binary
functions (I haven't checked), but it isn't for mod.





The documentation mirrors the upstream documentation, which says:



«

— Function: void mpz_mod (mpz_t r, mpz_t n, mpz_t d)

— Function: unsigned long int mpz_mod_ui (mpz_t r, mpz_t n, unsigned
long int d)



Set r to n mod d. The sign of the divisor is ignored; the result is
always non-negative.

»



http://gmplib.org/manual/Integer-Division.html#Integer-Division

------------------------------------------------------------------------
[2010-09-22 11:48:29] kkcagg at gmail dot com

Description:
------------
GMP version     4.2.2



Running the function in test script returns the output of -5 when 5 is
expected.

Documentation (http://us.php.net/manual/en/function.gmp-mod.php) asserts
that the 

result is always non-negative. This is not the case in actuality. Bug
type could 

be either a bug or documentation problem.

Test script:
---------------
<?php

echo gmp_intval(gmp_mod(-2,7));

?>

Expected result:
----------------
5

Actual result:
--------------
-5


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52906&edit=1

Reply via email to