diff --git a/Maths/EulerNumber.js b/Maths/EulerNumber.js new file mode 100644 index 0000000000..cf950b9f47 --- /dev/null +++ b/Maths/EulerNumber.js @@ -0,0 +1,25 @@ +/** + * @function eulerNumber + * @description Approximates Euler's number (e) using the formula: + * e = sum(1/n!) for n from 0 to infinity. + * This function computes e to a specified number of terms. + * @param {number} terms - Number of terms to use in approximation + * @returns {number} - Approximation of Euler's number e + * @see https://en.wikipedia.org/wiki/E_(mathematical_constant) + * @example eulerNumber(10) => 2.7182818011... + * @example eulerNumber(20) => 2.718281828459045 + */ +const eulerNumber = (terms) => { + if (!Number.isInteger(terms) || terms < 1) { + throw new TypeError('Input must be a positive integer') + } + let result = 0 + let factorial = 1 + for (let i = 0; i < terms; i++) { + if (i > 0) factorial *= i + result += 1 / factorial + } + return result +} + +export { eulerNumber } diff --git a/Maths/test/EulerNumber.test.js b/Maths/test/EulerNumber.test.js new file mode 100644 index 0000000000..be9932b6bd --- /dev/null +++ b/Maths/test/EulerNumber.test.js @@ -0,0 +1,46 @@ +import { eulerNumber } from '../EulerNumber.js' + +describe('eulerNumber', () => { + test('eulerNumber(1) returns 1', () => { + expect(eulerNumber(1)).toBe(1) + }) + + test('eulerNumber(2) returns 2', () => { + expect(eulerNumber(2)).toBe(2) + }) + + test('eulerNumber(5) approximates e', () => { + expect(eulerNumber(5)).toBeCloseTo(2.708, 2) + }) + + test('eulerNumber(10) approximates e closely', () => { + expect(eulerNumber(10)).toBeCloseTo(2.71828, 4) + }) + + test('eulerNumber(20) approximates e very closely', () => { + expect(eulerNumber(20)).toBeCloseTo(2.718281828459045, 10) + }) + + test('more terms give better approximation', () => { + const e = Math.E + expect(Math.abs(eulerNumber(20) - e)).toBeLessThan( + Math.abs(eulerNumber(5) - e) + ) + }) + + test('throws TypeError for zero', () => { + expect(() => eulerNumber(0)).toThrow(TypeError) + }) + + test('throws TypeError for negative input', () => { + expect(() => eulerNumber(-10)).toThrow(TypeError) + }) + + test('throws TypeError for float input', () => { + expect(() => eulerNumber(10.5)).toThrow(TypeError) + }) + + test('throws TypeError for string input', () => { + expect(() => eulerNumber('10')).toThrow(TypeError) + }) +})