【问题标题】:How to calculate logarithm with base N for big integer?如何计算以 N 为底的大整数的对数?
【发布时间】:2018-10-24 06:58:24
【问题描述】:

我正在使用这个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】:

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


看看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*(及更多))相结合,它似乎又相当准确了。

你好,乔纳斯。

【讨论】:

  • 这是准确的吗?
  • @JonasW。这只会精确到 JS 浮点数的有效位,即 48 位。
  • @kittsil 我想完全准确的结果实际上对于对数来说实际上是不可能的,所以可能是我们可以得到的赌注答案。
猜你喜欢
  • 2023-01-10
  • 2011-03-19
  • 2020-12-08
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多