valueOfPi.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /*
  2. Fraction.js v5.0.0 10/1/2024
  3. https://raw.org/article/rational-numbers-in-javascript/
  4. Copyright (c) 2024, Robert Eisele (https://raw.org/)
  5. Licensed under the MIT license.
  6. */
  7. var Fraction = require("fraction.js")
  8. function valueOfPi(val) {
  9. let minLen = Infinity, minI = 0, min = null;
  10. const choose = [val, val * Math.PI, val / Math.PI];
  11. for (let i = 0; i < choose.length; i++) {
  12. let el = new Fraction(choose[i]).simplify(1e-13);
  13. let len = Math.log(Number(el.n) + 1) + Math.log(Number(el.d));
  14. if (len < minLen) {
  15. minLen = len;
  16. minI = i;
  17. min = el;
  18. }
  19. }
  20. if (minI == 2) {
  21. return min.toFraction().replace(/(\d+)(\/\d+)?/, (_, p, q) =>
  22. (p == "1" ? "" : p) + "π" + (q || ""));
  23. }
  24. if (minI == 1) {
  25. return min.toFraction().replace(/(\d+)(\/\d+)?/, (_, p, q) =>
  26. p + (!q ? "/π" : "/(" + q.slice(1) + "π)"));
  27. }
  28. return min.toFraction();
  29. }
  30. console.log(valueOfPi(-3)); // -3
  31. console.log(valueOfPi(4 * Math.PI)); // 4π
  32. console.log(valueOfPi(3.14)); // 157/50
  33. console.log(valueOfPi(3 / 2 * Math.PI)); // 3π/2
  34. console.log(valueOfPi(Math.PI / 2)); // π/2
  35. console.log(valueOfPi(-1 / (2 * Math.PI))); // -1/(2π)