kb_machblue_core_math.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:4k
源码类别:

DVD

开发平台:

C/C++

  1. //*****************************************************************************
  2. //File Name: kb_machblue_core_math.c
  3. //
  4. //Description: math function
  5. //
  6. // used by Machblue to access the platform's math api.
  7. //
  8. //Author: steven
  9. //
  10. //Date:  2006.12.29
  11. //
  12. //Version:  v1.0
  13. //*****************************************************************************
  14. #include "stdio.h"
  15. #include "stdlib.h"
  16. #include "math.h"
  17. typedef union 
  18. {
  19.    struct 
  20.    {
  21.      unsigned int lsw;
  22.      unsigned int msw;
  23.    }parts;
  24.    double value;
  25. }mb_double_shape_type;
  26. /**
  27.  * Initializes the random number generator.
  28.  * seed   < seed number >
  29.  
  30.  * @return none.
  31.  */
  32. void mb_srand(unsigned int seed)
  33. {
  34. srand(seed) ;
  35. }
  36. /**
  37.  * @return a random number between 0 and mb_rand_max().
  38.  */
  39. int mb_rand( void )
  40. {
  41. return rand();
  42. }
  43. /**
  44.  * @return the value of the maximum random number that can be returned by
  45.  * mb_rand().
  46.  */
  47. int mb_rand_max(void)
  48. {
  49. return RAND_MAX;
  50. }
  51. /**
  52.  * @return the absolute value of x.
  53.  */
  54. float mb_fabsf(float x)
  55. {
  56. return (float)fabs(x);
  57. }
  58. /**
  59.  * @return the Arc Cosine of x.
  60.  */
  61. float mb_acosf(float x)
  62. {
  63.     return (float)acos(x);
  64. }
  65. /**
  66.  * @return the Arc Sine of x.
  67.  */
  68. float mb_asinf(float x)
  69. {
  70. return (float)asin(x);
  71. }
  72. /**
  73.  * @return the Arc Tangent of x ( ]-pi/2,pi/2[ resolution ).
  74.  */
  75. float mb_atanf(float x)
  76. {
  77. return (float)atan(x);
  78. }
  79. /**
  80.  * @return the Arc Tangent of (y / x) for ]-pi,pi] / {-pi/2,pi/2} resolution.
  81.  */
  82. float mb_atan2f(float y,float x)
  83. {
  84. return (float)atan2(y, x);
  85. }
  86. /**
  87.  * @return the Cosine of x.
  88.  */
  89. float mb_cosf(float x)
  90. {
  91. return (float)cos(x);
  92. }
  93. /**
  94.  * @return the Sine of x.
  95.  */
  96. float mb_sinf(float x)
  97. {
  98. return (float)sin(x);
  99. }
  100. /**
  101.  * @return the Tangent of x.
  102.  */
  103. float mb_tanf(float x)
  104. {
  105. #ifdef _SH4GCC_
  106.     /* Our SH4 linux implementation cannot calculate tan of PI/4. */
  107.     if(x == (float)(PI/4.0))
  108.     {
  109.        return 1.0;
  110.     }
  111. #endif
  112.     return (float)tan(x);
  113. }
  114. /**
  115.  * @return the Exponential of x.
  116.  */
  117. float mb_expf(float x)
  118. {
  119.     return (float)exp(x);
  120. }
  121. /**
  122.  * @return the Natural Logarithm of x.
  123.  */
  124. float mb_logf(float x)
  125. {
  126.     return (float)log10(x);
  127. }
  128. /**
  129.  * @return the x raised to the power of y.
  130.  */
  131. float mb_powf(float x,float y)
  132. {
  133.     return (float)pow(x,y);
  134. }
  135. /**
  136.  * @return the square root of x.
  137.  */
  138. float mb_sqrtf(float x)
  139. {
  140.     return (float)sqrt(x);
  141. }
  142. /**
  143.  * @return the largest integer smaller than x.
  144.  */
  145. float mb_floorf(float x)
  146. {
  147.     return (float)floor(x);
  148. }
  149. /**
  150.  * @return the smallest integer larger than x.
  151.  */
  152. float mb_ceilf(float x)
  153. {
  154.     return (float)ceil(x);
  155. }
  156. /**
  157.  * @return the reminder of x / y (double version).
  158.  */
  159. double mb_fmod(double x,double y)
  160. {
  161.     return fmod(x, y);
  162. }
  163. /**
  164.  * @return the reminder of x / y (float version).
  165.  */
  166. float mb_fmodf(float x,float y)
  167. {
  168.     return (float)fmod(x, y);
  169. }
  170. static  int isnan_f  (float       x) { return x != x; }
  171. static  int isnan_d  (double      x) { return x != x; }
  172. static  int isnan_ld (long double x) { return x != x; }
  173. /**
  174.  * @return non zero if x is not a number, 0 otherwise.
  175.  */
  176. int mb_isnan(double x)
  177. {
  178. #if 1
  179.      return (sizeof (x) == sizeof (long double) ? isnan_ld (x) 
  180.                : sizeof (x) == sizeof (double) ? isnan_d (x) 
  181.                : isnan_f (x));
  182. #else
  183.     return 0;
  184. #endif
  185. }
  186. /**
  187.  * @return non zero if x is a finite number, 0 otherwise.
  188.  */
  189. int mb_finite(double x)
  190. {
  191. #if 1
  192.   int hx,rc;
  193.   mb_double_shape_type gh_u;
  194.   
  195.   gh_u.value = x;
  196.   hx = gh_u.parts.msw;
  197.   rc=(int)((unsigned int)((hx&0x7fffffff)-0x7ff00000)>>31);
  198.   if(rc==0) return 0;
  199.   else return rc;
  200. #else
  201.     return 0;
  202. #endif
  203. }