Open2
powの誤差について
#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 <- 正
}
誤差が出ないようにするには本当に方法(2)のように実装するしか無いんでしょうか ...
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 と組み合わせないと本領発揮しなそう