首页 > 解决方案 > 如何计算以 N 为底的大整数的对数?

问题描述

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

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

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

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

标签: javascriptmathbigintegerlogarithm

解决方案


注意:经过多次尝试和错误后,我确实找到了自己的工作解决方案,我会在这里发布它,因为我很确定还有更多的人,然后我也面临同样的问题。所以我希望,我可以帮助:)


像我一样看一下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);
  };
})();

要计算logarithmToBaseNbigInt 值,只需使用以下代码行:

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, 100000bigInt(20).pow(200)

注意:使用parseFloatIEEE 754 双精度 浮点)意味着,您最多有52 位精度,比小数点后 15 位多一点。在那之后 - 准确性将被杀死。

注意:对于非常大的值bigInt(20).pow(200)与像 100*(和更多)这样的非常大的基数相结合,它似乎再次非常准确。

问候,乔纳斯。


推荐阅读