百科问答小站 logo
百科问答小站 font logo



求教,atan2函数有什么简易的替代品? 第1页

  

user avatar   zhang-hao-72 网友的相关建议: 
      

自己答一个:后来考虑了一下其实有asin就行了,用了查表+线性插值的方案。查找表只用了0到90度,间隔5.625度的17个点, 再乘以0xffff,如下:

       const unsigned short sintab[] = {     0x0000, 0x1918, 0x31f1, 0x4a50, 0x61f7, 0x78ad, 0x8e39, 0xa267, 0xb504, 0xc5e3,      0xd4da, 0xe1c5, 0xec82, 0xf4f9, 0xfb14, 0xfec3, 0xffff };     

然后查表+线性插值,输入限定在0~0xffff。

       int int_asin(int x) {     int ret, sign=1;     if(x<0) {         x=-x;         sign=-1;        // 处理负数     }     for(int i = 0; i < sizeof(sintab) / sizeof(sintab[0]); i++) {         if(sintab[i] <= x && x <= sintab[i + 1]) {             ret =  (((x - sintab[i]) * 90 / (sintab[i+1] - sintab[i]) + i * 90) ) >> 4;             break;         }     }     return ret * sign; }     

实测算出来的角度值和math库的asin基本相符,个别情况差1度。

       int main(void) {     for(int i = -90; i <= 90; i++) {         int y = (sin(i * 3.141593 / 180.0) * 65535.0);         int x1 = int_asin(y);          float x2 = asin(y / 65536.0) * 180.0 / 3.141593;         printf("%d %d %.3f %d
", i, x1, round(x2), x1-round(x2));     }      return 0; }     




  

相关话题

  如何理解互斥锁、条件锁、读写锁以及自旋锁? 
  在C语言中,math.h中定义的各种数学函数在电脑上具体是怎么实现的? 
  我想用Qt做一个第一视角的赛车游戏,请问我应该看哪些相关书籍? 
  有什么像a=a+b;b=a-b;a=a-b;这样的算法或者知识? 
  C语言中后缀自加i++表达式的值到底是谁的值? 
  Mac 下顺手的 C/C++ 开发 IDE 是哪个? 
  Linux如何优化程序的体积大小? 
  C语言和C++中,为什么malloc函数需要传入申请的内存大小,而free时候却不需要传大小呢? 
  为什么这个程序电脑运行的结果和手机运行的不一样?数值小的时候一样? 
  你工作中最推荐的 C/C++ 程序库有哪些,为什么? 

前一个讨论
c语言如何定义没有返回值的main函数?
下一个讨论
假设可控核聚变实现,地球是否会有危机,比如全球变暖?





© 2025-01-28 - tinynew.org. All Rights Reserved.
© 2025-01-28 - tinynew.org. 保留所有权利