2017-07-03 91 views
0

如何计算欧拉数到第n个数字在JavaScript?计算欧拉数到第n个数字在JavaScript

e = 1/0! + 1/1! + 1/2! + ...  
    = 2.7182818284590...to nth digit (base 10) 

下面的代码返回唯一编号,以16小数点精度取决于对迭代/传递给函数的数目或数量。

代码

function calcE(n) { 
    let euler, itr; 
    euler = 0 
    itr = Number(n) 
    for (var i = 0; i < itr+1; i++) { 
     let fact = factorial(i) 
     euler += 1/fact 
    } 
    return euler; 
} 

演示:miniwebtool

+2

收盘票是很奇怪的 - 问题是不宽的。这很简单,就是这样,但是在SO的规则中没有任何简单的限制。对一个人来说很简单,对另一个人来说不是这样。提高对不公平的补偿。 – Gangnus

+0

@Gangnus,虽然我不能看到的密切票,我同意,太宽泛肯定是不正确的在这种情况下,似乎过于宽泛就是去“我不知道该怎么将此作为”的理由。还值得注意的是,编辑大大改善了这个问题。 +1 –

+0

*“...仅将数字返回至16位小数点...”*:JavaScript使用IEEE 754浮点表示法,该表示法将精度限制为约16位十进制数字。所以你无法从中获得更多。见https://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript – trincot

回答

0

找到了一个解决方案,使用npm decimal.js包来处理大数字。

欧拉

function euler(n) { 
    let zero = new Decimal(0); 
    let one = new Decimal(1); 
    let rval; 

    for (let i = 0; i <= n; i++) { 
    let fval = factorial(i); 
    let invert = one.dividedBy(fval) 
    zero = zero.plus(invert) 
    } 
    rval = zero.toFixed(Number(n)) 
    return rval; 
} 

function factorial(n) { 
    var i = 2, 
    r = new Decimal(1); 
    for (; i <= n; r = r.times(i++)); 
    return r; 
} 

仍然无法计算非常大的值。建议?

+0

你也必须使用'factorial(i);'的十进制数据库,因为这个数字很快就会超出必要的精度。注意:你应该保持阶乘的增量值,以避免你在前一次迭代中做过的事情的重复倍增。 – trincot

0

你应该找到的第一个因子大于2*10^n。如果是m!,则应计算e号码,最大为1/m!

对于m!的估计,你可以使用Stirling's approximation。不要害怕e的存在 - 你可以非常粗略地计算,真的只需要订单。这样可以预先确定添加的数量。它可以通过不同的算法和更快的计数。

如果你不需要有这一点,事前,就可以计算出每1/M!添加和简单地比较它到0.5/10^n。第一个小于1/10^n的添加是您应该使用的最后一个。

limit = 0.5/10^n 
    add = 1 
    i = 1 
    euler = 1 
    while(add>limit) { 
     add /= i 
     euler += add 
     i++ 
    } 
    return euler 
+3

这是受到了微妙的陷阱。你所描述的算法用10^{ - n} _precision_来计算'e',这并不能保证'n''_digit_是正确的。必须估算剩余的误差(通过泰勒定理),并保持加,直到它变得足够小以稳定第n位。 – user58697

+0

@ user58697是的,我忘了乘以0.5。编辑。但是,当谈到第n位数字时,现有的做法意味着0.5的精度。如果下一次添加会改变位于老年位置的数字,没有人想尝试。是的,这可能意味着有时你会得到100000的尾部而不是099999,反之亦然,但这并不重要。这种做法的目标是将来使用0.5 * lastDigit作为可能错误的上限,并且它可以工作。 – Gangnus

+0

@ user58697如果您对最后一位数字为0.5的更精确的错误评估感兴趣,请将错误评估与主值一起计算。 – Gangnus