log1p()
Aprende a usar la función log1p() en PHP para calcular el logaritmo natural de 1 más un número con precisión para valores pequeños.
La función log1p() en PHP calcula el logaritmo natural de 1 + x, expresado como ln(1 + x), de una forma que mantiene la precisión cuando x está muy cerca de cero. Esta página cubre su sintaxis, el problema de precisión que resuelve, los valores que devuelve en los límites de su dominio y cuándo usarla en lugar de log().
Sintaxis
log1p(float $num): float$num— el valor que se suma a 1. Debe ser mayor que-1para obtener un resultado finito.- Valor de retorno — un
floatigual al logaritmo natural (basee) de1 + $num.
Qué hace log1p()
Matemáticamente, log1p($num) es idéntico a log(1 + $num). La diferencia está en la precisión numérica. Los números de punto flotante tienen precisión limitada, por lo que al calcular 1 + $num para un $num muy pequeño, la mayoría de los dígitos significativos de $num se pierden en la suma antes de que se aplique el logaritmo. Esto se denomina cancelación catastrófica.
log1p() está implementada para calcular ln(1 + x) directamente, sin formar la suma intermedia, por lo que esos dígitos se preservan. Para entradas pequeñas es la herramienta correcta; para entradas grandes ambas funciones coinciden.
Ejemplo básico
Pasamos un valor muy pequeño a log1p() e imprimimos el resultado. La salida es el logaritmo natural de 1.0001, expresado en notación científica (9.9995...E-5 significa 0.000099995...).
Por qué log1p() supera a log(1 + $x) para valores pequeños
Compara los dos enfoques con la misma entrada diminuta:
<?php
$x = 1e-15;
echo log1p($x), "\n"; // 1.0E-15 (accurate)
echo log(1 + $x), "\n"; // 1.1102230246252E-15 (wrong)
?>La respuesta esperada es aproximadamente 1e-15. log1p() la devuelve casi exactamente, mientras que log(1 + $x) es aproximadamente un 11% mayor porque 1 + 1e-15 ya redondea mal en aritmética de doble precisión. Cuanto menor sea la entrada, mayor es el error relativo en la versión ingenua — que es exactamente el motivo por el que existe log1p().
Dominio y casos límite
El argumento debe ser mayor que -1. Observa cómo se comportan los límites:
<?php
var_dump(log1p(0)); // float(0) — ln(1) = 0
var_dump(log1p(M_E - 1)); // float(1) — ln(e) = 1
var_dump(log1p(-1)); // float(-INF) — ln(0) is negative infinity
var_dump(log1p(-2)); // float(NAN) — undefined: 1 + (-2) = -1 < 0
?>log1p(0)devuelve0, ya queln(1) = 0.- En
$num = -1el valor interno es0, y el logaritmo tiende a menos infinito (-INF). - Para
$num < -1el resultado esNAN(no es un número), porque el logaritmo de un valor no positivo no está definido para los números reales.
Valida la entrada antes de llamarla:
<?php
function safeLog1p(float $num): ?float
{
if ($num <= -1) {
return null; // outside the valid domain
}
return log1p($num);
}
var_dump(safeLog1p(0.5)); // float(0.4054651081081644)
var_dump(safeLog1p(-1.5)); // NULL
?>Cuándo usarla
log1p() es una optimización de precisión, por lo que resulta ventajosa siempre que trabajes con cantidades próximas a cero:
- Finanzas — convertir una pequeña tasa de interés o crecimiento
ra una tasa de capitalización continua conlog1p($r). - Estadística y aprendizaje automático — calcular log-probabilidades o log-verosimilitudes donde los valores individuales son minúsculos.
- Computación científica — cualquier fórmula de la forma
ln(1 + x)dondexpuede ser pequeño.
Para entradas habituales que no están cerca de cero, log() funciona perfectamente; ambas devuelven prácticamente el mismo valor. La operación inversa — recuperar x a partir de log1p(x) — es expm1(), que calcula e^x - 1 con la misma ventaja de precisión.
Funciones relacionadas
log()— logaritmo natural o logaritmo en una base arbitraria.log10()— logaritmo en base 10.exp()—eelevado a una potencia (la inversa delog()).expm1()— calculae^x - 1con precisión; la inversa delog1p().- Funciones matemáticas de PHP — descripción general de la biblioteca matemática de PHP.
Conclusión
log1p() calcula ln(1 + x) preservando la precisión para entradas cercanas a cero, donde el enfoque ingenuo log(1 + $x) pierde exactitud. Recuerda que el argumento debe ser mayor que -1, que -1 produce -INF y que los valores por debajo de -1 generan NAN. Úsala en código financiero, estadístico y científico siempre que haya valores pequeños de por medio.