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

标签 c# math biginteger

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

相关文章:

java - 在 Java 中确定 BigInteger 是否为素数

java - BigInteger Sqrt 函数不收敛

math - 大整数的 OR 乘法

javascript - 无法使用 Method Math Parser 评估数学表达式

c# - Generic Repository 是否需要一个 Base Entity 类才能在所有地方应用?

c# - 如何在另一个线程中访问 GUI 元素?

c# - 在 C# 中从 javascript 生成 html 编码

c# - asp.net 中的用户控件未设置 <%=value %>

java - scala 中的错误 : ambiguous reference to overloaded definition, ND4J

c - 快速物流功能