I think you've misunderstood my post, so I'll start again.

>From Zend_Locale_Math_PhpMath::Pow():

$result = pow($op1, $op2);

pow() is a function built into PHP.  It does not work on "BigIntegers" of
infinite precision.  This is in contrast to bcmath.

A demonstration:
<?php
require_once 'Zend/Locale/Math.php';
require_once 'Zend/Locale/Math/PhpMath.php';

Zend_Locale_Math_PhpMath::disable();
$a = Zend_Locale_Math::Pow('2', '128');
$b = Zend_Locale_Math_PhpMath::Pow('2', '128');

var_dump($a);
echo "\r\n<br />\r\n";
var_dump($b);
?>

What do you get as the output?  Here's what I get:

string(39) "340282366920938463463374607431768211456"
string(19) "3.4028236692094E+38" 

Those are very definitely not equal.  Tell me - how do you propose inferring
the least significant digit from $b?  It can be determined from $a by doing
$a[strlen($a) - 1].  What are you going to do for $b?

The fact is that when bcmath is unavailable, Zend_Locale_Math does *not*
behave identically to how it does when bcmath is available.  To say the
fallback solution behaves identically to the normal behavior is, frankly,
incorrect.

Here's the original BigInteger library I linked to:

http://phpseclib.cvs.sourceforge.net/viewvc/*checkout*/phpseclib/phpseclib/Math/BigInteger.php?revision=1.5

That gives you the *same* result when gmp is available, when bcmath is
available, and when neither are available.  That's the behavior I would
expect from a BigInteger class that presumes to have a PHP fallback solution
- not this "we'll give you completely different output" approach that is
being taken with Zend.


thomasW wrote:
> 
> See my notes below
> 
> Greetings
> Thomas Weidner, I18N Team Leader, Zend Framework
> http://www.thomasweidner.com
> 
> ----- Original Message ----- 
> From: "zelnaga" <[email protected]>
> To: <[email protected]>
> Sent: Wednesday, February 25, 2009 9:37 PM
> Subject: Re: [fw-general] pure-PHP BigInteger support
> 
> 
>>
>>
>> thomasW wrote:
>>>
>>> There is already a pure PHP solution within ZF which can be used.
>>>
>>> Zend_Locale_Math is a bcmath clone which does automatically use BCMath 
>>> and
>>> when it's not available switch to pure PHP implementation. For examples 
>>> on
>>> usage look at Zend_Locale_Format or Zend_Measure_Abstract.
>>
>> http://framework.zend.com/svn/framework/standard/trunk/library/Zend/Locale/Math/PhpMath.php
>>
>>
>> Interesting.  Correct me if I'm wrong, but it appears to me that when 
>> bcmath
>> is unavailable that library ceases to be a multiple precision integer
>> arithmetic library (ie. BigInteger) and instead supports regular old 
>> 32-bit
>> integers (or 64-bit for 64-bit machines)?
> 
> No, it does not limit to 32 bit integer. Still there is a sort of
> limitation 
> which is related to the usecase this lib was created for.
> 
>>  If so, I'm not even sure it'd be
>> accurate to say that it "falls back" on anything - if bcmath is 
>> unavailable
>> its feature set becomes completely different.
> 
> No it does not.
> 
>>  If you absolutely need
>> 128-bit integers and bcmath is unavailable that library isn't going to be
>> sufficient
> 
> We're calculating dates with a unixtimestamp from BC (-4000) which extends 
> 32bit with ease.
> 
>> and if you have bcmath and can live with 32-bit integers that
>> library is probably going to slow things down for you
> 
> Why should it ?
> When BCMath is available you will get the result from BCMath and not the 
> lib.
> 
>> (bcadd(), I suspect, can't compare in speed to the + operator).
> 
> You have to decide if you are in need of BCMath or of PHP limited integer.
> This is a design decision and not a fault or problem of a class.
> You are ALWAYS slower when you have to use a component or extension than 
> using PHP native "+" notation.
> 
>> If that library actually does support integers of any length regardless
>> of
>> whether or not bcmath is installed then shouldn't that library - and not
>> Zend_Crypt_Math_BigInteger - be used by Zend_Crypt_DiffieHellman?
> 
> Can't say anything about that. Zend_Crypt is no longer developed by it's 
> maintainer and unchanged in incubator since mid 2008.
> So I expect that this component is dead.
> 
>> -- 
>> View this message in context: 
>> http://www.nabble.com/pure-PHP-BigInteger-support-tp22068811p22211234.html
>> Sent from the Zend Framework mailing list archive at Nabble.com. 
> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/pure-PHP-BigInteger-support-tp22068811p22213096.html
Sent from the Zend Framework mailing list archive at Nabble.com.

Reply via email to