我尝试使用 BigInteger.Pow
方法计算类似 10^12345.987654321 的值,但此方法只接受整数作为指数,如下所示:
BigInteger.Pow(BigInteger x, int y)
那么如何在上述方法中使用双数作为指数呢?
最佳答案
C# 中不支持任意精度大数,因此无法直接完成此操作。有一些替代方案(例如寻找第 3 方库),或者您可以尝试类似下面的代码 - 如果基数足够小,就像您的情况一样。
public class StackOverflow_11179289
{
public static void Test()
{
int @base = 10;
double exp = 12345.123;
int intExp = (int)Math.Floor(exp);
double fracExp = exp - intExp;
BigInteger temp = BigInteger.Pow(@base, intExp);
double temp2 = Math.Pow(@base, fracExp);
int fractionBitsForDouble = 52;
for (int i = 0; i < fractionBitsForDouble; i++)
{
temp = BigInteger.Divide(temp, 2);
temp2 *= 2;
}
BigInteger result = BigInteger.Multiply(temp, (BigInteger)temp2);
Console.WriteLine(result);
}
}
想法是使用大整数数学计算指数整数部分的幂,然后使用 double (64 位浮点)数学计算小数部分的幂。然后,利用这个事实
a ^ (int + frac) = a ^ int * a ^ frac
我们可以将这两个值组合成一个大整数。但是简单地将 double 值转换为 BigInteger 会损失很多精度,因此我们首先将精度“转移”到 bigInteger(使用上面的循环,以及 double
类型使用 52 的事实位的精度),然后将结果相乘。
请注意,结果是一个近似值,如果您想要更精确的数字,您将需要一个可以执行任意精度 float 学运算的库。
更新:如果底数/指数足够小以至于幂在 double
的范围内,我们可以简单地按照 Sebastian Piu 的建议( new BigInteger(Math.Pow((double)@base, exp))
)
关于c# - 如何在 C# 中将 BigInteger 转换为 pow Double?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11179289/