-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathfixed_math.h
145 lines (120 loc) · 4.67 KB
/
fixed_math.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#pragma once
#include <stddef.h>
#define FIXED_FRACTION 32
#ifdef FIXED_VALUE_TYPE
typedef FIXED_VALUE_TYPE fixed_point;
#else
typedef long long fixed_point;
#endif
#ifdef __cpp_constexpr
#define CONSTEXPR static constexpr
#else
#define CONSTEXPR static inline
#endif
#ifdef _MSC_VER
#define DEPRECATED(msg) __declspec(deprecated(msg))
#else
#define DEPRECATED(msg) __attribute__((deprecated(msg)))
#endif
#define fixed_integer_mask (fixed_point)0xFFFFFFFF00000000
#define fixed_fractional_mask (fixed_point)0x00000000FFFFFFFF
#define fixed_one (fixed_point)0x0000000100000000
#define fixed_two (fixed_point)0x0000000200000000
#define fixed_half (fixed_point)0x0000000080000000
#define fixed_max (fixed_point)0x7FFFFFFFFFFFFFFD
#define fixed_inf (fixed_point)0x7FFFFFFFFFFFFFFF
#define fixed_nan (fixed_point)0xFFFFFFFFFFFFFFFE
#define fixed_pi (fixed_point)0x00000003243F6A88 /* 3.14159265 */
#define fixed_half_pi (fixed_point)0x00000001921FB544 /* 1.57079633 */
#define fixed_e (fixed_point)0x00000002B7E15162 /* 2.71828183 */
#define fixed_log_two (fixed_point)0x00000000B1721886 /* 0.69314718 */
#define fixed_epsilon (fixed_point)0x00000000000010C6 /* 0.00000100 */
#ifdef __cplusplus
extern "C"
{
#endif
fixed_point fixed_sign(fixed_point value);
int fixed_isinf(fixed_point value);
int fixed_isnan(fixed_point value);
fixed_point fixed_add(fixed_point value_a, fixed_point value_b);
fixed_point fixed_sub(fixed_point value_a, fixed_point value_b);
fixed_point fixed_mul(fixed_point value_a, fixed_point value_b);
fixed_point fixed_div(fixed_point value_a, fixed_point value_b);
fixed_point fixed_frac(fixed_point value);
fixed_point fixed_floor(fixed_point value);
fixed_point fixed_ceil(fixed_point value);
fixed_point fixed_round(fixed_point value);
fixed_point fixed_abs(fixed_point value);
fixed_point fixed_idiv(fixed_point value_a, fixed_point value_b);
fixed_point fixed_mod(fixed_point value_a, fixed_point value_b);
fixed_point fixed_unm(fixed_point value);
fixed_point fixed_pow(fixed_point value_a, fixed_point value_b);
fixed_point fixed_sqrt(fixed_point value);
fixed_point fixed_exp(fixed_point value);
fixed_point fixed_log(fixed_point value);
fixed_point fixed_sin(fixed_point value);
fixed_point fixed_cos(fixed_point value);
fixed_point fixed_tan(fixed_point value);
fixed_point fixed_asin(fixed_point value);
fixed_point fixed_acos(fixed_point value);
fixed_point fixed_atan(fixed_point value);
fixed_point fixed_atan2(fixed_point value_a, fixed_point value_b);
fixed_point fixed_rad(fixed_point value);
fixed_point fixed_deg(fixed_point value);
DEPRECATED("Float may bring uncertain value on different platforms. Please avoid using this to calculate critical values")
CONSTEXPR fixed_point fixed_dtox(float value)
{
fixed_point ival = (fixed_point)value;
float fval = value - ival;
return (ival << FIXED_FRACTION) + (fixed_point)(fval * (1ll << FIXED_FRACTION));
}
CONSTEXPR fixed_point fixed_itox(int value)
{
return (fixed_point)value << FIXED_FRACTION;
}
CONSTEXPR fixed_point fixed_natox(const char* s, size_t len)
{
fixed_point result = 0;
fixed_point ival = 0;
fixed_point fval = 0;
fixed_point exp = 1;
int neg = 0;
const char* e = len == 0 ? 0 : s + len;
while ((e == 0 || s <= e) && (*s == ' ' || *s == '\t')) s++; /* skip initial spaces */
if (*s == '-')
{
s++;
neg = 1;
}
for (; (e == 0 || s <= e) && (*s >= '0' && *s <= '9'); s++) {
int d = *s - '0';
ival = ival * 10 + d;
}
if (*s == '.')
{
s++;
for (; (e == 0 || s <= e) && (*s >= '0' && *s <= '9'); s++) {
int d = *s - '0';
fval = fval * 10 + d;
exp = exp * 10;
}
}
result = (ival << FIXED_FRACTION) + (fval << FIXED_FRACTION) / exp;
if (neg) result = -result;
return result;
}
CONSTEXPR fixed_point fixed_atox(const char* s)
{
return fixed_natox(s, 0);
}
CONSTEXPR int fixed_xtoi(fixed_point value)
{
return value >> FIXED_FRACTION;
}
CONSTEXPR double fixed_xtod(fixed_point value)
{
return (double)value / fixed_one;
}
#ifdef __cplusplus
}
#endif