2011-05-24 56 views
1

问题很简单;我需要最快的方式来计算功率2.我需要这个计算2点之间距离的公式。最快获得力量的方式2

var Dist:int = Math.sqrt( (mmx - ox) * (mmx - ox) + (mmy - oy) * (mmy - oy) ); 

任何想法?

+3

sqrt调用的时间将远远大于乘法 – 2011-05-24 02:57:08

+1

http://www.boostworthy.com/blog/?p=197 – Marty 2011-05-24 02:59:51

+3

平方不是通过位移来完成的。你在考虑2^n,而不是n^2。另外,为什么你不使用Math.pow? – 2011-05-24 03:01:33

回答

0

如果你想calc下开方为正数a,采取递归sequense

x_0 = a 
x_n+1 = 1/2 * (x_n + a/x_n) 

x_nsqrt(a)n -> infinity。前几次迭代应该足够快。

希望有帮助!

+0

.. ummm ..我需要一个快速的方法来获得n * n和Math.pow是慢..任何建议? – 2011-05-26 01:02:40

+1

@ KataxEmperorKatax,我以为你想要加上'sqrt'计算,它比'n * n'慢得多。 – Eugeny89 2011-05-27 08:19:54

+0

_manually_正在做什么'Math.sqrt'在封面下可以让你准确地知道速度?您正在将操作从一个非常快速的CPU转移到相对冰点的ActionScript。 – paxdiablo 2011-09-22 08:55:55

6

最快方式往往是一个查找表,只要你能限制你的输入值,以一个足够小的范围内,如用(伪代码):

int sqr_arr[] = {0, 1, 4, 9, 16, 25, 36, ...} 
def sqr(n): 
    if n < 0: 
     return sqr(-n) 
    if n >= len(sqr_arr): 
     return n * n 
    return sqr_arr[n] 

这使得高速表查找较低的值,但如果尝试使用不在表中的参数,则会返回(可能)较慢的方法。但是,正如Mitch Wheat在评论中所述,当真正的瓶颈是平方根时,加速倍增不会产生太大影响。

并记住:措施,不要猜测!我认为自己非常善于优化策略,但您应该像对待排水沟中的酒精一样对待所有建议(包括我的),告诉您如何过上漫长而成功的生活。

+1

“措施,不要猜测!”+1。 – 2011-05-24 03:10:24

+2

@paxdiablo,as3中的表格查找速度很慢,最快的方法是待办事项,并且您正在做2分支测试(n <0) and (n> len(...)),这也会减慢您的功能。 – Patrick 2011-05-24 07:05:34

+0

@帕特里克,没关系。这是比AS特定的更一般的建议。正如我所说,你应该衡量任何宣称的改进的表现,如果他们不削减它,要么改进它们,要么丢掉它们。 – paxdiablo 2011-05-24 07:41:51