欧拉的数量扩张

时间:2011-07-17 12:16:32

标签: c++ arrays math eulers-number

#include <iostream>
#include <iomanip>
using namespace std;

int a[8], e[8];
void term (int n)
{
    a[0]=1;
    for (int i=0; i<8; i++)
    {
      if (i<7)
      {
        a[i+1]+=(a[i]%n)*100000;
      }
    /* else
      {
        a[i+1]+=((a[i]/640)%(n/640))*100000;
      }
    */
      a[i]=a[i]/(n);
    }
}

void sum ()
{

}

int factorial(int x, int result = 1) 
{
  if (x == 1) 
    return result;
  else return factorial(x - 1, x * result);
}


int main()    
{
  int n=1;
  for (int i=1; i<=30; i++)
  {
     term(n);

     cout << a[0] << " "<< a[1] << " " << a[2] <<  " " 
          << a[3] <<  " " << a[4] << " " << a[5]<< " " 
          << " " << a[6] << " " << a[7] << endl;
     n++;
     for (int j=1; j<8; j++) 
       a[j]=0;
  }
  return 0;
}    

我上面的内容是我到目前为止的代码。 Sum和其余的都是故意未完成的,因为它仍处于构建阶段。

现在,我需要扩展euler'号码, 这应该让你使用像x [n]这样的系列来将结果分成多个部分并使用函数来计算结果等。

根据它, 我需要找到Maclaurin扩展的特定部分并进行计算。

因此,e = 1 + x +(1/2!)* x中的X等等始终为1 给我们e = 1 + 1 + 1/2!+1/3!+ 1 / n!计算

程序应按N

的顺序计算

所以如果N是1,它只计算相应的阶乘分部; 这意味着变量的一部分将保存计算结果x = 1.00000000~而另一部分将保持实际总和直到现在为e = 2.000000~

对于N = 2 x = 1/2!,e =前一个e + x

表示N = 3 x = 1/3!,e =前一个e + x

最大N数为29 每次计算结果时,都需要将点后面的所有数字保存到单独的变量中,如x[1] x[2] x[3],直到所有30~35位数的精度都用它们填充。 因此在打印时,在N = 2的情况下

X [0] .X [1] X [2] X [3]〜 应该出来 0.50000000000000000000 其中x [0]应该保持点上方的值,而x[1~3]将保留其余的5位数。

嗯,对不起,如果我的解释很糟糕,但这就是它的要求。 所有数组必须在Int中,我不能使用其他数组 我不能使用bigint,因为它击败了目的

我遇到的另一个问题是,在进行操作时,它一直持续到第7天。 从8号开始依此类推它不会继续而不给我负数。

for N=8 它应该是00002480158730158730158730。 相反,我得到00002 48015 -19220 -41904 30331 53015 -19220

这显然是由于int的限制,因为在那部分确实如此 19.36亿40320% 为了获得a[3]的值,然后是35200,然后乘以100000 给我们一个3520000000/40320,虽然a [3]的值超过了整数的限制,有什么方法可以解决这个问题吗? 我不能使用双打或Bigints,所以如果有人有解决方法,我们将不胜感激。

3 个答案:

答案 0 :(得分:0)

你不能使用浮点数或bigint,但是其他编译器内部整数类型如long long,unsigned long long等等呢?为了使它明确,你可以使用<stdint.h>的int64_t和uint64_t(或<cstdint>的std :: int64_t和std :: uint64_t,虽然这个标题尚未正式标准,但许多编译器都支持)。

答案 1 :(得分:0)

我不知道这是否有用,但您可以在此处找到我编写的用于计算欧拉数的代码:http://41j.com/blog/2011/10/program-for-calculating-e/

答案 2 :(得分:0)

32bit int将事实限制为11!

  • 因此您必须存储以上所有事实除以某个数字
    • 12!/ 10000
    • 13!/ 10000
    • 当它不再适合时使用10000 ^ 2依旧
  • 当使用除法结果时,只是转移到接下来的四位小数......(正如我假设的那样是第一次打算)
  • 当然你不分1 / n!
    • 对于将为零的整数而不是10000
    • 但这限制了n!只有9999,所以如果你想要更多的地方添加零,结果是小数
  • 我认为可能会有一些溢出,所以你也应该继续高位数