RT-AICHIP-sample
tinyMathFunctions.c
[詳解]
1 
9 #include "type.h"
10 #include "tinyMathFunction.h"
11 
12 #define INVSQRT_NEWTON_METHOD_NUM (2)
13 
26 float tInvSqrt(float x) {
27  float halfx = 0.5f * x;
28  float y = x;
29  long i = *(long*)&y;
30  i = 0x5f3759df - (i >> 1);
31  y = *(float*)&i;
32  //ニュートン法
33  for (i = 0; i < INVSQRT_NEWTON_METHOD_NUM; i++)
34  {
35  y = y * (1.5f - (halfx * y * y));
36  }
37  return y;
38 }
39 
47 float tSqrt(float x)
48 {
49 
50  float halfx = 0.5f * x;
51  float y = x;
52  float val;
53 
54  if (x == 0.0f) return 0.0f;
55 
56  //invSqrt(y)を計算
57  long i = *(long*)&y;
58  i = 0x5f3759df - (i >> 1);
59  y = *(float*)&i;
60  //ニュートン法
61  y = y * (1.5f - (halfx * y * y));
62  y = y * (1.5f - (halfx * y * y));
63  y = y * (1.5f - (halfx * y * y));
64  //sqrtを計算
65  val = x * y;
66  return val;
67 }
68 
69 
70 
79 void quickSort(int numbers[], int left, int right)
80 {
81  int pivot, l_hold, r_hold;
82 
83  l_hold = left;
84  r_hold = right;
85  pivot = numbers[left];
86  while (left < right)
87  {
88  while ((numbers[right] >= pivot) && (left < right))
89  right--;
90  if (left != right)
91  {
92  numbers[left] = numbers[right];
93  left++;
94  }
95  while ((numbers[left] <= pivot) && (left < right))
96  left++;
97  if (left != right)
98  {
99  numbers[right] = numbers[left];
100  right--;
101  }
102  }
103  numbers[left] = pivot;
104  pivot = left;
105  left = l_hold;
106  right = r_hold;
107  if (left < pivot)
108  quickSort(numbers, left, pivot-1);
109  if (right > pivot)
110  quickSort(numbers, pivot+1, right);
111 }
112 
113 
114 /******************************************************************************
115 ** End Of File
116 ******************************************************************************/
float tInvSqrt(float x)
void quickSort(int numbers[], int left, int right)
#define INVSQRT_NEWTON_METHOD_NUM
float tSqrt(float x)