如何在C#中将BigInteger变为pow Double?

Siy*_*and 3 c# math biginteger

我试图使用BigInteger.Pow方法计算像10 ^ 12345.987654321这样的东西但这个方法只接受整数作为指数,如下所示:

BigInteger.Pow(BigInteger x,int y)

那么如何在上面的方法中使用双数作为指数?

car*_*ira 5

在C#中没有任意精确的大数字支持,所以这不能直接完成.有一些替代方案(例如寻找第三方库),或者您可以尝试类似下面的代码 - 如果基数足够小,就像您的情况一样.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是使用大整数数学来计算指数的整数部分的幂,然后使用双(64位浮点)数学来计算分数部分的幂.然后,使用这个事实

a ^ (int + frac) = a ^ int * a ^ frac
Run Code Online (Sandbox Code Playgroud)

我们可以将这两个值组合成一个大整数.但是简单地将double值转换为BigInteger会失去很多精度,所以我们首先将精度"移动"到bigInteger上(使用上面的循环,以及double类型使用52位精度的事实),然后乘以结果.

请注意,结果是近似值,如果您想要更精确的数字,则需要一个执行任意精度浮点数学运算的库.

更新:如果基数/指数足够小,功率将在范围内double,我们可以简单地做什么Sebastian Piu建议(new BigInteger(Math.Pow((double)@base, exp)))

  • 他想做10 ^**12345.123**,这将超出双倍的范围(Math.Pow的结果).我减少了它,所以我可以在我的控制台应用程序中看到结果,但我会再次增加它以清楚. (2认同)