C#的Math类只支持双精度数的平方根和幂运算。如果我在我的Math2类中添加基于单精度数的平方根和幂函数,可能会使某些事情更快(今天是放松的一天,我觉得优化很放松)。
所以 - 快速的平方根和幂函数,我不需要担心许可证问题,请给我提供一个链接。
C#的Math类只支持双精度数的平方根和幂运算。如果我在我的Math2类中添加基于单精度数的平方根和幂函数,可能会使某些事情更快(今天是放松的一天,我觉得优化很放松)。
所以 - 快速的平方根和幂函数,我不需要担心许可证问题,请给我提供一个链接。
之前的一个问题也提到了如何安装Mono的SIMD支持(虽然没有得到太多关注):
你应该查看这个链接:
http://www.codecodex.com/wiki/Calculate_an_integer_square_root
其中包含了许多快速算法,支持多种不同的编程语言。
例如:
// Finds the integer square root of a positive number
public static int Isqrt(int num) {
if (0 == num) { return 0; } // Avoid zero divide
int n = (num / 2) + 1; // Initial estimate, never low
int n1 = (n + (num / n)) / 2;
while (n1 < n) {
n = n1;
n1 = (n + (num / n)) / 2;
} // end while
return n;
} // end Isqrt()
但是还有很多,一些C/C++的算法被认为是最快的,或者他们声称是。
对于POW算法的检查,我发现了这个链接,以及如何从简单的算法开始到达该算法的解释。
private double Power(double a, int b) {
if (b<0) {
throw new ApplicationException("B must be a positive integer or zero");
}
if (b==0) return 1;
if (a==0) return 0;
if (b%2==0) {
return Power(a*a, b/2);
} else if (b%2==1) {
return a*Power(a*a,b/2);
}
return 0;
}
维基百科有一篇关于计算平方根的广泛文章: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
计算x的y次幂更简单: http://www.osix.net/modules/article/?id=696
我喜欢这种口袋计算器的做法:
...但是我真的不知道它是否快速。
可能最简单的方法是在托管C++中实现浮点版本。它是否比内置的双精度版本更快,我无法确定。
sqrtf
, powf
, sinf
, expf
, …)。 - Marcelo Cantos如果你想要找到一种非迭代、盲目、单行方程的方法(不是算法),那么在这里。由于该方程是一个纯数学的、也是一个数学常数/普遍真理,产生一个数学客观结果(平方根),你不能对该方程进行专利或版权保护。它是供所有人免费使用的。
N = ;
root=(a=(ceil((floor((N/2/(d = (floor((N/8)+4)/2)))))+(d/2))))+((N-(aa))(1/(a*2+1)));
请记住,目前这个方程只能粗略估计无理数的平方根。但我将在将来修复这个问题。
我不会发布源代码。但你可以用scanf读取N,然后将root作为浮点数,最后用printf输出root。