0

我用 HTML 和 JS 为自然对数的底创建了一个算法。这是代码:

HTML: bonl.html

<html>
    <head>
        <title>bonl</title>
    </head>
    <body>
        <script src="bonl.js"></script>
        <input type="number" id="entered">
        <input type="button" value="run" onclick="calculate()">
        <div id="bonl">
    </body>
</html>

和 Javascript:bonl.js

function calculate() {
    var x = document.getElementById('entered').value;
    console.log(x);
    var e = (1 + (1/x))**x;
    console.log(e);
    document.getElementById('bonl').innerHTML = e;
}

首先,为 <input type="number" id="entered"> 分配一个数字值,然后单击名为“运行”的按钮。之后,bonl.js 中的 var x 将等于分配给 'entered' 的数字。然后,根据自然对数底的定义(e = lim x->inf (1+(1/x)**x)),Javascript文件会计算出e。结果将由 <div id="bonl"> 显示。

我希望您注意到,随着 x 的值变大,javascript 文件计算自然对数的底数会更准确。

但是,我在 <input type="number" id="entered"> 中输入了大约 10 万亿,我得到的结果是 1 而不是 2.71828..,尽管当我在 <input type 中输入 100 万亿时得到 2.71828 ="数字" id="输入">。

我的计算机是笨拙地计算 e,还是我的代码中有错误,或者 e = 1?

4

1 回答 1

1

Yes, your computer is dumb. It can only operate floating point numbers below 2^53. When you go above that, it loses the precision and 1 + small number becomes just 1:

for (let pow = 1; pow < 60; pow++) {
    let n = 2 ** pow;
    console.log('2^', pow, 'small=', 1 + 1/n, 'e=', (1 + 1/n)**n)
}

Can we do better than that? Yes, we can! Instead of computing e using floating point numbers, let's compute some_big_number * e using Big Integers, which, unlike floats, have unlimited precision. Using BigInts we can compute as many terms of the power series as we want:

let BIG = 10n ** 100n

let f = 1n
let e = BIG
let n = 1n


while (1) {
    f = f * n
    let eNext = e + BIG / f
    if (eNext === e) {
        document.write(`e = ${e} <br>`)
        document.write(`terms = ${n} <br>`)
        break
    }
    e = eNext
    n += 1n
}

于 2021-05-08T09:06:31.837 回答