summaryrefslogtreecommitdiff
path: root/src/libultra_code_O2/cosf.c
diff options
context:
space:
mode:
authorRandom <28494085+Random06457@users.noreply.github.com>2020-10-03 17:22:44 +0200
committerGitHub <noreply@github.com>2020-10-03 11:22:44 -0400
commit174af7384d1cfcbf15da02d9069bf02bdc433c20 (patch)
treee4fb18346f71047c123ec4d34a80ae7e4d8ab9ea /src/libultra_code_O2/cosf.c
parent6136ee6debd570a63fc695a6f4664553303f2324 (diff)
libultra cleanup (#215)
* cleanup libultra * fixes - use quotes instead of <> for includes - add macros for zelda specific thread priorities - fix Makefile - properly format the remaining pfs structs * fix button macros + add CHECK_BTN_ANY/CHECK_BTN_ALL * remove ULTRA_ABS * fix includes * update z_player.c/z_lib.c + run format.sh * merge upstream/master * fix include in En_Goroiwa * fix includes
Diffstat (limited to 'src/libultra_code_O2/cosf.c')
-rw-r--r--src/libultra_code_O2/cosf.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libultra_code_O2/cosf.c b/src/libultra_code_O2/cosf.c
new file mode 100644
index 000000000..56ef995c7
--- /dev/null
+++ b/src/libultra_code_O2/cosf.c
@@ -0,0 +1,64 @@
+#include "ultra64.h"
+#include "global.h"
+
+static const du P[] = {
+ { 0x3FF00000, 0x00000000 }, { 0xBFC55554, 0xBC83656D }, { 0x3F8110ED, 0x3804C2A0 },
+ { 0xBF29f6FF, 0xEEA56814 }, { 0x3EC5DBDF, 0x0E314BFE },
+};
+
+static const du rpi = { 0x3FD45F30, 0x6DC9C883 };
+
+static const du pihi = { 0x400921FB, 0x50000000 };
+
+static const du pilo = { 0x3E6110B4, 0x611A6263 };
+
+static const fu zero = { 0x00000000 };
+
+f32 cosf(f32 x) {
+ f32 absx;
+ f64 dx;
+ f64 xSq;
+ f64 polyApprox;
+ f64 dn;
+ s32 n;
+ f64 result;
+ s32 ix, xpt;
+
+ ix = *(s32*)&x;
+ xpt = (ix >> 22);
+ xpt &= 0x1FF;
+
+ if (xpt < 0x136) {
+
+ absx = (x > 0) ? x : -x;
+
+ dx = absx;
+
+ dn = dx * rpi.d + 0.5;
+ n = ROUND(dn);
+ dn = n;
+
+ dn -= 0.5;
+
+ dx -= dn * pihi.d;
+ dx -= dn * pilo.d;
+
+ xSq = SQ(dx);
+
+ polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d;
+
+ result = dx + (dx * xSq) * polyApprox;
+
+ if (!(n & 1)) {
+ return (f32)result;
+ }
+
+ return -(f32)result;
+ }
+
+ if (x != x) {
+ return __libm_qnan_f;
+ }
+
+ return zero.f;
+}