1
0
Fork 0
tsgames/build/assets/lib/math.c

328 lines
8.8 KiB
C

#include <math.h>
#include <stdbool.h>
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;
}