math.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { each, isNil } from '@antv/util';
  2. // 求以a为次幂,结果为b的基数,如 x^^a = b;求x
  3. // 虽然数学上 b 不支持负数,但是这里需要支持 负数
  4. export function calBase(a, b) {
  5. var e = Math.E;
  6. var value;
  7. if (b >= 0) {
  8. value = Math.pow(e, Math.log(b) / a); // 使用换底公式求底
  9. }
  10. else {
  11. value = Math.pow(e, Math.log(-b) / a) * -1; // 使用换底公式求底
  12. }
  13. return value;
  14. }
  15. export function log(a, b) {
  16. if (a === 1) {
  17. return 1;
  18. }
  19. return Math.log(b) / Math.log(a);
  20. }
  21. export function getLogPositiveMin(values, base, max) {
  22. if (isNil(max)) {
  23. max = Math.max.apply(null, values);
  24. }
  25. var positiveMin = max;
  26. each(values, function (value) {
  27. if (value > 0 && value < positiveMin) {
  28. positiveMin = value;
  29. }
  30. });
  31. if (positiveMin === max) {
  32. positiveMin = max / base;
  33. }
  34. if (positiveMin > 1) {
  35. positiveMin = 1;
  36. }
  37. return positiveMin;
  38. }
  39. function digitLength(num) {
  40. // Get digit length of e
  41. var eSplit = num.toString().split(/[eE]/);
  42. var len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
  43. return len > 0 ? len : 0;
  44. }
  45. /**
  46. * 高精度加法,解决 0.1 + 0.2 !== 0.3 的经典问题
  47. *
  48. * @param num1 加数
  49. * @param num2 被加数
  50. * @return {number} 返回值
  51. */
  52. export function precisionAdd(num1, num2) {
  53. var num1Digits = digitLength(num1);
  54. var num2Digits = digitLength(num2);
  55. var baseNum = Math.pow(10, Math.max(num1Digits, num2Digits));
  56. return (num1 * baseNum + num2 * baseNum) / baseNum;
  57. }
  58. //# sourceMappingURL=math.js.map