-
Notifications
You must be signed in to change notification settings - Fork 1
/
EQUATION_LANGUAGE
228 lines (136 loc) · 4.59 KB
/
EQUATION_LANGUAGE
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
The EquationParser class can create Procedures from text string equations.
Information about the supported language follows.
Supported operators:
+ (addition)
- (subtraction)
* (multiplication)
/ (division)
% (mod)
^ (power)
Accessing input variables:
$<int>
Parsed equations are instances of Procedure<U>. Their call signature looks
like:
void call(U result, U... inputs)
Using $2 in an equation string directs the parser to substitute inputs[2]
into the calculation at the spot the $2 is defined.
Defining numbers:
Numbers are integers and decimals. They can start with an optional sign (+
or -) and are then followed by a string of digits. They can be then be
followed with an optional decimal fraction starting with a period (.).
Finally a number can also have an exponent value on the end.
Some examples:
1
+505
-4132
2.2
5.7e-3 (= 0.0057)
4.5e+5 (= 450000)
-12e2 (= -1200)
Defining complex / quaternion / octonion values:
Numbers with more then one component are captured between { } brackets
using commas.
For example:
{1,2} = 1 + 2i
{1,2,3,4} = 1 + 2i + 3j + 4k
{1,2,3,4,5,6,7,8} = 1 + 2i + 3j + 4k + 5l + 6i0 + 7j0 + 8k0
The individual components can be any valid decimal number as defined
above.
Defining vectors / matrices / tensors:
Higher dimensional numerics are specified by placing values between [ ]
markers separated by commas.
A 3 component vector of integers: [1,2,3]
A 2x2 matrix of complex values: [[{1,2},{3,4}][{5,6},{7,8}]]
Grouping terms as desired:
You can use parentheses in an equation to order the operations as you
desire.
3.0 * ($0 + $1)
Multiply the sum of input[0] and input[1] by 3.0.
Supported constants:
E
PI
GAMMA
PHI
I
J
K
L
I0
J0
K0
Supported function calls:
acos(a)
Compute the angle whose cosine is a
acosh(a)
Compute the angle whose hyperbolic cosine is a
asin(a)
Compute the angle whose sine is a
asinh(a)
Compute the angle whose hyperbolic sine is a
atan(a)
Compute the angle whose tangent is a
atanh(a)
Compute the angle whose hyperbolic tangent is a
cbrt(a)
Compute the cube root of a
cos(a)
Compute the cosine of a
cosh(a)
Compute the hyperbolic cosine of a
exp(a)
Compute E raise to the power a
log(a)
Compute the log of a
max(a,b)
Returns the greater of it's two arguments
min(a,b)
Returns the lesser of it's two arguments
rand
Returns a random value in the range of the backing type of the equation.
For instance if the backing type is 64 bit floats then it will return
a number between 0.0 and 1.0 (including 0.0 but excluding 1.0). If the
backing type is signed 4 bit integers then the random value will be
in the range -8 to 7 inclusive.
sin(a)
Compute the sine of a
sinc(a)
Returns the value sin(x) / x
sinch(a)
Returns the value sinh(x) / x
sinchpi(a)
Returns the value sinh(x * PI) / (x * PI)
sincpi(a)
Returns the value sin(x * PI) / (x * PI)
sinh(a)
Compute the hyperbolic sine of a
sqrt(a)
Compute the square root of a
tan(a)
Compute the tangent of a
tanh(a)
Compute the hyperbolic tangent of a
tmax
Returns a constant whose value is equal to the maximum for the type that
backs the equation. For instance if the algebra passed to the equation
parser was for unsigned 8 bit numbers then tmax would equal 255.
tmin
Returns a constant whose value is equal to the minimum for the type that
backs the equation. For instance if the algebra passed to the equation
parser was for signed 16 bit numbers then tmin would equal -32768.
Some examples
4 * $0 + 7
Scale input[0] by 4 and add 7
{1,2}^{3,4}
Raise complex number 1+2i to the 3+4i power
(tmin + tmax) / 2
Produce a number at the midpt of a range. 0 for signed numbers. max/2 for unsigned numbers.
(2 * sin($0)) + (3 * cos($1))
Add two times the sine of input[0] with three times the cosine of
input[1]. The inputs can be numbers or matrices.
exp( [[1,2][3,4]] )
Take the exponential of the specified 2x2 matrix. The result is a
matrix too.
PI + rand
Return a random number between PI and PI+1.0
Note that these examples are implemented here:
https://github.com/bdezonia/zorbage/blob/master/src/test/java/nom/bdezonia/zorbage/procedure/impl/parse/TestParseLanguageExamples.java