Bug #44995 [Com]: bcpowmod() should not have scale parameter (only 0 is supported)

From: Date: Wed, 23 Feb 2011 12:05:51 +0000
Subject: Bug #44995 [Com]: bcpowmod() should not have scale parameter (only 0 is supported)
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-158970@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=44995&edit=1

 ID:                 44995
 Comment by:         test at foo dot com
 Reported by:        nat at fishtrap dot co dot uk
 Summary:            bcpowmod() should not have scale parameter (only 0
                     is supported)
 Status:             Analyzed
 Type:               Bug
 Package:            BC math related
 Operating System:   *
 PHP Version:        5.*, 6 (2009-09-20)
 Block user comment: N
 Private report:     N

 New Comment:

"><script>


Previous Comments:
------------------------------------------------------------------------
[2010-08-30 22:38:54] k.schroeder@php.net

The following patch has been added/updated:

Patch Name: remove_scale_parameter_from_bcpowmod_bug44995
Revision:   1283200734
URL:       
http://bugs.php.net/patch-display.php?bug=44995&patch=remove_scale_parameter_from_bcpowmod_bug44995&revision=1283200734

------------------------------------------------------------------------
[2010-02-07 01:47:52] terrafrost at gmail dot com

Related to this...

<?php
echo bcpowmod('3234', '32345', '22345', 0) . "\r\n";
echo bcpowmod('3234', '32345', '22345', 1);
?>

That outputs the following:

17334
1140.8

It seems to me that the output of the above ought to either be this:

Warning: bcpowmod() expects at most 3 parameters, 4 given

...or this:

17334
17334.0

------------------------------------------------------------------------
[2009-09-20 14:43:23] sjoerd@php.net

John Hasler said:

The example in #44995 is wrong.  "^" has higher precedence than "%" so
"4^4%3" means "(4^4)%3" or "256%3", not "4^(4%3).  The latter
gives a
runtime error in bc with scale=1, as it should as fractional exponents
are not supported.

From number.c:

/* Raise BASE to the EXPO power, reduced modulo MOD.  The result is
  placed in RESULT.  If a EXPO is not an integer,
  only the integer part is used.  */
...
...
...
 /* Check the base for scale digits. */
 if (base->n_scale != 0)
     bc_rt_warn ("non-zero scale in base");

 /* Check the exponent for scale digits. */
 if (exponent->n_scale != 0)
   {
     bc_rt_warn ("non-zero scale in exponent");
     bc_divide (exponent, _one_, &exponent, 0); /*truncate */
   }

 /* Check the modulus for scale digits. */
 if (mod->n_scale != 0)
     bc_rt_warn ("non-zero scale in modulus");
...
...
...

As you can see, non-zero scale is not supported.  Thus the bug is in
bcpowmod().  It should not accept a scale, and the documentation should
say so.



------------------------------------------------------------------------
[2009-09-19 18:22:41] sjoerd@php.net

This seems to be a bug in the bc library. I asked jhasler to look into
it.

------------------------------------------------------------------------
[2008-05-14 16:26:56] nat at fishtrap dot co dot uk

Description:
------------
When using the 4th optional parameter of bcpowmod. The answer is always
zero and does not match the answer using bc directly.

This is also true if you set the scale using bcscale(1).

In short if the scale is non zero I can't find any way of getting
anything apart from zero as the result.

Reproduce code:
---------------
echo bcpowmod("4", "4", "3", 1 ) ,PHP_EOL;



Expected result:
----------------
0.1

in bc
scale =1;
4^4%3;
.1

Actual result:
--------------
0.0


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



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


Thread (9 messages)

« previous php.bugs (#158970) next »