1// SASSY MATH
2
3@charset "UTF-8";
4
5//////////////////////////////
6// Variables
7//////////////////////////////
8$pi: 3.1415926535897932384626433832795028841971693993751;
9$π: $pi;
10$e: 2.71828182845904523536028747135266249775724709369995;
11
12$iter: 50;
13
14//////////////////////////////
15// Random Number
16//   Working from http://xkcd.com/221/
17//    Chosen by fair dice roll.
18//    Guarenteed to be random.
19//////////////////////////////
20@function rand() {
21  @return 4;
22}
23
24//////////////////////////////
25// Percent
26//////////////////////////////
27@function percent($number) {
28  @return $number * 0.01;
29}
30
31//////////////////////////////
32// Exponent
33//////////////////////////////
34@function exponent($base, $exponent) {
35  // reset value
36  $value: $base;
37  // positive intergers get multiplied
38  @if $exponent > 1 {
39    @for $i from 2 through $exponent {
40      $value: $value * $base; } }
41  // negitive intergers get divided. A number divided by itself is 1
42  @if $exponent < 1 {
43    @for $i from 0 through -$exponent {
44      $value: $value / $base; } }
45  // return the last value written
46  @return $value;
47}
48
49@function pow($base, $exponent) {
50  @return exponent($base, $exponent);
51}
52
53//////////////////////////////
54// Factorial
55//////////////////////////////
56@function factorial($number) {
57  // reset value
58  $value: 1;
59  // positive intergers get multiplied
60  @if $number > 0 {
61    @for $i from 1 through $number {
62      $value: $value * $i;
63    }
64  }
65  @return $value;
66}
67
68@function fact($number) {
69  @return factorial($number);
70}
71
72
73//////////////////////////////
74// Polynomial Approximation
75//////////////////////////////
76// Maclaurin series can be used to estimate Sine and Consine
77@function maclaurin($start, $key, $number) {
78  $value: $start;
79  $add: 0;
80
81  @for $i from 1 through $iter {
82    @if $add == 0 {
83      $value: $value - ( exponent($number, $key) / factorial($key) );
84      $add: 1;
85    }
86    @else {
87      $value: $value + ( exponent($number, $key) / factorial($key) );
88      $add: 0;
89    }
90
91    $key: $key + 2;
92  }
93
94  @return $value;
95}
96// Taylor series can be used to estiamte ln
97@function taylor($number) {
98  @return taylor;
99}
100
101//////////////////////////////
102// Basic Trig Functions
103//////////////////////////////
104// Bundled in Compass: http://compass-style.org/reference/compass/helpers/trig/
105// References for implementing using MacLaurin series below:
106
107//@function sin($number, $unit: 'deg') {
108//  @if $unit == 'deg' {
109//    $number: deg-to-rad($number);
110//  }
111//  @return maclaurin($number, 3, $number);
112//}
113//
114//@function cos($number, $unit: 'deg') {
115//  @if $unit == 'deg' {
116//    $number: deg-to-rad($number);
117//  }
118//  @return maclaurin(1, 2, $number);
119//}
120//
121//// Trig Identity: Tangent = Sine divided by Cosine.
122//@function tan($number, $unit: 'deg') {
123//  @if $unit == 'deg' {
124//    $number: deg-to-rad($number);
125//  }
126//  @return sin($number) / cos($number);
127//}
128
129//////////////////////////////
130// Reciprocal Trig Functions
131//////////////////////////////
132@function csc($number, $unit: 'deg') {
133  @if $unit == 'deg' {
134    $number: deg-to-rad($number);
135  }
136  @return 1 / sin($number);
137}
138
139@function scs($number, $unit: 'deg') {
140  @if $unit == 'deg' {
141    $number: deg-to-rad($number);
142  }
143  @return 1 / cos($number);
144}
145
146@function cot($number, $unit: 'deg') {
147  @if $unit == 'deg' {
148    $number: deg-to-rad($number);
149  }
150  @return 1 / tan($number);
151}
152
153//////////////////////////////
154// Hyperbolic Functions
155//////////////////////////////
156@function sinh($number) {
157  $top: exponent($e, (2 * $number)) - 1;
158  $bottom: 2 * exponent($e, $number);
159  @return  $top / $bottom;
160}
161
162@function cosh($number) {
163  $top: exponent($e, (2 * $number)) + 1;
164  $bottom: 2 * exponent($e, $number);
165  @return  $top / $bottom;
166}
167
168@function tanh($number) {
169  $top: exponent($e, (2 * $number)) - 1;
170  $bottom: exponent($e, (2 * $number)) + 1;
171  @return  $top / $bottom;
172}
173
174//////////////////////////////
175// Reciprocal Hyperbolic Functions
176//////////////////////////////
177@function csch($number) {
178  @return 1 / sinh($number);
179}
180
181@function sech($number) {
182  @return 1 / cosh($number);
183}
184
185@function coth($number) {
186  @return 1/ tanh($number);
187}
188
189
190@function log($number) {
191  @return $number;
192}
193
194@function ln($number) {
195  @if $number > 0 and $number < 1 {
196    $value: 0;
197    @for $i from 1 through $iter {
198      $value: $value + ( pow(-1, $i) * pow(-1 * (1 - $number), $i)) / $i;
199    }
200    $value: -1 * $value;
201
202    @return $value;
203  }
204  @else if $number == 1 {
205    @return 0;
206  }
207  @else {
208    @return ERROR;
209    @warn ln input must be greater than zero and less than or equal to 1;
210  }
211}
212
213
214//////////////////////////////
215// Degree/Radian Conversion
216//////////////////////////////
217@function deg-to-rad($number) {
218  @return $number * $pi / 180deg;
219}
220
221@function rad-to-deg($number) {
222  @return $number * 180deg / $pi;
223}
224
225//////////////////////////////
226// Root Functions
227//////////////////////////////
228// Basic General-Purpose Root Function
229@function n-root($number, $n) {
230  @if $number < 1 {
231    @return ERROR;
232    @warn ROOT ERROR;
233  }
234  // If a whole number, generate it quickly
235  @for $i from 1 through $number {
236    @if exponent($i, $n) == $number {
237      @return $i;
238    }
239  }
240  // Else, run through other options
241  @for $i from 1 through $number * 1000 / 2 {
242    @if round(exponent($i / 1000, $n) * 100) == round($number * 100) {
243      @return $i / 1000;
244    }
245  }
246}
247
248@function root($number, $n) {
249  @return n-root($number, $n);
250}
251
252// Square Roots
253@function √($number) {
254  @return sqrt($number);
255}
256
257@function sqrt($number) {
258  $guess: rand();
259  $root: $guess;
260  @for $i from 1 through $iter {
261    $root: $root - (pow($root, 2) - $number) / (2 * $root);
262  }
263  @return $root;
264}
265
266//////////////////////////////
267// Golden Ratio
268//////////////////////////////
269@function golden() {
270  @return 1/2 + sqrt(5) / 2;
271}
272@function ϕ() {
273  @return golden();
274}
275
276$golden-ratio: golden();
277$ϕ: $golden-ratio;
278
279//////////////////////////////
280// Is Int and Is Float
281//////////////////////////////
282@function is-int($number) {
283  @if type-of($number) != 'number' {
284    @warn '#{$number} is not a number! It cannot be an integer if it is not a number!';
285    @return false;
286  }
287  @if $number - floor($number) != 0 {
288    @return false;
289  }
290  @else {
291    @return true;
292  }
293}
294
295@function is-float($number) {
296  @if type-of($number) != 'number' {
297    @warn '#{$number} is not a number! It cannot be an decimal if it is not a number!';
298    @return false;
299  }
300  @if $number - floor($number) != 0 {
301    @return true;
302  }
303  @else {
304    @return false;
305  }
306}
307
308@function is-decimal($number) {
309  @return is-float($number);
310}