approx.js 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. const Fraction = require('fraction.js');
  8. // Another rational approximation, not using Farey Sequences but Binary Search using the mediant
  9. function approximate(p, precision) {
  10. var num1 = Math.floor(p);
  11. var den1 = 1;
  12. var num2 = num1 + 1;
  13. var den2 = 1;
  14. if (p !== num1) {
  15. while (den1 <= precision && den2 <= precision) {
  16. var m = (num1 + num2) / (den1 + den2);
  17. if (p === m) {
  18. if (den1 + den2 <= precision) {
  19. den1 += den2;
  20. num1 += num2;
  21. den2 = precision + 1;
  22. } else if (den1 > den2) {
  23. den2 = precision + 1;
  24. } else {
  25. den1 = precision + 1;
  26. }
  27. break;
  28. } else if (p < m) {
  29. num2 += num1;
  30. den2 += den1;
  31. } else {
  32. num1 += num2;
  33. den1 += den2;
  34. }
  35. }
  36. }
  37. if (den1 > precision) {
  38. den1 = den2;
  39. num1 = num2;
  40. }
  41. return new Fraction(num1, den1);
  42. }