在小型嵌入式系统中,用到sin,cos等三角函数时,不能象在pc上编程般运用math库来实现,若没有浮点运算器,也不能运用泰勒公式展开来计算三角函数值。本文提供一种简单的查表法来计算。

文 件i_sin.h中,保存了0-90度角的sin值向左位移15后的结果。对每个角度的三角函数做运算时,以角度为小标在sin_map表中查找相应的 sin值(位移后的结果)。之所以要对sin值向左位移,是保证可以用整数来表达sin值。位移的大小(本文中为15),标称了sin值取值的精度,越 大,sin值取值越精确。

文件i_sin.h中,提供了两个三角函数的计算宏:
rsin(_r_, _d_),
rcos(_r_, _d_),
参数_r_表示得到的sin或是cos值扩大的倍数;
参数_d_表示角度值。

实现比较简单,不再冗述。
[代码] [C/C++/Objective-C]代码

  1. /******************************************************************  
  2.  *  
  3.  * File Name:       pw_sin.h  
  4.  * Description:     The sin() function map. Using it to calculate a   
  5.  *      angle's sine value and cosine value.   
  6.  *      e.g.   
  7.  *       angle d=30 degrees,   
  8.  *       sin(d) = (sin_map[30] >> SIN_MAP_SHIFT)  
  9.  *       result: sin(30) = 0.5  
  10.  *                    
  11.  * Author :         Jiang Peifu  
  12.  * Date:            2009.04.27  
  13.  */   
  14. #ifndef PW_SIN_H   
  15. #define PW_SIN_H   
  16. /* -------------------------------------------------------------------------- */   
  17. #define SIN_MAP_SHIFT 15   
  18. #define DEGREE_MIN 0   
  19. #define DEGREE_MAX 90   
  20. #define SIN_MAP_SIZE (DEGREE_MAX - DEGREE_MIN + 1)   
  21. #define rsin(_r_, _d_) ((_r_ * sin_map[_d_] + 0x4000) >> SIN_MAP_SHIFT)   
  22. #define rcos(_r_, _d_) ((_r_ * sin_map[DEGREE_MAX-_d_] + 0x4000) >> SIN_MAP_SHIFT)   
  23. int sin_map[SIN_MAP_SIZE] = {   
  24.     0,    
  25.     572,    
  26.     1144,    
  27.     1715,    
  28.     2286,    
  29.     2856,    
  30.     3425,    
  31.     3993,    
  32.     4560,    
  33.     5126,    
  34.     5690,    
  35.     6252,    
  36.     6813,    
  37.     7371,    
  38.     7927,    
  39.     8481,    
  40.     9032,    
  41.     9580,    
  42.     10126,    
  43.     10668,    
  44.     11207,    
  45.     11743,    
  46.     12275,    
  47.     12803,    
  48.     13328,    
  49.     13848,    
  50.     14365,    
  51.     14876,    
  52.     15384,    
  53.     15886,    
  54.     16384,    
  55.     16877,    
  56.     17364,    
  57.     17847,    
  58.     18324,    
  59.     18795,    
  60.     19261,    
  61.     19720,    
  62.     20174,    
  63.     20622,    
  64.     21063,    
  65.     21498,    
  66.     21926,    
  67.     22348,    
  68.     22763,    
  69.     23170,    
  70.     23571,    
  71.     23965,    
  72.     24351,    
  73.     24730,    
  74.     25102,    
  75.     25466,    
  76.     25822,    
  77.     26170,    
  78.     26510,    
  79.     26842,    
  80.     27166,    
  81.     27482,    
  82.     27789,    
  83.     28088,    
  84.     28378,    
  85.     28660,    
  86.     28932,    
  87.     29197,    
  88.     29452,    
  89.     29698,    
  90.     29935,    
  91.     30163,    
  92.     30382,    
  93.     30592,    
  94.     30792,    
  95.     30983,    
  96.     31164,    
  97.     31336,    
  98.     31499,    
  99.     31651,    
  100.     31795,    
  101.     31928,    
  102.     32052,    
  103.     32166,    
  104.     32270,    
  105.     32365,    
  106.     32449,    
  107.     32524,    
  108.     32588,    
  109.     32643,    
  110.     32688,    
  111.     32723,    
  112.     32748,    
  113.     32763,    
  114.     32768,    
  115. };   
  116. #endif /* PW_SIN_H */  

本文转载自 http://www.itjianghu.net/120109/40917429791666725.htm