如何计算大整数以N为底的对数?

How to calculate logarithm with base N for big integer?

我正在使用这个 BigInteger.js 进行一些计算:

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

我想将对数应用于大整数,但在文档中我找不到任何匹配的函数。如何为 BigInteger.js 库实现 log(baseN, valueX) 函数?

注意:let myLogarithm = myBigInt.log(baseN) 不是有效的实现。

注意:经过大量尝试和错误后,我确实找到了自己的工作解决方案,我会post在这里,因为我很确定有一些遇到同样问题的人比我还多。所以我希望,我能帮上忙 :)


像我一样看看 wikipedia,因为有一篇关于 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);
  };
})();

要计算 bigInt 值的 logarithmToBaseN,只需使用这行代码:

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

编辑:这个解决方案是一个很小的解决方法因为parseFloat("0." + myBigInt)将像100000这样的大值转换为一个非常小的像 0.100000,... 是什么原因导致它将是整数精度。


根据 @Jonas W 的评论该解决方案对于像 (5, 10, ...) 这样的低碱基结合像这样的低值非常准确10, 1000, 100000 - 但对于像 bigInt(20).pow(200) 这样的 非常大的值 是不是。

注意:使用parseFloatIEEE 754双精度 floating-point)意味着,你有一个最大值52 位精度,比小数点后 15 位多一点。之后 - 准确性将被杀死。

注意: 对于非常大的值 bigInt(20).pow(200) 结合真正的 大基数 看起来像 100*(以及更多)再次非常准确。

你好,乔纳斯。