JavaScript 新手提个问题,关于 Math.pow(),能帮忙看一下么?

2014-06-26 16:04:57 +08:00
 DemonCloudy
JavaScript中的Math.pow函数是求次方(幂).虽然原生有函数. 但是我模拟了一个Pow的函数.具体写法如下:

function Power(n,t){
var number=1;
if((isNaN(n)||isNaN(t))||(n==0&&t==0)){
return false; //can't Calculate! Because is Not A Number!
}
if(n==0||t==1){
return n;
}else if(t==0){
return 1;
}else if(t<0){
for(var i=0;i<-t;i++)
number *= 1/n;
}else{
for(var j=0;j<t;j++)
number *= n;
}
return number;
}

经过测试 , 总比原生的Math.pow方法慢了0.17ms...
请问有没有更加好的写法.或者是一些改进写法,哪怕是一些文章也行..? 3Q~~
能否提供参考学习一下,新手.
3357 次点击
所在节点    问与答
9 条回复
lyric
2014-06-26 16:07:27 +08:00
虽然你的目的不明,但是也许可以参考

https://github.com/codemix/fast.js

Fast.js is a collection of micro-optimisations aimed at making writing very fast JavaScript programs easier
lsylsy2
2014-06-26 16:09:50 +08:00
当T很大时候,一个做法是二分,大致原理是n为偶数时,a^n=(a^(n/2))^2
9hills
2014-06-26 16:21:54 +08:00
Math.pow是浏览器的js引擎(比如v8就是C++)实现的

你这个是js实现的,效率高低肯定是有区别啊
rrfeng
2014-06-26 16:24:56 +08:00
我瞬间就想起了 John Carmack Quake-III 里的 sqrt 函数。

建议楼主拜读。

随便找了一篇 http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html
DemonCloudy
2014-06-26 16:31:51 +08:00
@rrfeng //已读...无比蛋疼
@9hills

真是给跪了, 数据越大,加载的时间越长, 怎么优化还是少个2ms. 我看看关于循环的一些比较快的算术方法,,擦,,哎呀..
DemonCloudy
2014-06-26 16:34:02 +08:00
已改..
function Power(n,t){
var number =1;
if((n==0||t==1)||(n==1||t==0)){
return n;
}else if(t<0){
for(var i=0;i<-t;i++)
number *= 1/n;
}else{
for(var j=0;j<t;j++)
number *= n;
}
return number;
}
9hills
2014-06-26 16:37:01 +08:00
@DemonCloudy 换个语言会好很多,真的。。js的效率和C++的效率还是差太远
Mutoo
2014-06-26 16:43:20 +08:00
sqrt神秘常数感觉有点神化了,就是找个初值么,游戏开发者最常用的就是遗传算法了,用随机替代暴力,快速找出一个得分较高的初值咯。
DemonCloudy
2014-06-26 16:49:36 +08:00
@9hills
@rrfeng
..巨大收获...3Q...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/119667

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX