几种常用的开平方方法
来源:互联网 发布:seo导航 编辑:程序博客网 时间:2024/05/07 19:57
首先是最普通的CRT里自带的sqrt,只需要引用math.h就可以使用了:
接下来是传统的牛顿迭代法,我们计算开方的时候就是手工不断尝试每一位最合适的数字,然后一步步收敛求得更精确的答案。牛顿迭代法就是通过折半来快速收敛,每迭代一次就得到更精确的结果,下面这段程序采用的是迭代10次的牛顿迭代法:
既然每次计算都需要那么多步骤,为什么不预先计算好之后储存,使用的时候再通过查表来取得结果呢?
首先是建立一个表,把计算好的结果都存放进去,我这里建立的是0到10,精确到百分位总共有1001个条目的表:
不需要用表的时候可以把表释放掉:
然后是查表的函数,直接从对应的项目取出来就行了:
最后,是出现在Quake3代码里的,顶级游戏引擎设计师约翰卡马克的开方方法,quake3-1.32b/code/game/q_math.c里可以找到实现:
还有另一个版本的实现是:
卡马克进行开方时也进行了迭代,但是只迭代了一次,因为通过那个奇怪的数字0x5f3759df就使得“只用迭代一次就取到比较满意的结果”。
测试几个数开方:
4
Sqrt:2.000000
NewtonSqrt:2.000000
TabelSqrt:2.000000
CarmSqrt:1.954374
10
Sqrt:3.162278
NewtonSqrt:3.162278
TabelSqrt:3.162278
CarmSqrt:3.235606
除了卡马克开方之外,其他的方法得到的结果都是一样的,也是更精确的,因为卡马克开方虽然快速逼近最终值,但是只迭代了一次。
接下来是评测一下速度,我们从0.00到10.00每次递增0.01共1001个数字进行开方,统计时间,在我这台机器得到的结果如下,单位是毫秒:
Sqrt:0:71
Carm:0:28
Newton:0:472
Tabel:0:52
可以看到,卡马克开方惊人的快,甚至差不多比查表要少一半的时间。
如果在精度要求允许的范围,用卡马克的方法是最好的,要更精确的结果,可以多迭代几次,这都没问题;如果要实现任意精度开方,可以用牛顿迭代法计算;如果需要精度和速度之间做平衡,同时不在乎占用的空间,可以使用查表法;当然,CRT里自带的sqrt就已经做得相当好了,一般使用没什么问题。
- 几种常用的开平方方法
- 几种开平方算法
- 手动开平方的简易方法
- 开平方的七种算法
- 手算开平方方法
- 开平方的算法(转)
- 快速开平方的算法
- 〖数学算法〗开平方的七种算法
- 最快速的开平方算法
- 单片机开平方的快速算法
- 不用SQRT开平方的C++代码
- java 带根号的开平方
- SQL 开平方
- 整数开平方
- 支点(开平方实践)
- SQL 开平方
- 开平方算法
- 开平方算法
- MS SqlServer sql语言语法的注意事项
- 杂感一篇,小悟专注的精神
- Linux 下面访问windows共享文件夹命令
- 学习者
- sed简单的应用,在匹配行后追加多行
- 几种常用的开平方方法
- 测试word2010
- uva 350 - Pseudo-Random Numbers
- 怎样加快自己的成长速度?
- Linux内核编译详解(转自linuxSir)
- 我的FLASH情结2010——浅谈FLASH WEB GAME与创业
- 宫行之后
- 【其实很简单】C++指针
- android opengl es 变形效果