如何计算大整数以N为底的对数?
How to calculate logarithm with base N for big integer?
我正在使用这个 BigInteger.js 进行一些计算:
let myBigInt = bigInt(20).pow(200) // gets 160693804425899027554196209234116260252220299378279283530137600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我想将对数应用于大整数,但在文档中我找不到任何匹配的函数。如何为 BigInteger.js 库实现 log(baseN, valueX)
函数?
注意:let myLogarithm = myBigInt.log(baseN)
不是有效的实现。
注意:经过大量尝试和错误后,我确实找到了自己的工作解决方案,我会post在这里,因为我很确定有一些遇到同样问题的人比我还多。所以我希望,我能帮上忙 :)
像我一样看看 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)
这样的 非常大的值 是不是。
注意:使用parseFloat
(IEEE 754双精度 floating-point)意味着,你有一个最大值52 位精度,比小数点后 15 位多一点。之后 - 准确性将被杀死。
注意: 对于非常大的值 bigInt(20).pow(200)
结合真正的 大基数 看起来像 100*(以及更多)再次非常准确。
你好,乔纳斯。
我正在使用这个 BigInteger.js 进行一些计算:
let myBigInt = bigInt(20).pow(200) // gets 160693804425899027554196209234116260252220299378279283530137600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我想将对数应用于大整数,但在文档中我找不到任何匹配的函数。如何为 BigInteger.js 库实现 log(baseN, valueX)
函数?
注意:let myLogarithm = myBigInt.log(baseN)
不是有效的实现。
注意:经过大量尝试和错误后,我确实找到了自己的工作解决方案,我会post在这里,因为我很确定有一些遇到同样问题的人比我还多。所以我希望,我能帮上忙 :)
像我一样看看 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)
这样的 非常大的值 是不是。
注意:使用parseFloat
(IEEE 754双精度 floating-point)意味着,你有一个最大值52 位精度,比小数点后 15 位多一点。之后 - 准确性将被杀死。
注意: 对于非常大的值 bigInt(20).pow(200)
结合真正的 大基数 看起来像 100*(以及更多)再次非常准确。
你好,乔纳斯。