-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexpr-math.h
More file actions
144 lines (137 loc) · 4.2 KB
/
Copy pathexpr-math.h
File metadata and controls
144 lines (137 loc) · 4.2 KB
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
#ifndef EXPR_MATH_H
#define EXPR_MATH_H 1
#ifndef M_E
#define M_E 2.7182818284590452354 /* e */
#endif
#ifndef M_EULER
#define M_EULER 0.5772156649015328606 /* Euler-Mascheroni */
#endif
#ifndef M_GAMMA
#define M_GAMMA 0.5772156649015328606 /* Euler-Mascheroni */
#endif
#ifndef M_GOLDEN
#define M_GOLDEN 1.6180339887498948482 /* golden ratio */
#endif
#ifndef M_IGOLDEN
#define M_IGOLDEN 0.6180339887498948482 /* inverse golden ratio */
#endif
#ifndef M_LOG2E
#define M_LOG2E 1.4426950408889634074 /* log_2(e) */
#endif
#ifndef M_LOG10E
#define M_LOG10E 0.43429448190325182765 /* log_10(e) */
#endif
#ifndef M_LN2
#define M_LN2 0.69314718055994530942 /* log_e(2) */
#endif
#ifndef M_LN10
#define M_LN10 2.30258509299404568402 /* log_e(10) */
#endif
#ifndef M_MAGIC
#define M_MAGIC 0.95531661812450927816 /* magic angle */
#endif
#ifndef M_PHI
#define M_PHI 1.6180339887498948482 /* golden ratio */
#endif
#ifndef M_PI
#define M_PI 3.14159265358979323846 /* tau / 2 */
#endif
#ifndef M_1_PI
#define M_1_PI 0.31830988618379067154 /* 1/pi */
#endif
#ifndef M_2_PI
#define M_2_PI 0.63661977236758134308 /* 2/pi */
#endif
#ifndef M_PI1_4
#define M_PI1_4 0.78539816339744830962 /* pi/4 */
#endif
#ifndef M_PI1_2
#define M_PI1_2 1.57079632679489661923 /* pi/2 */
#endif
#ifndef M_PI3_4
#define M_PI3_4 2.35619449019234492884 /* 3 * pi/4 */
#endif
#ifndef M_PLASTIC
#define M_PLASTIC 1.32471795724474602596 /* x ** 3 = x + 1 */
#endif
#ifndef M_SILVER
#define M_SILVER 2.4142135623730950488 /* silver ratio */
#endif
#ifndef M_2_SQRTPI
#define M_2_SQRTPI 1.12837916709551257390 /* 2/sqrt(pi) */
#endif
#ifndef M_SQRT2
#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */
#endif
#ifndef M_SQRT1_2
#define M_SQRT1_2 0.70710678118654752440 /* 1/sqrt(2) */
#endif
#ifndef M_SQRT3
#define M_SQRT3 1.73205080756887729352 /* sqrt(3) */
#endif
#ifndef M_TAU
#define M_TAU 6.28318530717958647693 /* better than pi */
#endif
#ifndef M_RAD_TO_DEG
#define M_RAD_TO_DEG 57.2957795130823208768 /* 180/pi, 360/tau */
#endif
#ifndef M_DEG_TO_RAD
#define M_DEG_TO_RAD 0.01745329251994329577 /* pi/180, tau/360 */
#endif
/** Calculate the first root of the quadratic formula.
*
* @param a The quadratic coefficient.
* @param b The linear coefficient.
* @param c The free term.
* @return The positive root.
*/
extern double quadratic(double a, double b, double c);
/** Calculate the second root of the quadratic formula.
*
* @param a The quadratic coefficient.
* @param b The linear coefficient.
* @param c The free term.
* @return The negative root.
*/
extern double nquadratic(double a, double b, double c);
/** Produce the y value for a triangular wave.
*
* @li Domain: (-Infinity, Infinity)
* @li Co-domain: [0,1]
* @li Period: 1
* @li Specific values:
* 0.0 -> 0
* 0.5 -> 1
* 1.0 -> 0
*
* @param x The x coordinate.
* @return The y coordinate.
*/
extern double trianglewave(double x);
/** Test for approximate equality.
*
* Test (min / max) for closeness to 1 (i.e., what fraction of
* 'max' is 'min'?). And since (min / max >= cutoff) is equivalent
* to (min >= cutoff * max), we can avoid division. (I'm reminded
* of a young linear interpolation...)
*
* The best way to craft the cutoff constant is to subtract epsilon
* from 1.0, with epsilon defined in terms of the smallest value
* with exponent 0 (i.e., the ULP of 1.0). Here, we fake it.
*
* @note .99999... approaches 1. Thou shall not Proliferate thy Nines
* lest thou incur the Confusion of the Internal strtod() of the Dread
* Compiler (Blessed be Her Grammar).
*
* @note The approximation threshold scales. As the values approach
* zero, so does the threshold. In other words, a positive can never
* approximately equal a negative.
*
* @note This has not been thoroughly tested. Approximate function
* is approximate.
*
* @param a,b The values to compare for approximate equality.
* @return Non-zero if approximately equal, zero if not.
*/
extern int approx(double a, double b);
#endif /* EXPR_MATH_H */