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,
EXP(0) AS one,
LN(EXP(1)) AS back,
LN(1) AS zero;
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.
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);
SELECT LN(-5);
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.
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,
LOG(2, 8) AS log2_builtin,
LOG(1000) AS log10;
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.
EXPeleva o numero de Eulerea uma potencia, eLNtira o logaritmo natural na basee. 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)devolvee^x, ondeevale aproximadamente2.718281828.LN(x)e a inversa: responde a "a que potencia preciso elevarepara obterx".SELECT EXP(1) AS e, -- 2.7182818... EXP(0) AS one, -- 1 LN(EXP(1)) AS back, -- 1 LN(1) AS zero; -- 0Propriedades principais para se apoiar:
EXPeLNdesfazem uma a outra:LN(EXP(x)) = xeEXP(LN(x)) = xparax > 0.LN(a * b) = LN(a) + LN(b).double precision, entao espere pequenos erros de arredondamento como0.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, eEXPda 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_growthe apliqueEXPa 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
LNso e definido para numeros estritamente positivos.LN(0)tende a menos infinito e levanta um erro no PostgreSQL, enquantoLNde 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 numberProteja-se com um filtro ou com
NULLIFpara 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;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 doLOG(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 PostgreSQLTenha em mente as diferencas:
LOG(x)e o logaritmo na base 10, enquantoLOG(b, x)toma a baseb.LOG(x)e o logaritmo natural (comoLN), eLOG(b, x)troca a base; tambem existemLOG2eLOG10separados.log(x)e o logaritmo natural, comlog2elog10para o resto.Lembre do essencial:
EXPeLNsao inversas,exp(avg(ln))da uma media geometrica,LN(new/old)e uma taxa de crescimento, e a entrada doLNdeve ser estritamente positiva.