RT-USB-9AXIS-00
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 
48 float tSqrt(float x)
49 {
50 
51  float halfx = 0.5f * x;
52  float y = x;
53  float val;
54 
55  if (x == 0.0f) return 0.0f;
56 
57  //invSqrt(y)を計算
58  long i = *(long*)&y;
59  i = 0x5f3759df - (i >> 1);
60  y = *(float*)&i;
61  //ニュートン法
62  y = y * (1.5f - (halfx * y * y));
63  y = y * (1.5f - (halfx * y * y));
64  y = y * (1.5f - (halfx * y * y));
65  //sqrtを計算
66  val = x * y;
67  return val;
68 }
69 
70 
71 
80 void quickSort(int numbers[], int left, int right)
81 {
82  int pivot, l_hold, r_hold;
83 
84  l_hold = left;
85  r_hold = right;
86  pivot = numbers[left];
87  while (left < right)
88  {
89  while ((numbers[right] >= pivot) && (left < right))
90  right--;
91  if (left != right)
92  {
93  numbers[left] = numbers[right];
94  left++;
95  }
96  while ((numbers[left] <= pivot) && (left < right))
97  left++;
98  if (left != right)
99  {
100  numbers[right] = numbers[left];
101  right--;
102  }
103  }
104  numbers[left] = pivot;
105  pivot = left;
106  left = l_hold;
107  right = r_hold;
108  if (left < pivot)
109  quickSort(numbers, left, pivot-1);
110  if (right > pivot)
111  quickSort(numbers, pivot+1, right);
112 }
113 
114 
115 /******************************************************************************
116 ** End Of File
117 ******************************************************************************/