代码之家  ›  专栏  ›  技术社区  ›  user3596335

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

  •  1
  • user3596335  · 技术社区  · 6 年前

    我在用这个 BigInteger.js 对于某些计算:

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

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

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

    1 回复  |  直到 6 年前
        1
  •  -1
  •   user3596335 user3596335    6 年前

    笔记 :经过多次尝试(&a);错误我确实找到了一个自己的有效解决方案,我将把它张贴在这里,因为我非常确定,还有一些人比我还多,他们也面临着同样的问题。因此,我希望我能帮助: )


    看看 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);
      };
    })();

    要计算 logarithmToBaseN 对于bigInt值,只需使用以下代码行:

    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) 不是吗。

    笔记 :使用 parseFloat ( IEEE 754双精度 floating-point )也就是说,您最多有 52位精度 ,略多于15个小数位。在那之后,准确性将被扼杀。

    注: 对于非常大的价值 bigInt(20)。功率(200) 结合真的 大型基地 比如100*(甚至更多),它似乎又相当准确了。

    你好jonas。