Mie*_*oli 39 javascript logarithm biginteger bigint
有没有办法在 JavaScript 中获取BigInt的对数?
对于普通数字,您可以使用以下代码:
const largeNumber = 1000;
const result = Math.log(largeNumber);
Run Code Online (Sandbox Code Playgroud)
但是,我需要使用阶乘数字,可能高于 170!,因此常规数字类型不起作用。Math.log不适用于 BigInt。那么如何得到对数呢?
const largeNumber = BigInt(1000);
const result = ???
Run Code Online (Sandbox Code Playgroud)
car*_*10m 33
如果您不想返回 a BigInt,那么以下方法也可能适合您:
function log10(bigint) {
if (bigint < 0) return NaN;
const s = bigint.toString(10);
return s.length + Math.log10("0." + s.substring(0, 15))
}
function log(bigint) {
return log10(bigint) * Math.log(10);
}
function natlog(bigint) {
if (bigint < 0) return NaN;
const s = bigint.toString(16);
const s15 = s.substring(0, 15);
return Math.log(16) * (s.length - s15.length) + Math.log("0x" + s15);
}
const largeNumber = BigInt('9039845039485903949384755723427863486200719925474009384509283489374539477777093824750398247503894750384750238947502389475029384755555555555555555555555555555555555555554444444444444444444444444222222222222222222222255666666666666938475938475938475938408932475023847502384750923847502389475023987450238947509238475092384750923847502389457028394750293847509384570238497575938475938475938475938475555555555559843991');
console.log(natlog(largeNumber)); // 948.5641152531601
console.log(log10(largeNumber), log(largeNumber), log(-1))
// 411.95616098588766
// 948.5641152531603
// NaNRun Code Online (Sandbox Code Playgroud)
log10()BigInt将为您作为参数输入的任何数字或 Int 数字返回标准精度浮点数。
正如@Mielipuoli 非常正确地提到的,自然对数可以计算为
function log(bigint) {
return log10(bigint) / Math.log10(Math.E);
}
Run Code Online (Sandbox Code Playgroud)
或者,甚至更简单,如上面我的代码片段所示,如log10(bigint) * Math.log(10).
@Nat 已经在下面的评论中解释了这种方法的工作原理,即通过分别计算对数的整数部分和小数部分并将它们相加。关于结果的精度:它Math.log10()适用于具有通常 13 到 14 位小数精度的浮点数,因此,对于结果来说,这也是您所期望的。
因此,我将 BigInt 数字的字符串表示形式截断为 15 个字符。无论如何,在隐式类型转换为 float 时,任何其他小数位都会被忽略。
我还在这里添加了十六进制字符串版本,由 @PeterCordes 建议并由 @somebody 进一步开发为natlog(). 它的工作原理 - 可能比我原来的解决方案更快 - 并产生“相同”的结果(只有最后显示的数字在两个结果之间存在偏差)!
Jac*_*ker 25
其他答案已经充分解决了您在标题中给出的问题,即:“如何计算 BigInt 的对数?”。但是,您还提到您对阶乘的对数特别感兴趣,对此不同的算法可以避免范围困难。
应用 log(ab) = log(a) + log(b),以下函数计算阶乘的对数:
function logFactorial(n) {
let total = 0;
for (let current = 1; current <= n; ++current) {
total += Math.log10(current);
}
return total;
}
console.log(logFactorial(170));Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4325 次 |
| 最近记录: |