Я использую эту большую библиотеку: 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)
не является допустимой реализацией.
Примечание. После многих попыток и ошибок я нашел свое собственное рабочее решение, и я опубликую его здесь, потому что я уверен, что есть еще несколько человек, кроме меня, которые также сталкиваются с той же проблемой прямо там. Так что я надеюсь, я мог бы помочь: )
Посмотрите на википедию, как и я, потому что это очень хорошая статья о 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.