gpt4 book ai didi

c# - 如何在 C# 中将 BigInteger 转换为 pow Double?

转载 作者:行者123 更新时间:2023-11-30 14:00:20 29 4
gpt4 key购买 nike

我尝试使用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com