std::log în C++

Calculează logaritmul natural (log), în baza 10 (log10) sau în baza 2 (log2) al unui număr pozitiv.

Sintaxă
double log(double x);    // logaritm natural (baza e)
double log10(double x);  // baza 10
double log2(double x);   // baza 2, C++11

Ce face std::log

std::log este logaritmul natural (ln), nu cel în baza 10, ca pe unele calculatoare. std::log10 spune, aproximativ, câte cifre are un număr, iar std::log2 câți biți sunt necesari sau de câte ori poți înjumătăți o valoare.

Pentru alte baze folosește formula log(x) / log(baza). log(0) dă -inf, iar logaritmul unui număr negativ dă NaN.

Parametri

Parametru Descriere
x Un număr mai mare decât 0.

Ce returnează

Logaritmul, ca double.

Exemple

Exemplul 1: Cele trei baze

#include <cmath>
#include <print>

int main() {
    std::println("log(e^2)    = {:.4f}", std::log(std::exp(2.0)));
    std::println("log10(1000) = {}", std::log10(1000.0));
    std::println("log2(1024)  = {}", std::log2(1024.0));
    std::println("log_3(81)   = {:.4f}", std::log(81.0) / std::log(3.0));
    std::println("log(0)      = {}", std::log(0.0));
}

Rezultat

log(e^2)    = 2.0000
log10(1000) = 3
log2(1024)  = 10
log_3(81)   = 4.0000
log(0)      = -inf

Exemplul 2: Câte cifre și câți pași de căutare binară

#include <cmath>
#include <print>

int main() {
    long long populatie = 19053815;
    int cifre = static_cast<int>(std::log10(static_cast<double>(populatie))) + 1;
    std::println("{} are {} cifre", populatie, cifre);

    int elemente = 1'000'000;
    double pasi = std::ceil(std::log2(static_cast<double>(elemente)));
    std::println("Căutare binară în {} de elemente: cel mult {} de pași", elemente, pasi);
}

Rezultat

19053815 are 8 cifre
Căutare binară în 1000000 de elemente: cel mult 20 de pași

Exemplul 3: În câți ani se dublează o sumă

#include <cmath>
#include <print>

int main() {
    double dobanda = 0.07;
    double ani = std::log(2.0) / std::log(1.0 + dobanda);
    std::println("La 7% pe an, banii se dublează în {:.1f} ani", ani);
}

Rezultat

La 7% pe an, banii se dublează în 10.2 ani

Greșeli frecvente

  • Folosești std::log crezând că este în baza 10. Pentru baza 10 ai std::log10.
  • Calculezi numărul de cifre cu log10 pentru 0 sau numere negative: log10(0) este -inf. Tratează-le separat.

Comenzi înrudite

  • std::exp: Calculează e la puterea x, unde e ≈ 2,71828 este baza logaritmului natural.
  • std::pow: Ridică un număr la o putere: baza la exponent. Exponentul poate fi și negativ sau cu zecimale.
  • std::bit_width: Returnează câți biți sunt necesari pentru a reprezenta un număr fără semn (0 pentru 0).