文字

log

(PHP 4, PHP 5)

log自然对数

说明

float log ( float $arg [, float $base = M_E ] )

如果指定了可选的参数 base log() 返回 logbasearg,否则 log() 返回参数 arg 的自然对数。

参数

arg

要计算对数的值

base

The optional logarithmic base to use (defaults to 'e' and so to the natural logarithm).

返回值

返回 logbasearg,或者它的自然对数。

更新日志

版本 说明
4.3.0 可选参数 base可用。 你可以计算任意以 b 为底 n 的对数,但其实使用的是数学等式:logb(n) = log(n)/log(b),其中 log 是自然对数。

参见

  • log10() - 以 10 为底的对数
  • exp() - 计算 e 的指数
  • pow() - 指数表达式

用户评论:

[#1] ClaudiuS [2013-02-21 19:34:38]

If you just need to check if N is a perfect power of Base, log() is SLOW compared to a WHILE construct that will be 2x faster! 

Tested on range: 1 ... 20.000.000 => while() is 2.105 times faster

<?php 

$number
='fill in your number here'
$base='fill in requested base here';

//use when the power is needed
$pow=0;do { $number/=$base;$pow++; } while ($number>1);
if (
$number==1) print $base.'^'.$pow;
else print 
'False';

//use when just a check is needed
do $number/=$base; while ($number>1);
if (
$number==1) print 'True';
else print 
'False';
?>

[#2] olafurw [at] gmail.com [2008-11-04 04:56:55]

For those interested. Works with older than 4.3 versions.

<?php
    
function byteConvert($bytes)
    {
        
$s = array('B''Kb''MB''GB''TB''PB');
        
$e floor(log($bytes)/log(1024));
      
        return 
sprintf('%.2f '.$s[$e], ($bytes/pow(1024floor($e))));
    }
?>

[#3] dingus_76 at hotmail dot com [2008-05-15 19:41:45]

well i been pulling my hair out trying to get log to work with big numbers and i ended up writing a bclog function so to save everyone else the stress here it is

<?php
function bclog($X,$base=10,$decimalplace=12){
    
$integer_value=0;
    while(
$X 1){
        
$integer_value $integer_value ;
        
$X bcmul($X base);
    }
    while(
$X >= $base){
        
$integer_value $integer_value 1;
        
$X bcdiv($X $base );
    }
    
$decimal_fraction 0.0;
    
$partial 1.0;
    
# Replace X with X to the 10th power
    
$X bcpow($X 10);
    while(
$decimalplace 0){
        
$partial bcdiv($partial 10);
        
$digit=0;
        while(
$X >= $base){
              
$digit $digit 1;
              
$X bcdiv($X $base);
        }
        
$decimal_fraction bcadd($decimal_fraction bcmul($digit $partial));
        
# Replace X with X to the 10th power
        
$X bcpow($X 10);
        
$decimalplace $decimalplace ;
    }
    return 
$integer_value $decimal_fraction ;
}
?>

[#4] Ulf Wostner [2006-08-06 05:56:58]

<?php

#--------------------------------------------------------
#     How many digits does an integer have?
#--------------------------------------------------------

function digit_count($n$base=10) {

  if(
$n == 0) return 1;

  if(
$base == 10) {
    
# using the built-in log10(x)
    # might be more accurate than log(x)/log(10).
    
return floor(log10(abs($n)));
  }else{
    
# here  logB(x) = log(x)/log(B) will have to do.
   
return floor(log(abs($n))/ log($base));
  }
}

# Example:  How many decimal digits for 2 to the power 24?
echo digit_count(pow(224));

# Example: How many bits to write 1 billion in binary, last century?

if($country_code  == 'US') echo digit_count(pow(109), 2);
if(
$country_code == 'UK') echo digit_count(pow(1012), 2);

#--------------------------------------------------------
#     Using log to format columns.
#--------------------------------------------------------

# Suppose we have a dynamically generated list of integers,
# and want to present them as a table. The use of log10 in
# our digit_count helps calculate the proper format string.

function print_list_of_ints($ints$line_width=40) {

  
# Apply our digit_count to the max int among ints.
  
$field_width digit_count(max($ints));

  
# Create format string for printf.
  
$format "%${field_width}d";

  
$ints_per_line floor($line_width/$field_width);

  
$border str_repeat("-"$ints_per_line $field_width);

  echo 
"\n$border\n";

  foreach(
$ints as $count => $int) {
    if( 
$count and ($count $ints_per_line == 0)) echo "\n";
    
printf($format$int);
  }

  echo 
"\n$border\n";
}

# To generate an example, here is a basic function
# returning a list of (pseudo) random numbers.

function rands($how_many) {
  for(
$i=0$i $how_many$i++) $rands[] = rand();
  return 
$rands;
}

# Example:  A list of random ints dynamically formatted into columns.

print_list_of_ints(rands(11));



?>

[#5] mcmeijer at yahoo dot com [2005-02-03 07:22:39]

$val = 1000000
$val2 = floor(log($val,10)) gives a value of 5 for $val2 and not 6 as expected.
$val2 = floor(log10($val)) gives the correct value.

[#6] c0x at mail dot ru [2004-09-19 03:08:12]

more general version, works fine on negative, very big ($value > 1E+18) and very small ($value < 1E-18) numbers.

function expn($value, $prec = 3, $base = 1000, $prefix = '') {
    $e = array('a', 'f', 'p', 'n', 'u', 'm', '', 'k', 'M', 'G', 'T', 'P', 'E');
    $p = min(max(floor(log(abs($value), $base)), -6), 6);
    return round((float)$value / pow($base, $p), $prec) . $prefx . $e[$p + 6];
}

[#7] admin at worldtakeover dot tk [2004-06-20 13:06:31]

In regards to the note about log in base 10 and the round() function. You need to use floor() instead of round() to find out the order of magnitude. That way, you don't have to worry about subtracting 0.5 or whatever.

上一篇: 下一篇: