#include #include float sinf(float x) { static const float lookup_table[256] = { 0.0f, // 0 0.0061599463f, // 1 0.012319659f, // 2 0.018478904f, // 3 0.024637448f, // 4 0.030795058f, // 5 0.036951497f, // 6 0.043106537f, // 7 0.049259938f, // 8 0.055411477f, // 9 0.061560903f, // 10 0.067708001f, // 11 0.073852524f, // 12 0.079994254f, // 13 0.086132944f, // 14 0.092268363f, // 15 0.098400272f, // 16 0.10452846f, // 17 0.11065269f, // 18 0.1167727f, // 19 0.12288829f, // 20 0.12899922f, // 21 0.13510525f, // 22 0.14120616f, // 23 0.14730169f, // 24 0.15339166f, // 25 0.1594758f, // 26 0.16555387f, // 27 0.17162569f, // 28 0.17769097f, // 29 0.18374951f, // 30 0.1898011f, // 31 0.19584547f, // 32 0.20188241f, // 33 0.2079117f, // 34 0.21393308f, // 35 0.21994635f, // 36 0.2259513f, // 37 0.23194765f, // 38 0.2379352f, // 39 0.24391371f, // 40 0.24988301f, // 41 0.25584278f, // 42 0.26179287f, // 43 0.26773301f, // 44 0.27366298f, // 45 0.27958259f, // 46 0.28549159f, // 47 0.29138973f, // 48 0.29727685f, // 49 0.30315268f, // 50 0.309017f, // 51 0.31486961f, // 52 0.32071021f, // 53 0.32653871f, // 54 0.33235481f, // 55 0.33815828f, // 56 0.34394893f, // 57 0.3497265f, // 58 0.35549083f, // 59 0.36124167f, // 60 0.36697879f, // 61 0.372702f, // 62 0.37841105f, // 63 0.38410574f, // 64 0.38978586f, // 65 0.39545122f, // 66 0.40110153f, // 67 0.40673664f, // 68 0.41235632f, // 69 0.41796035f, // 70 0.42354852f, // 71 0.4291206f, // 72 0.43467644f, // 73 0.44021577f, // 74 0.44573835f, // 75 0.45124406f, // 76 0.45673263f, // 77 0.46220389f, // 78 0.4676576f, // 79 0.47309354f, // 80 0.47851157f, // 81 0.48391145f, // 82 0.48929292f, // 83 0.49465582f, // 84 0.5f, // 85 0.5053252f, // 86 0.5106312f, // 87 0.51591784f, // 88 0.52118486f, // 89 0.52643216f, // 90 0.53165948f, // 91 0.53686661f, // 92 0.54205334f, // 93 0.54721951f, // 94 0.55236501f, // 95 0.55748945f, // 96 0.56259274f, // 97 0.5676747f, // 98 0.57273513f, // 99 0.57777381f, // 100 0.58279061f, // 101 0.58778524f, // 102 0.59275758f, // 103 0.59770751f, // 104 0.60263467f, // 105 0.60753894f, // 106 0.6124202f, // 107 0.61727822f, // 108 0.62211281f, // 109 0.6269238f, // 110 0.63171101f, // 111 0.63647425f, // 112 0.6412133f, // 113 0.64592808f, // 114 0.65061831f, // 115 0.65528381f, // 116 0.65992457f, // 117 0.66454017f, // 118 0.66913062f, // 119 0.67369562f, // 120 0.67823511f, // 121 0.68274885f, // 122 0.68723667f, // 123 0.69169843f, // 124 0.69613391f, // 125 0.70054305f, // 126 0.70492554f, // 127 0.70928127f, // 128 0.71361017f, // 129 0.7179119f, // 130 0.72218645f, // 131 0.72643358f, // 132 0.73065311f, // 133 0.73484498f, // 134 0.7390089f, // 135 0.74314487f, // 136 0.74725252f, // 137 0.75133187f, // 138 0.75538272f, // 139 0.7594049f, // 140 0.76339829f, // 141 0.76736265f, // 142 0.77129793f, // 143 0.775204f, // 144 0.77908057f, // 145 0.78292763f, // 146 0.78674495f, // 147 0.79053241f, // 148 0.79428989f, // 149 0.7980172f, // 150 0.8017143f, // 151 0.80538094f, // 152 0.809017f, // 153 0.81262237f, // 154 0.81619692f, // 155 0.81974047f, // 156 0.82325292f, // 157 0.82673419f, // 158 0.83018404f, // 159 0.83360237f, // 160 0.8369891f, // 161 0.84034407f, // 162 0.84366715f, // 163 0.84695822f, // 164 0.8502171f, // 165 0.8534438f, // 166 0.85663807f, // 167 0.8597998f, // 168 0.86292899f, // 169 0.86602545f, // 170 0.86908895f, // 171 0.87211949f, // 172 0.875117f, // 173 0.87808126f, // 174 0.8810122f, // 175 0.8839097f, // 176 0.88677371f, // 177 0.88960397f, // 178 0.89240056f, // 179 0.8951633f, // 180 0.89789206f, // 181 0.90058666f, // 182 0.90324718f, // 183 0.90587342f, // 184 0.90846527f, // 185 0.91102266f, // 186 0.91354549f, // 187 0.91603357f, // 188 0.91848695f, // 189 0.92090553f, // 190 0.92328912f, // 191 0.92563766f, // 192 0.9279511f, // 193 0.93022931f, // 194 0.93247223f, // 195 0.93467975f, // 196 0.93685186f, // 197 0.93898833f, // 198 0.94108927f, // 199 0.94315445f, // 200 0.94518387f, // 201 0.94717735f, // 202 0.94913495f, // 203 0.95105654f, // 204 0.95294201f, // 205 0.95479131f, // 206 0.95660442f, // 207 0.95838124f, // 208 0.96012163f, // 209 0.96182567f, // 210 0.96349317f, // 211 0.96512407f, // 212 0.96671838f, // 213 0.96827602f, // 214 0.9697969f, // 215 0.97128105f, // 216 0.97272825f, // 217 0.97413862f, // 218 0.97551197f, // 219 0.9768483f, // 220 0.97814763f, // 221 0.97940975f, // 222 0.98063475f, // 223 0.98182255f, // 224 0.9829731f, // 225 0.98408633f, // 226 0.98516226f, // 227 0.98620075f, // 228 0.98720181f, // 229 0.9881655f, // 230 0.98909163f, // 231 0.98998022f, // 232 0.99083126f, // 233 0.99164468f, // 234 0.99242049f, // 235 0.99315864f, // 236 0.99385911f, // 237 0.99452192f, // 238 0.99514693f, // 239 0.99573416f, // 240 0.99628365f, // 241 0.9967953f, // 242 0.99726915f, // 243 0.99770516f, // 244 0.99810332f, // 245 0.99846363f, // 246 0.99878597f, // 247 0.99907047f, // 248 0.99931705f, // 249 0.99952573f, // 250 0.99969643f, // 251 0.99982923f, // 252 0.99992412f, // 253 0.99998105f, // 254 1.0f // 255 }; x = fmodf(x, 2.0f * (float)M_PI); if (x < 0) x += 2.0f * (float)M_PI; float reference_angle; int sign = 1; if (x <= (float)M_PI_2) { reference_angle = x; } else if (x <= (float)M_PI) { reference_angle = (float)M_PI - x; } else if (x <= 3.0f * (float)M_PI_2) { reference_angle = x - (float)M_PI; sign = -1; } else { reference_angle = 2.0f * (float)M_PI - x; sign = -1; } float position = reference_angle * (255.0f / ((float)M_PI / 2.0f)); int i = (int)position; float interpolated; if (i >= 255) { interpolated = lookup_table[255]; } else { float fractional = position - i; interpolated = lookup_table[i] + fractional * (lookup_table[i + 1] - lookup_table[i]); } return sign * interpolated; } float fmodf(float x, float y) { if (y == 0.0 || isnan(x) || isnan(y)) { return (0.0 / 0.0); } bool neg = x < 0.0; float ax = neg ? -x : x; float ay = (y < 0.0) ? -y : y; if (ax < ay) { return x; } float tmp = ay; while (tmp <= ax) { tmp *= 2.0f; } if (isinf(tmp)) { return 0; } while (tmp > ay) { tmp *= 0.5f; if (ax >= tmp) { ax -= tmp; } } return neg ? -ax : ax; }