log

(PHP 4, PHP 5, PHP 7, PHP 8)

log自然对数

描述

log(float $num, float $base = M_E): float

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

参数

num

要计算对数的值

base

要使用的可选对数底数(默认为 'e',因此为自然对数)。

返回值

如果给出,则为 numbase 的对数,或者为自然对数。

参见

  • log10() - 以 10 为底的对数
  • exp() - 计算 e 的指数
  • pow() - 指数表达式
  • error_log() - 将错误消息发送到定义的错误处理例程

添加注释

用户贡献注释 8 注释

-3
c0x at mail dot ru
19 年前
更通用的版本,适用于负数、非常大 ($value > 1E+18) 和非常小 ($value < 1E-18) 的数字。

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];
}
-5
olafurw [at] gmail.com
15 年前
对于那些感兴趣的人来说。适用于 4.3 版本之前的版本。

<?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(1024, floor($e))));
}
?>
-8
ClaudiuS
11 年前
如果你只需要检查 N 是否是 Base 的完全幂,与 WHILE 结构相比,log() 速度很慢,WHILE 结构的速度快 2 倍!

在 1 ... 20.000.000 的范围内测试 => while() 的速度快 2.105 倍

<?php

$number
='在此处填写您的数字'
$base='在此处填写请求的底数';

// 在需要幂时使用
$pow=0;do { $number/=$base;$pow++; } while ($number>1);
if (
$number==1) print $base.'^'.$pow;
else print
'False';

// 在只需要检查时使用
do $number/=$base; while ($number>1);
if (
$number==1) print 'True';
else print
'False';
?>
-9
mcmeijer at yahoo dot com
19 年前
$val = 1000000
$val2 = floor(log($val,10)) 为 $val2 提供 5 的值,而不是预期的 6。
$val2 = floor(log10($val)) 提供了正确的值。
-9
admin at worldtakeover dot tk
20 年前
关于以 10 为底的对数和 round() 函数的注释。您需要使用 floor() 而不是 round() 来找出数量级。这样,您就不必担心减去 0.5 或其他任何东西。
-8
rhinopete at batpudding dot com
5 年前
似乎单位前缀应该有一个标准的 PHP 函数。也许在将来。

我在寻找一个快速单位前缀函数时发现了此页面。olafurw 的那个被否决了,我认为是因为它有未经检查的数组索引和 /0。所以这里有一个修复的和可读的版本。

- 应该可以追溯到 PHP 4。
- 不适用于分数或负数,因此任何小于 1 的数字都会返回 0。
- 对非常非常大的数字效果不佳,但很容易添加更多前缀。
- 不处理非数字参数。PHP 7+ 可以做到这一点:function binaryprefix( int $units, $unit = '' )

// 返回带有二进制前缀的简化 $units
// 例如 ( 110974120, 'B' ) == 105.8MiB
// 例如 ( 2^100, 'B' ) == 1048576.0YiB
// 例如 ( 0.12314, 'B' ) == 0B
function binaryprefix( $units, $unit = '' )
{
$prefix = array('', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi', 'Yi');
$exponent = min( floor( log( max( 1, $units ), 1024 ) ), count( $prefix ) - 1 );

if ( $units < 1024 )
return sprintf( '%d%s%s', max( 1, $units + 1 ) - 1, $prefix[$exponent], $unit );
else
return sprintf( '%.1f%s%s', $units / pow(1024, $exponent), $prefix[$exponent], $unit );
}

https://en.wikipedia.org/wiki/Binary_prefix#Adoption_by_IEC.2C_NIST_and_ISO

还有更口语化的说法
$prefix = array('', 'k', 'm', 'g', 't', 'p', 'e', 'z', 'y');
-17
dingus_76 at hotmail dot com
16 年前
好吧,我一直在努力让 log 与大数字一起工作,最后我写了一个 bclog 函数,所以为了让大家免受压力,这里就是它

<?php
function bclog($X,$base=10,$decimalplace=12){
$integer_value=0;
while(
$X < 1){
$integer_value = $integer_value - 1 ;
$X = bcmul($X , base);
}
while(
$X >= $base){
$integer_value = $integer_value + 1;
$X = bcdiv($X , $base );
}
$decimal_fraction = 0.0;
$partial = 1.0;
# 将 X 替换为 X 的 10 次方
$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));
# 将 X 替换为 X 的 10 次方
$X = bcpow($X , 10);
$decimalplace = $decimalplace - 1 ;
}
return
$integer_value + $decimal_fraction ;
}
?>
-26
Ulf Wostner
18 年前
<?php

#--------------------------------------------------------
# 整数有多少位数字?
#--------------------------------------------------------

function digit_count($n, $base=10) {

if(
$n == 0) return 1;

if(
$base == 10) {
# 使用内置的 log10(x)
# 可能比 log(x)/log(10) 更准确。
return 1 + floor(log10(abs($n)));
}else{
# 这里 logB(x) = log(x)/log(B) 将不得不做。
return 1 + floor(log(abs($n))/ log($base));
}
}

# 例子:2 的 24 次方有多少个十进制数字?
echo digit_count(pow(2, 24));

# 例子:上个世纪,用二进制写 10 亿需要多少位?

if($country_code == 'US') echo digit_count(pow(10, 9), 2);
if(
$country_code == 'UK') echo digit_count(pow(10, 12), 2);

#--------------------------------------------------------
# 使用 log 格式化列。
#--------------------------------------------------------

# 假设我们有一个动态生成的整数列表,
# 并希望将其显示为表格。log10 在我们的
# digit_count 中有助于计算正确的格式字符串。

function print_list_of_ints($ints, $line_width=40) {

# 将我们的 digit_count 应用于 ints 中的最大 int。
$field_width = 2 + digit_count(max($ints));

# 为 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";
}

# 要生成一个例子,这里有一个基本函数
# 返回一个(伪)随机数列表。

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

# 例子:一个动态格式化为列的随机 int 列表。

print_list_of_ints(rands(11));

/* 示例输出。数字和字体各不相同。可视化等宽字体!

------------------------------------
1093146637 244503173 1346204527
638304372 140216732 1054707210
573915416 1728677954 2038899669
534854768 12674586
------------------------------------

*/

?>
To Top