hotaruの蛍雪日記

競プロとゲームをしています

私の浮動小数点数を使わずにlog2nを求める関数

  • 競プロで\log_2N(N\in\mathbb{N})を計算したい。
  • 浮動小数点数を使う(関数2)と誤差がでて危ない。
  • なので関数1でやる。
// 関数1
constexpr long long log2n(long long n) {
    long long log_n = 1;
    while ((1LL << log_n) < n) log_n++;
    return log_n;
}

// 関数2
constexpr long long log2nAnother(long long n) {
    return ceil(log2(n));
}

// 環境: C++(GCC 9.3.0 C++17)