如何计算bigInt的对数(基数N)?

时间:2018-05-14 14:53:27

标签: javascript math biginteger

问题 - 如何计算bigInt的对数? :

我正在使用这个bigInt库:https://www.npmjs.com/package/big-integer进行一些计算。

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

现在我想将对数应用于bigInt类型的变量,但在文档中我找不到任何匹配函数调用来实现< strong>对数函数,如(使用小整数)原生js Math.log - 调用是。

  

我的问题:如何为bigInt库实现log(baseN, valueX)函数?

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

1 个答案:

答案 0 :(得分:0)

注意:经过大量的尝试和错误后,我确实找到了一个自己的工作解决方案,我会在这里发布,因为我很确定还有一些人,然后我也是gots在那里面对同样的问题。所以我希望,我可以提供帮助:)

像我一样看看wikipedia,因为这是一篇关于baseConversion的非常好的文章。

您可以在下面找到能够从某个值计算Math.log(base, value)的{​​{1}}函数。

log(base)

要计算bigInt值的Math.log = (function() { var log = Math.log; return function(base, n) { return log(n)/(base ? log(base) : 1); }; })();,只需使用以下代码行:

logarithmToBaseN

修改:此解决方案是一个很小的解决方法,因为let logarithmToBaseN = (myBigInt.toString().length * Math.log(baseN, 10) + Math.log(baseN, parseFloat("0." + myBigInt))) - 1); 将像parseFloat("0." + myBigInt)这样的大值转换为像{{1}这样的非常小的值是什么导致它将以整数精度。

根据100000的评论对于0.100000,...等低级基数以及@Jonas W这样的低值,此解决方案非常准确 - 但是非常大的价值,如(5, 10, ...),不是。

注意:使用10, 1000, 100000 IEEE 754双精度 floating-point)表示最多 52位精度,这是小于15位小数。在那之后 - 准确性将被杀死。

注意:对于非常大的值bigInt(20).pow(200)加上真正的大基地,如100 *(及更多),它似乎再次非常准确。

问候,乔纳斯。