c++ - 我如何检查 std::pow 是否会溢出 double

标签 c++ gmp pow

我有一个函数可以处理任意大的网格。由于使用 std::pow,我需要计算另一个数字的幂的网格是否适合 double 。如果不能,我想采用不同的分支并使用 gnu multiprecision library 而不是 normal。

有没有一种快速的方法来查看:

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
}

我完全被 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";
}

这给出了思路。我希望这会有所帮助。

关于c++ - 我如何检查 std::pow 是否会溢出 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18609085/

相关文章:

c++ - GMP 内存管理功能的 Clang 错误

optimization - 优化x64汇编程序MUL循环

xcode - 有什么方法可以阻止 Xcode 生成这样的文件夹吗?

c++ - C/C++ 中 pow() 函数的实现是否因平台或编译器而异?

c++ - 段错误 : Dynamically allocating large integer array

c++ - 继承 - 为什么这是非法的?

java - 我无法使用 JAVA 中的 pow 函数将值插入到矩阵字段中

C语言中从pow/powl到Long Long的类型转换值(value)

c++ - 异常被捕获两次

c++ - 如何使用 opencv 查找手动定义地标的描述符