sqlpostgresqlexplogarithm

EXP e LN no SQL: exponencial, logaritmo natural e medias geometricas

Como EXP e LN calculam e^x e o logaritmo natural, por que o par log/exp serve para medias geometricas e taxas de crescimento, e por que LN(0) falha.

2 min de leituraReferencesql · postgresql · exp · logarithm · statistics · clickhouse

EXP eleva o numero de Euler e a uma potencia, e LN tira o logaritmo natural na base e. Sao funcoes inversas uma da outra, e esse par e justamente o que transforma multiplicacao em soma, deixando limpos os calculos de medias geometricas e taxas de crescimento.

O que EXP e LN calculam

EXP(x) devolve e^x, onde e vale aproximadamente 2.718281828. LN(x) e a inversa: responde a "a que potencia preciso elevar e para obter x".

SELECT
  EXP(1)        AS e,        -- 2.7182818...
  EXP(0)        AS one,      -- 1
  LN(EXP(1))    AS back,     -- 1
  LN(1)         AS zero;     -- 0

Propriedades principais para se apoiar:

  • EXP e LN desfazem uma a outra: LN(EXP(x)) = x e EXP(LN(x)) = x para x > 0.
  • O logaritmo transforma um produto em soma: LN(a * b) = LN(a) + LN(b).
  • O resultado no PostgreSQL e double precision, entao espere pequenos erros de arredondamento como 0.9999999998.

Media geometrica com exp(avg(ln))

Multiplicar muitos numeros de forma direta estoura quase qualquer tipo rapidamente. O truque exp(avg(ln(x))) calcula a media geometrica sem sair de uma faixa segura: tiramos logaritmos, fazemos a media no sentido aritmetico comum e voltamos com a exponencial.

SELECT
  dept,
  EXP(AVG(LN(salary))) AS geo_mean_salary
FROM employees
WHERE salary > 0
GROUP BY dept
ORDER BY geo_mean_salary DESC;

A media geometrica resiste melhor aos valores extremos do que a aritmetica, por isso e preferida para salarios, precos e razoes. A mesma abordagem da um tamanho tipico de pedido por pais:

SELECT
  u.country,
  EXP(AVG(LN(o.amount))) AS typical_order
FROM orders o
JOIN users u ON u.id = o.user_id
WHERE o.amount > 0
GROUP BY u.country;

Taxas de crescimento e capitalizacao continua

A diferenca de logaritmos e o retorno logaritmico, a taxa de crescimento continua entre dois valores. LN(new / old) da uma quantidade que voce pode somar entre periodos, e EXP da soma recupera o multiplicador total.

WITH monthly AS (
  SELECT
    date_trunc('month', created_at) AS m,
    SUM(amount)                     AS revenue
  FROM orders
  WHERE status = 'paid'
  GROUP BY 1
)
SELECT
  m,
  revenue,
  LN(revenue / LAG(revenue) OVER (ORDER BY m)) AS log_growth
FROM monthly
ORDER BY m;

Some todos os valores de log_growth e aplique EXP a soma para obter o multiplicador de crescimento total de todo o periodo, mesmo quando os numeros mensais oscilam.

Armadilha: LN(0) e LN de negativos

LN so e definido para numeros estritamente positivos. LN(0) tende a menos infinito e levanta um erro no PostgreSQL, enquanto LN de um numero negativo nao e definido de forma alguma.

SELECT LN(0);    -- ERROR: cannot take logarithm of zero
SELECT LN(-5);   -- ERROR: cannot take logarithm of a negative number

Proteja-se com um filtro ou com NULLIF para que um unico zero nao derrube toda a agregacao:

SELECT
  dept,
  EXP(AVG(LN(NULLIF(salary, 0)))) AS geo_mean
FROM employees
GROUP BY dept;

Atencao: os dialetos divergem. PostgreSQL e Oracle lancam erro em LN(0), enquanto o MySQL devolve NULL tanto para LN(0) quanto para LN(-1). O ClickHouse vai alem e entrega -inf ou nan sem nenhum erro. Nunca confie no comportamento padrao; limpe sempre a entrada antes.

Troca de base e par com LOG

O logaritmo natural permite construir um logaritmo em qualquer base com a formula LN(x) / LN(b). Esse e o mesmo resultado do LOG(b, x) embutido no PostgreSQL.

SELECT
  LN(8) / LN(2)  AS log2_via_ln,   -- 3
  LOG(2, 8)      AS log2_builtin,  -- 3
  LOG(1000)      AS log10;         -- 3 in PostgreSQL

Tenha em mente as diferencas:

  • PostgreSQL: LOG(x) e o logaritmo na base 10, enquanto LOG(b, x) toma a base b.
  • MySQL: LOG(x) e o logaritmo natural (como LN), e LOG(b, x) troca a base; tambem existem LOG2 e LOG10 separados.
  • ClickHouse: log(x) e o logaritmo natural, com log2 e log10 para o resto.

Lembre do essencial: EXP e LN sao inversas, exp(avg(ln)) da uma media geometrica, LN(new/old) e uma taxa de crescimento, e a entrada do LN deve ser estritamente positiva.

Pratique com exercícios reais

Resolva exercícios no treinador de SQL com correção instantânea e dicas.

Abrir o treinador