math.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /**
  2. * DevExtreme (core/utils/math.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var isExponential = require("./type").isExponential;
  11. var sign = function(value) {
  12. if (0 === value) {
  13. return 0
  14. }
  15. return value / Math.abs(value)
  16. };
  17. var fitIntoRange = function(value, minValue, maxValue) {
  18. var isMinValueUndefined = !minValue && 0 !== minValue;
  19. var isMaxValueUndefined = !maxValue && 0 !== maxValue;
  20. isMinValueUndefined && (minValue = !isMaxValueUndefined ? Math.min(value, maxValue) : value);
  21. isMaxValueUndefined && (maxValue = !isMinValueUndefined ? Math.max(value, minValue) : value);
  22. return Math.min(Math.max(value, minValue), maxValue)
  23. };
  24. var inRange = function(value, minValue, maxValue) {
  25. return value >= minValue && value <= maxValue
  26. };
  27. function getExponent(value) {
  28. return Math.abs(parseInt(value.toExponential().split("e")[1]))
  29. }
  30. function _isEdgeBug() {
  31. var value = 3e-4;
  32. var correctValue = "0.000300";
  33. var precisionValue = 3;
  34. return correctValue !== value.toPrecision(precisionValue)
  35. }
  36. function adjust(value, interval) {
  37. var precision = getPrecision(interval || 0) + 2;
  38. var separatedValue = value.toString().split(".");
  39. var sourceValue = value;
  40. var absValue = Math.abs(value);
  41. var isExponentValue = isExponential(value);
  42. var integerPart = absValue > 1 ? 10 : 0;
  43. if (1 === separatedValue.length) {
  44. return value
  45. }
  46. if (!isExponentValue) {
  47. if (isExponential(interval)) {
  48. precision = separatedValue[0].length + getExponent(interval)
  49. }
  50. value = absValue;
  51. value = value - Math.floor(value) + integerPart
  52. }
  53. precision = _isEdgeBug() && getExponent(value) > 6 || precision > 7 ? 15 : 7;
  54. if (!isExponentValue) {
  55. var separatedAdjustedValue = parseFloat(value.toPrecision(precision)).toString().split(".");
  56. if (separatedAdjustedValue[0] === integerPart.toString()) {
  57. return parseFloat(separatedValue[0] + "." + separatedAdjustedValue[1])
  58. }
  59. }
  60. return parseFloat(sourceValue.toPrecision(precision))
  61. }
  62. function getPrecision(value) {
  63. var str = value.toString();
  64. if (str.indexOf(".") < 0) {
  65. return 0
  66. }
  67. var mantissa = str.split(".");
  68. var positionOfDelimiter = mantissa[1].indexOf("e");
  69. return positionOfDelimiter >= 0 ? positionOfDelimiter : mantissa[1].length
  70. }
  71. function getRoot(x, n) {
  72. if (x < 0 && n % 2 !== 1) {
  73. return NaN
  74. }
  75. var y = Math.pow(Math.abs(x), 1 / n);
  76. return n % 2 === 1 && x < 0 ? -y : y
  77. }
  78. function solveCubicEquation(a, b, c, d) {
  79. var min = 1e-8;
  80. if (Math.abs(a) < min) {
  81. a = b;
  82. b = c;
  83. c = d;
  84. if (Math.abs(a) < min) {
  85. a = b;
  86. b = c;
  87. if (Math.abs(a) < min) {
  88. return []
  89. }
  90. return [-b / a]
  91. }
  92. var D2 = b * b - 4 * a * c;
  93. if (Math.abs(D2) < min) {
  94. return [-b / (2 * a)]
  95. } else {
  96. if (D2 > 0) {
  97. return [(-b + Math.sqrt(D2)) / (2 * a), (-b - Math.sqrt(D2)) / (2 * a)]
  98. }
  99. }
  100. return []
  101. }
  102. var p = (3 * a * c - b * b) / (3 * a * a);
  103. var q = (2 * b * b * b - 9 * a * b * c + 27 * a * a * d) / (27 * a * a * a);
  104. var roots;
  105. var u;
  106. if (Math.abs(p) < min) {
  107. roots = [getRoot(-q, 3)]
  108. } else {
  109. if (Math.abs(q) < min) {
  110. roots = [0].concat(p < 0 ? [Math.sqrt(-p), -Math.sqrt(-p)] : [])
  111. } else {
  112. var D3 = q * q / 4 + p * p * p / 27;
  113. if (Math.abs(D3) < min) {
  114. roots = [-1.5 * q / p, 3 * q / p]
  115. } else {
  116. if (D3 > 0) {
  117. u = getRoot(-q / 2 - Math.sqrt(D3), 3);
  118. roots = [u - p / (3 * u)]
  119. } else {
  120. u = 2 * Math.sqrt(-p / 3);
  121. var t = Math.acos(3 * q / p / u) / 3;
  122. var k = 2 * Math.PI / 3;
  123. roots = [u * Math.cos(t), u * Math.cos(t - k), u * Math.cos(t - 2 * k)]
  124. }
  125. }
  126. }
  127. }
  128. for (var i = 0; i < roots.length; i++) {
  129. roots[i] -= b / (3 * a)
  130. }
  131. return roots
  132. }
  133. exports.sign = sign;
  134. exports.fitIntoRange = fitIntoRange;
  135. exports.inRange = inRange;
  136. exports.adjust = adjust;
  137. exports.getPrecision = getPrecision;
  138. exports.getExponent = getExponent;
  139. exports.getRoot = getRoot;
  140. exports.solveCubicEquation = solveCubicEquation;