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

问题描述 投票:1回答:1

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

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

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

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

javascript math biginteger logarithm
1个回答
0
投票

注意:经过多次尝试和错误,我确实找到了自己的可行解决方案,因此将其发布在这里,因为我敢肯定,除了我之外,还有更多人也遇到相同的问题那里。因此,我希望可以提供帮助:)


像我一样查看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);

Edit:此解决方案很小,是因为parseFloat("0." + myBigInt)100000之类的大值转换为0.100000,...之类的小值,这是因为它将导致整数精度。 >


根据@Jonas W的评论

该解决方案对于(5, 10, ...)之类的低位碱基与10, 1000, 100000之类的低值结合非常准确,但是对于[bigInt(20).pow(200)真正大值

]不是。

Note:使用parseFloatIEEE 754双精度

floating-point)表示,最大为52位精度,这比15位小数位还多。在那之后-准确性将被扼杀。

[注:

对于真正大的值bigInt(20).pow(200)与真正的[[大基数结合起来,例如100 *(及更多),它似乎又很准确。问候,乔纳斯。
© www.soinside.com 2019 - 2024. All rights reserved.