diff --git a/Maths/PerfectCube.js b/Maths/PerfectCube.js index bbfc821e2a..67e119305f 100644 --- a/Maths/PerfectCube.js +++ b/Maths/PerfectCube.js @@ -2,8 +2,9 @@ * Author: dephraiim * License: GPL-3.0 or later * + * This uses `round` instead of `floor` or `trunc`, to guard against potential `cbrt` accuracy errors */ -const perfectCube = (num) => Math.round(num ** (1 / 3)) ** 3 === num +const perfectCube = (num) => Number.isFinite(num) && Math.round(Math.cbrt(num)) ** 3 === num export { perfectCube } diff --git a/Maths/PerfectSquare.js b/Maths/PerfectSquare.js index d4909dbd4f..9003ec1416 100644 --- a/Maths/PerfectSquare.js +++ b/Maths/PerfectSquare.js @@ -2,8 +2,9 @@ * Author: dephraiim * License: GPL-3.0 or later * + * This uses `round` instead of `floor` or `trunc`, to guard against potential `sqrt` accuracy errors */ -const perfectSquare = (num) => Math.sqrt(num) ** 2 === num +const perfectSquare = (num) => Number.isFinite(num) && Math.round(Math.sqrt(num)) ** 2 === num export { perfectSquare } diff --git a/Maths/test/PerfectCube.test.js b/Maths/test/PerfectCube.test.js index ff4b74f8f8..f3c4f219e6 100644 --- a/Maths/test/PerfectCube.test.js +++ b/Maths/test/PerfectCube.test.js @@ -3,8 +3,10 @@ import { perfectCube } from '../PerfectCube' describe('PerfectCube', () => { it('should return true for a perfect cube', () => { expect(perfectCube(125)).toBeTruthy() + expect(perfectCube(-125)).toBeTruthy() }) it('should return false for a non perfect cube', () => { expect(perfectCube(100)).toBeFalsy() + expect(perfectCube(Infinity)).toBeFalsy() }) }) diff --git a/Maths/test/PerfectSquare.test.js b/Maths/test/PerfectSquare.test.js index 86c8c34033..37fce248d4 100644 --- a/Maths/test/PerfectSquare.test.js +++ b/Maths/test/PerfectSquare.test.js @@ -1,10 +1,11 @@ import { perfectSquare } from '../PerfectSquare' describe('PerfectSquare', () => { - it('should return true for a perfect cube', () => { + it('should return true for a perfect square', () => { expect(perfectSquare(16)).toBeTruthy() }) - it('should return false for a non perfect cube', () => { + it('should return false for a non perfect square', () => { expect(perfectSquare(10)).toBeFalsy() + expect(perfectSquare(Infinity)).toBeFalsy() }) })