【发布时间】:2013-09-04 08:37:28
【问题描述】:
我有一个处理任意大网格的函数。由于使用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
}
我完全被 checkPowFitsDouble 难住了;也许有一些我不知道的数学技巧。
【问题讨论】:
-
如果您仍要使用例如特殊情况下的 GMP,为什么不删除那些特殊情况并只使用 GMP?
-
@JoachimPileborg 我需要这个功能非常快。如果我可以在某些情况下避免 gmp,我需要这样做。大多数时候 gmp 不会被使用,所以我想利用它。
-
您可以尝试最大双打的对数并进行正确的除法,但这可能会减慢速度
-
@doctorlove 谢谢!我现在正在为此开发一个更好的基准。
-
理论上你可以使用任何对数,以 10 为底、自然或 17。但最合乎逻辑的底数是 2,而且你真的不关心该日志的小数部分。这意味着您拥有非常高效的
frexp函数。