Open2

powの誤差について

log5log5
#include <bits/stdc++.h>
using namespace std;
int main(void){
    // 5 ^ 25 = 298023223876953125
    
    // (1)
    cout << (long long) pow(5, 25) << endl; // 298023223876953152 <-誤
    
    // (2)
    long long a;
    for (long long i = 5, j = 1; j <= 25; i *= 5, j++) a = i;
    cout << a << endl; // 298023223876953125 <- 正
}

https://paiza.io/projects/_ue-zxTgCBvGs8rcsQ_o0g\

誤差が出ないようにするには本当に方法(2)のように実装するしか無いんでしょうか ...

log5log5
long long powll(long long b, long long e) {
    long long answer = 1;
    for (long long i = 1; i <= e; answer *= b, i++);
    return answer;
}

自力だとこれが限界かな...
ただどのみちすぐオーバーフローするだろうからあまり使われなそう
というか mod int と組み合わせないと本領発揮しなそう