Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算欧拉';在javascript中从s数字到第N位_Javascript_Algorithm - Fatal编程技术网

计算欧拉';在javascript中从s数字到第N位

计算欧拉';在javascript中从s数字到第N位,javascript,algorithm,Javascript,Algorithm,如何在JavaScript中计算第n位的Euler数 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 <

如何在JavaScript中计算第n位的Euler数

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;
}
函数计算(n){
设euler,itr;
欧拉=0
itr=数量(n)
对于(变量i=0;i

演示:您应该找到大于
2*10^n
的第一个阶乘。如果是
m,您应该将
e
数字计数到
1/m

用于估算
m您可以使用。不要害怕
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

通过使用
npm decimal.js
包处理大小数找到了解决方案

Euler

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;
}
函数euler(n){
设零=新的十进制数(0);
设一=新的小数点(1);
让rval;

对于(设i=0;i最后的投票很奇怪——这个问题一点也不宽泛。这很简单,这是罗格特,但在SO规则中没有任何简单的限制。对一个人来说简单的事情,对另一个人来说就不是这样了。投票补偿不公平。@Gangnus,虽然我看不到最后的投票,但我同意太宽泛了在这种情况下肯定是不正确的,似乎“我不知道该标记什么”的原因太宽泛了。同样值得注意的是,编辑极大地改进了问题。+1“…只返回16个小数点的数字…”:JavaScript使用IEEE 754浮点表示法,该表示法将精度限制在大约16位十进制数字。因此您将无法从中获得更多信息。请参阅,这是一个微妙的陷阱。您描述的算法使用10^{-n}计算
e
精度,这不能保证
n
的第位数字是正确的。必须估计剩余的误差(例如通过泰勒定理),然后继续添加,直到它变小到足以稳定第n个数字。@user58697是的,我忘记了乘以0.5。编辑。但是现有的做法,当谈到第n个数字时,意味着0.5精度。没有人想尝试下一次添加是否会改变站在较老位置的数字。是的,这可能意味着一些时间的尾数是100000,而不是099999,反之亦然,但这并不重要。这种做法的目标是确保将来使用0.5*lastDigit作为可能错误的上限,并且它是有效的。@user58697如果您对比最后一个数字的0.5更精确的错误评估感兴趣,请计算错误评估您还必须将十进制库用于
阶乘(i);
,因为该数字很快就会超出必要的精度。注意:您应该保留阶乘的增量值,以避免重复重复上一次迭代中已执行的操作。