我有一个处理任意大网格的函数。我需要计算由于使用了另一个数字的幂的网格是否适合双精度std::pow。如果不能,我想采用不同的分支并使用 gnu 多精度库而不是普通库。
有没有一种快速的方法来查看是否:
int a = 1024;
int b = 0-10;
if(checkPowFitsDouble(a, b)) {
long c = static_cast<long>(std::pow(a, b)); //this will only work if b < 6
} else {
mpz_t c; //yada yada gmp
}
Run Code Online (Sandbox Code Playgroud)
我完全被 checkPowFitsDouble 难住了;也许有一些我不知道的数学技巧。
检查幂运算是否会溢出的常见技巧是使用对数。这个想法基于以下关系:
a^b <= m <=> log(a^b) <= log(m) <=> b * log(a) <= log(m) <=> b <= log(m) / log(a)
例如,
int a = 1024;
for (int b = 0; b < 10; ++b) {
if (b * std::log(a) < std::log(std::numeric_limits<long>::max())) {
long c = std::pow(a, b);
std::cout << c << '\n';
}
else
std::cout << "overflow\n";
}
Run Code Online (Sandbox Code Playgroud)
这给出了想法。我希望这有帮助。