On Sun, 2009-05-24 at 14:33 +0100, Nathan Rixham wrote:
> Afternoon all,
> 
> This is a quick survey, think it would be useful to have the values of 
> MAX_FLOAT for each platform, and indeed see if it does differ.
> 
> to do this can you please run the following code (bc* required) and 
> reply back with the output (and your platform / php version)
> 
> code:
> <?php
> 
> function getMaxFloat() {
>       $value = '1';
>       $multiplier = '1';
>       while(1) {
>               $value = bcadd( $value , $multiplier );
>               if( (float)$value == INF ) {
>                       $value = $oldvalue;
>                       $multiplier = '1';
>               } elseif( ((float)bcadd( $value , '10' )) == INF ) {
>                       while(1) {
>                               $value = bcadd( $value , '1' );
>                               if( (float)$value == INF ) {
>                                       return $oldvalue;       
>                               }
>                               $oldvalue = $value;
>                       }
>               }
>               $oldvalue = $value;
>               $multiplier = bcmul( $multiplier , '10' );
>       }
> }
> 
> define( 'FLOAT_MAX' , getMaxFloat() );
> 
> echo FLOAT_MAX . PHP_EOL;
> 
> ?>
> 
> my results:
> 
> Win Vista 32 bit on Intel Quad Core Duo - PHP 5.2.8
> 179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791
> 
> Thanks!

Here's a faster version that takes a split second to evaluate:

<?php

function getMaxFloat()
{
    $val1 = 2;
    $val2 = 2;

    for( ; ; )
    {
        $val2 = bcmul( $val1, $val1, 0 );

        if( (string)((float)$val2) === 'INF' )
        {
            break;
        }

        $val1 = $val2;
    }

    for( ; ; )
    {
        $val2 = bcadd( $val1, $val1, 0 );

        if( (string)((float)$val2) === 'INF' )
        {
            break;
        }

        $val1 = $val2;
    }

    $mod = bcdiv( $val1, 2, 0 );

    for( ; ; )
    {
        if( (float)$mod < 1 )
        {
            break;
        }

        $val2 = bcadd( $val1, $mod, 0 );

        if( (string)((float)$val2) === 'INF' )
        {
            $mod = bcdiv( $mod, 2, 0 );
        }
        else
        {
            $val1 = $val2;
        }
    }

    return $val1;
}

define( 'FLOAT_MAX' , getMaxFloat() );

echo FLOAT_MAX . PHP_EOL;

?>

Also, when I tried using your INF comparison it always evaluated to
false so I did conversions to string... it's strange though since the
INF constant displayed "INF" when echoed and the (float)$val2 displayed
INF when echoed (when it passed the available limits) but comparing them
yielded false. Anyways:

AMD Phenom(tm) 9850 Quad-Core Processor
PHP 5.2.9
Ubuntu 8.04.2 (Hardy)

179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791

This is a match to your results.

Cheers,
Rob.
-- 
http://www.interjinn.com
Application and Templating Framework for PHP


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to