javascript - 如何计算以 N 为底的大整数的对数?
问题描述
我正在使用这个BigInteger.js进行一些计算:
let myBigInt = bigInt(20).pow(200) // gets 160693804425899027554196209234116260252220299378279283530137600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
我想将对数应用于大整数,但在文档中我找不到任何匹配函数。如何log(baseN, valueX)
为 BigInteger.js 库实现函数?
注意:let myLogarithm = myBigInt.log(baseN)
不是一个有效的实现。
解决方案
注意:经过多次尝试和错误后,我确实找到了自己的工作解决方案,我会在这里发布它,因为我很确定还有更多的人,然后我也面临同样的问题。所以我希望,我可以帮助:)
像我一样看一下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 双精度 浮点)意味着,您最多有52 位精度,比小数点后 15 位多一点。在那之后 - 准确性将被杀死。
注意:对于非常大的值bigInt(20).pow(200)
与像 100*(和更多)这样的非常大的基数相结合,它似乎再次非常准确。
问候,乔纳斯。
推荐阅读
- javascript - JavaScript RegEx,检查字符串是否包含 * 符号并遵循一组特定规则
- python-3.x - 创建 tf.data.Dataset 对象时,repeat() 有什么用?
- r - 关于查找组合匹配的一般问题
- regex - unlang 文件的正则表达式
- python - 使用基本 python 创建登录系统
- spring-boot - 与轴突框架的一对一关系
- powerbi - 如何避免 Power BI 中的双向关系
- vba - 使用 VBA 在 CATIA 中调用用户参考属性
- c++ - Removing all occurrences of a character from a string in C++
- java - 无法在自定义视图上通过 id 访问子级