如何处理 c/c++ 中大指数的数字?

How to handle number with large exponent in c/c++?

我发现自己需要计算一个大数的指数,e。 g.exp(709)。这样的数字将以浮点精度表示为 8.2184074615549724e+307.

指数大于该值的数字似乎会简单地转换为 Inf,这会在我的代码中产生问题。我只能猜测可以使用更多位来表示指数来解决问题,但我不知道有什么实用的方法可以继续。

这是一个代码片段:

double expon = exp(500); /*here I also tried `long double`, with no effect */
printf("%e\n", expon ); /*gives INF*/
double Wa = LambertW<0>( expon); /*gives error, as it can't handle inf*/

有没有办法计算这个?

这个问题一直在争论,但我没有找到有用的答案。此外,GCC 似乎从版本 4.3 开始支持多精度浮点运算。它有什么帮助?

Edit: The suggested possible-duplicate questions turned out irrelevant because as I need huge decimals, not exact decimals. This is not a duplicate.

您应该能够使用 long double 算法以足够的精度执行计算:

80位的最大值long double是1.18×10^4932,比e^709大很多

为了按照 long double 执行计算,如果 exp:

,则必须使用 expl
long double expon = expl(500);
printf("%Le\n", expon);

LambertW 函数将处理 long double 如果它被适当地重载为这种类型,否则 expon 将被转换为 double 并产生 inf 并且如您所述,计算将失败。

我不知道您使用的是 Lambert W 函数的哪个实现,Darko Veberic 的不支持 long double 参数,但将实现扩展为类型 long double 可能是可行的以源形式提供:https://github.com/DarkoVeberic/LambertW。您可能想直接联系他。

另一种方法是考虑 exp(709) 太接近 double 类型的最大精度 10^308。如果您可以使用更小的指数和不同的公式来改变您的计算,则可以使用常规 double 类型完成计算。