Siy*_*and 3 c# math biginteger
我试图使用BigInteger.Pow方法计算像10 ^ 12345.987654321这样的东西但这个方法只接受整数作为指数,如下所示:
BigInteger.Pow(BigInteger x,int y)
那么如何在上面的方法中使用双数作为指数?
在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)))