Как рассчитать логарифм (основание N) для bigInt?

1

Вопрос - Как вычислить логарифм для bigInt? :

Я использую эту большую библиотеку: https://www.npmjs.com/package/big-integer для некоторых вычислений.


let myBigInt = bigInt(20).pow(200) // gets 160693804425899027554196209234116260252220299378279283530137600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Теперь я хотел бы применить логарифм к переменной с типом bigInt, но в документах я не смог найти какую-либо подходящую функцию -call для реализованной функции логарифма, например (используя малые ints) собственный js Math.log -call является.


Мой вопрос: как реализовать функцию log(baseN, valueX) для библиотеки BigInt?


Примечание: let myLogarithm = myBigInt.log(baseN) не является допустимой реализацией.

  • 1
    stackoverflow.com/questions/29418957/...
  • 0
    попробуйте это: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Показать ещё 9 комментариев
Теги:
math
biginteger

1 ответ

0
Лучший ответ

Примечание. После многих попыток и ошибок я нашел свое собственное рабочее решение, и я опубликую его здесь, потому что я уверен, что есть еще несколько человек, кроме меня, которые также сталкиваются с той же проблемой прямо там. Так что я надеюсь, я мог бы помочь: )


Посмотрите на википедию, как и я, потому что это очень хорошая статья о baseConversion.

Ниже вы можете найти функцию для Math.log(base, value) которая может вычислять log(base) из значения.

Math.log = (function() {
  var log = Math.log;
  return function(base, n) {
    return log(n)/(base ? log(base) : 1);
  };
})();

Чтобы вычислить logarithmToBaseN для bigInt-значений, просто используйте эту строку кода:

let logarithmToBaseN = (myBigInt.toString().length * Math.log(baseN, 10) + Math.log(baseN, parseFloat("0." + myBigInt))) - 1);

Изменить: это soltuion является крошечным обходным решением. Bacause parseFloat("0." + myBigInt) преобразует большое значение, например 100000 в очень маленькое, например, 0.100000,... что вызывает то, что он будет иметь целую точность.


Согласно @Jonas W comment: решение очень точно для более низких оснований вроде (5, 10,...) сочетании с низкими значениями, такими как 10, 1000, 100000 но для действительно больших значений, таких как bigInt(20).pow(200) это не так.

Примечание. Использование parseFloatплавающей запятой с двойной точностью IEEE 754) означает, что вы должны иметь максимум 52 бит точности, что составляет чуть более 15 знаков после запятой. После этого - точность будет убита.

Примечание: для действительно больших значений bigInt(20).pow(200) сочетании с действительно большими Базами, такими как 100 * (и более), кажется, что это довольно точно.

Приветствия, jonas.

  • 0
    Это остро?
  • 0
    @JonasW. Это будет только с точностью до значения с плавающей запятой JS, которое составляет 48 бит.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню