所以我在谷歌上搜索了很长时间,但几乎什么也没找到。我发现了一些关于 Math.Pow 可能实现的信息this url,但它们不准确,例如这段代码
public static double PowerA(double a, double b)
{
int tmp = (int)(BitConverter.DoubleToInt64Bits(a) >> 32);
int tmp2 = (int)(b * (tmp - 1072632447) + 1072632447);
return BitConverter.Int64BitsToDouble(((long)tmp2) << 32);
}
static void Main(string[] args)
{
double x = 12.53, y = 16.45;
Console.WriteLine(Math.Pow(x, y));
Console.WriteLine(PowerA(x, y));
}
提供输出:
1,15158266266297E+18
8,9966384455562E+17
这么不准确...
我认为它的工作方式就像系列的总和,但我不确定。
pow 通常用以下公式计算:
x^y = exp2(y*log2(x))
功能exp2(x),log2(x)
直接实现在FPU。如果你想实施bignums那么它们也可以通过基本运算符使用预先计算的 sqrt-power 表进行评估,例如:
2^1/2, 2^1/4, 2^1/8, 2^1/16, 2^1/32 ...
加快进程
如果您还需要处理负碱基的生根,请参阅以下内容:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)