XenevaOS
Loading...
Searching...
No Matches
math.h
Go to the documentation of this file.
1
30#ifndef __MATH_H__
31#define __MATH_H__
32
33#include <_xeneva.h>
34#include <stdint.h>
35#include <string.h>
36
37#ifdef __cplusplus
39#endif
40
41
42#define M_E 2.7182818284590452354 // e
43#define M_LOG2E 1.4426950408889634074 // log_2 e
44#define M_LOG10E 0.43429448190325182765 // log_10 e
45#define M_LN2 0.69314718055994530942 // log_e 2
46#define M_LN10 2.30258509299404568402 // log_e 10
47#define M_PI 3.14159265358979323846 // pi
48#define M_PI_2 1.57079632679489661923 // pi/2
49#define M_PI_4 0.78539816339744830962 // pi/4
50#define M_1_PI 0.31830988618379067154 // 1/pi
51#define M_2_PI 0.63661977236758134308 // 2/pi
52#define M_2_SQRTPI 1.12837916709551257390 // 2/sqrt(pi)
53#define M_SQRT2 1.41421356237309504880 // sqrt(2)
54#define M_SQRT1_2 0.70710678118654752440 // 1/sqrt(2)
55
56typedef union {
57 float f;
60
61typedef union {
62 double d;
65
66//#define asuint(f) ((union{float _f; uint32_t _i;}){f})._i
67static INLINE uint32_t asuint(float f) {
69 memset(&u, 0, sizeof(float_bits_t));
70 u.f = f;
71 return u.i;
72}
73
74static INLINE float asfloat(uint32_t u) {
75 float_bits_t fb;
76 memset(&fb, 0, sizeof(float_bits_t));
77 fb.i = u;
78 return fb.f;
79}
80
81static INLINE uint64_t asuint64(double d) {
83 memset(&db, 0, sizeof(double_bits_t));
84 db.d = d;
85 return db.i;
86}
87
88static INLINE double asdouble(uint64_t u) {
90 memset(&db, 0, sizeof(double_bits_t));
91 db.i = u;
92 return db.d;
93}
94
95
96#define EXTRACT_WORDS(hi,lo,d) \
97do { \
98 uint64_t __u = asuint64(d); \
99 (hi) = __u >> 32; \
100 (lo) = (uint32_t)__u; \
101} while (0)
102
103#define GET_HIGH_WORD(hi,d) \
104do { \
105 (hi) = asuint64(d) >> 32; \
106} while (0)
107
108#define GET_LOW_WORD(lo,d) \
109do { \
110 (lo) = (uint32_t)asuint64(d); \
111} while (0)
112
113#define INSERT_WORDS(d,hi,lo) \
114do { \
115 (d) = asdouble(((uint64_t)(hi)<<32) | (uint32_t)(lo)); \
116} while (0)
117
118#define SET_HIGH_WORD(d,hi) \
119 INSERT_WORDS(d, hi, (uint32_t)asuint64(d))
120
121#define SET_LOW_WORD(d,lo) \
122 INSERT_WORDS(d, asuint64(d)>>32, lo)
123
124#define GET_FLOAT_WORD(w,d) \
125do { \
126 (w) = asuint(d); \
127} while (0)
128
129#define SET_FLOAT_WORD(d,w) \
130do { \
131 (d) = asfloat(w); \
132} while (0)
133
134enum {
141
142
143static INLINE void fp_force_evalf(float x) {
144 volatile float y;
145 y = x;
146}
147
148static INLINE void fp_force_eval(double x) {
149 volatile double y;
150 y = x;
151}
152
153static INLINE void fp_force_evall(long double x) {
154 volatile long double y;
155 y = x;
156}
157XE_LIB int fpclassify(double x);
158
159#define isfinite(x) ((fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE))
160#define isnormal(x) (fpclassify(x) == FP_NORMAL)
161#define isnan(x) (fpclassify(x) == FP_NAN)
162#define isinf(x) (fpclassify(x) == FP_INFINITE)
163
164#define FORCE_EVAL(x) do { \
165 if (sizeof(x) == sizeof(float)){ \
166 _KePrint("Evaluating float \r\n"); \
167 fp_force_evalf(x); \
168 }else if (sizeof(x) == sizeof(double)) { \
169 _KePrint("FORCE EVAL double \r\n"); \
170 fp_force_eval(x); \
171 } else { \
172 _KePrint("Force eval long \r\n"); \
173 fp_force_evall(x); \
174 } \
175}while(0)
176
177 XE_LIB double ceil(double);
178 XE_LIB float ceilf(float x);
179 XE_LIB double cos(double);
180 XE_LIB float acosf(float x);
181 XE_LIB float cosf(float);
182 XE_LIB double fabs(double);
183 XE_LIB float fabsf(float);
184 XE_LIB double floor(double);
185 XE_LIB float floorf(float);
186 XE_LIB double fmod(double, double);
187 XE_LIB double modf(double, double *);
188 XE_LIB float fmodf(float x, float y);
189 XE_LIB double pow(double, double);
190 XE_LIB double sin(double);
191 XE_LIB float sinf(float);
192 XE_LIB double sqrt(double);
193 XE_LIB float sqrtf(float x);
194 XE_LIB double tan(double);
195 XE_LIB float tanf(float);
196 XE_LIB float atanf(float x);
197 XE_LIB float atan2f(float y, float x);
198 XE_LIB double frexp(double x, int *exp);
199 XE_LIB float roundf(float x);
200
201#ifdef __cplusplus
202}
203#endif
204
205#endif
#define INLINE
Definition _xeneva.h:63
#define XE_LIB
Definition _xeneva.h:55
#define XE_EXTERN
Definition _xeneva.h:50
void * memset(void *Dest, int Value, ACPI_SIZE Count)
Definition utclib.c:346
unsigned int uint32_t
Definition acefiex.h:163
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
float exp(float x)
Definition audioCtrl.cpp:53
XE_LIB double frexp(double x, int *exp)
Definition math.cpp:308
XE_LIB double pow(double, double)
Definition math.cpp:173
XE_LIB double sqrt(double)
Definition math.cpp:276
XE_LIB double tan(double)
Definition math.cpp:295
XE_LIB double floor(double)
Definition math.cpp:134
@ FP_INFINITE
Definition math.h:136
@ FP_SUBNORMAL
Definition math.h:138
@ FP_NORMAL
Definition math.h:139
@ FP_ZERO
Definition math.h:137
@ FP_NAN
Definition math.h:135
XE_LIB double fabs(double)
Definition math.cpp:120
XE_LIB double cos(double)
Definition math.cpp:52
XE_LIB int fpclassify(double x)
Definition math.cpp:331
XE_LIB float fabsf(float)
Definition math.cpp:127
XE_LIB double fmod(double, double)
Definition math.cpp:145
XE_LIB float atan2f(float y, float x)
Definition atan2f.cpp:36
XE_LIB float floorf(float)
Definition math.cpp:139
XE_LIB double sin(double)
Definition math.cpp:194
XE_LIB double modf(double, double *)
Definition math.cpp:160
XE_LIB float atanf(float x)
Definition atanf.cpp:25
XE_LIB float sqrtf(float x)
Definition math.cpp:304
XE_LIB float tanf(float)
Definition math.cpp:299
XE_LIB double ceil(double)
Definition math.cpp:42
XE_LIB float roundf(float x)
Definition roundf.cpp:16
XE_LIB float fmodf(float x, float y)
Definition fmodf.cpp:7
XE_LIB float sinf(float)
Definition math.cpp:227
XE_LIB float ceilf(float x)
Definition ceilf.cpp:3
XE_LIB float cosf(float)
Definition math.cpp:85
XE_LIB float acosf(float x)
Definition acosf.cpp:50
int x
Definition term.cpp:49
Definition math.h:61
double d
Definition math.h:62
uint64_t i
Definition math.h:63
Definition math.h:56
uint32_t i
Definition math.h:58
float f
Definition math.h:57