我正在使用这个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)
不是有效的实现。
答案 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 *(及更多),它似乎再次非常准确。
问候,乔纳斯。