搜索
bottom↓
回复: 3

献上一个在小区间上的反三角函数的快速算法

[复制链接]

出0入0汤圆

发表于 2012-12-2 16:34:05 | 显示全部楼层 |阅读模式
本帖最后由 信天游 于 2012-12-2 16:36 编辑

C51的函数库中带有反三角函数acos(x),但是对于速度要求高的场合,库函数的速度有点不理想,想再快一点的话就要自己构造函数来代替库函数,新手今天为献上一个快速算法,以及是怎样得到的(这种近似方法只适用于小区间的计算)
在纸上画出y=arccos(x)的图像,取x在(根号3/2,1)区间上,y在(0,π/6)区间上,在此区间上原函数的图象可近似看做是一段抛物线,通过待定系数法可以求出抛物线的方程为y=√((-2.083)(x-1)),到此就完成了第一步近似实际值是[π²/(36((√3)/2)-1)]
再来看y=√((-2.083)(x-1)),还要用到库函数中的开方运算,小弟我又上网找了找,找到了一种计算方法,叫做Carmack快速开放算法,坛子里有关于这个算法的介绍(搜索“神一样的算法”),将Carmack算法稍微做一下修改就是开放算法
但是将两种算法结合在一起,回产生较大的误差,这时候可以适当的减小y=√((-2.038)(x-1))中的系数,可以取-2.045,这时候的误差小于0.1%,一般均可以适应实际的计算要求
以下是算法代码:
  1. float arccos(float arc)
  2. {
  3.          float x=(-2.045)*(arc-1);
  4.          float xhalf = 0.5f*x;
  5. //      float xhalf = 0.5f*x;
  6.          float buf=x;
  7.          long i = *(long*)&x;
  8. //注:使编译器强制将x按照 long int 型变量处理
  9.       i = 0x5f3759df - (i >> 1);//What the fuck ???
  10.          x = *(float*)&i;
  11.          x = x*(1.5f - xhalf*x*x);      //1次迭代
  12. //       x = x*(1.5f - xhalf*x*x);      //2次迭代
  13.         return (x*buf);
  14.        
  15. }
复制代码
小弟新手,欢迎拍砖,别拍脸

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-12-2 16:38:20 | 显示全部楼层
怎么这么眼熟啊,这代码。特别是那句注释what the fuck?

出0入0汤圆

 楼主| 发表于 2012-12-2 16:40:29 | 显示全部楼层
kevinstar888 发表于 2012-12-2 16:38
怎么这么眼熟啊,这代码。特别是那句注释what the fuck?

代码本身就是基于Carmack快速开放算法的

出0入0汤圆

发表于 2012-12-2 16:48:32 | 显示全部楼层
又见幻数。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 06:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表