3 files+67−10/3 viewed
| 1 | 1 | # automation lab | |
| 2 | + | ||
| 3 | + | ## Functions | |
| 4 | + | ||
| 5 | + | All functions are exported from `math.js`. | |
| 6 | + | ||
| 7 | + | ```js | |
| 8 | + | const { add, multiply, power, mean, median, standard_deviation } = require("./math"); | |
| 9 | + | ``` | |
| 10 | + | ||
| 11 | + | - `add(a, b)`: returns the sum of `a` and `b`. | |
| 12 | + | ```js | |
| 13 | + | add(2, 3); // 5 | |
| 14 | + | ``` | |
| 15 | + | - `multiply(a, b)`: returns the product of `a` and `b`. | |
| 16 | + | ```js | |
| 17 | + | multiply(4, 5); // 20 | |
| 18 | + | ``` | |
| 19 | + | - `power(base, exponent)`: returns `base` raised to a whole-number `exponent`; throws a `RangeError` if `exponent` is negative. | |
| 20 | + | ```js | |
| 21 | + | power(2, 3); // 8 | |
| 22 | + | ``` | |
| 23 | + | - `mean(numbers)`: returns the average of an array of numbers; throws a `TypeError` if the array is empty. | |
| 24 | + | ```js | |
| 25 | + | mean([1, 2, 3, 4]); // 2.5 | |
| 26 | + | ``` | |
| 27 | + | - `median(numbers)`: returns the middle value (the average of the two middle values when the length is even); throws a `TypeError` if the array is empty. | |
| 28 | + | ```js | |
| 29 | + | median([3, 1, 2]); // 2 | |
| 30 | + | median([1, 2, 3, 4]); // 2.5 | |
| 31 | + | ``` | |
| 32 | + | - `standard_deviation(numbers)`: returns the population standard deviation; throws a `TypeError` if the array is empty. | |
| 33 | + | ```js | |
| 34 | + | standard_deviation([2, 4, 4, 4, 5, 5, 7, 9]); // 2 | |
| 35 | + | ``` |
| 29 | 29 | return result; | |
| 30 | 30 | } | |
| 31 | 31 | ||
| 32 | − | module.exports = { add, multiply, divide, power }; | |
| 32 | + | /** Returns the average of numbers; throws a TypeError if the array is empty. */ | |
| 33 | + | function mean(numbers) { | |
| 34 | + | if (numbers.length === 0) { | |
| 35 | + | throw new TypeError("numbers must not be empty"); | |
| 36 | + | } | |
| 37 | + | return numbers.reduce((sum, n) => sum + n, 0) / numbers.length; | |
| 38 | + | } | |
| 39 | + | ||
| 40 | + | /** Returns the middle value of numbers (the average of the two middle values when the length is even); throws a TypeError if the array is empty. */ | |
| 41 | + | function median(numbers) { | |
| 42 | + | if (numbers.length === 0) { | |
| 43 | + | throw new TypeError("numbers must not be empty"); | |
| 44 | + | } | |
| 45 | + | const sorted = [...numbers].sort((a, b) => a - b); | |
| 46 | + | const mid = Math.floor(sorted.length / 2); | |
| 47 | + | return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid]; | |
| 48 | + | } | |
| 49 | + | ||
| 50 | + | /** Returns the population standard deviation of numbers; throws a TypeError if the array is empty. */ | |
| 51 | + | function standard_deviation(numbers) { | |
| 52 | + | const avg = mean(numbers); | |
| 53 | + | const variance = numbers.reduce((sum, n) => sum + (n - avg) ** 2, 0) / numbers.length; | |
| 54 | + | return Math.sqrt(variance); | |
| 55 | + | } | |
| 56 | + | ||
| 57 | + | module.exports = { add, multiply, divide, power, mean, median, standard_deviation }; |
| 8 | 8 | assert.strictEqual(math.power(2, 10), 1024); | |
| 9 | 9 | assert.strictEqual(math.power(5, 0), 1); | |
| 10 | 10 | assert.throws(() => math.power(2, -1), RangeError); | |
| 11 | + | assert.strictEqual(math.mean([1, 2, 3, 4]), 2.5); | |
| 12 | + | assert.strictEqual(math.median([3, 1, 2]), 2); | |
| 13 | + | assert.strictEqual(math.median([4, 1, 3, 2]), 2.5); | |
| 14 | + | assert.strictEqual(math.standard_deviation([2, 4, 4, 4, 5, 5, 7, 9]), 2); | |
| 15 | + | for (const fn of [math.mean, math.median, math.standard_deviation]) { | |
| 16 | + | assert.throws(() => fn([]), TypeError); | |
| 17 | + | } | |
| 11 | 18 | console.log("all tests passed"); |