C ++定义很长但输出有限

时间:2016-06-10 18:03:51

标签: c++ precision long-integer

我目前正在学习C ++,所以我是初学者。我以为我会制作一个小程序来生成贝塞尔多项式项。这是该计划:

#include <iostream>

// x!
long long fact(const long long &x)
{
  long long z {1};
  for (long long i=1; i<=x; ++i)
    z *= i;
  return z;
}

// 2^n
long long pwr2(const int &n)
{
  long long z {1};
  for (long long i=0; i<n; ++i)
    z *= 2;
  return (n == 0 ? 1 : z);
}

// Bessel coefficients
long long bessel(long long *a, const long long &N)
{
  for (long long i=0; i<=N; ++i)
    a[i] = fact(N + i) / (pwr2(i) * fact(N - i) * fact(i));
  return *a;
}

int main()
{
  std::cout << "N = ";
  long long N;
  std::cin >> N;

  long long *a {new long long[N + 1]};
  *a = bessel(a, N);

  for (long long i=0; i<=N; ++i)
    std::cout << a[i] << ( i<N ? " " : "\n");

  delete a;
  a = nullptr;

  return 0;
}

N = 10似乎是极限。 sizeof(long long)显示8(archlinux x64)。事实(20)&gt; (2 ^ 64)-1,所以我卡住了,即使是很长的。有没有办法规避这个限制?

正如你所看到的那样,代码是在我绝望并将所有int修改为long long之后。我甚至在所有数字中添加了“ll”,没有任何效果。我甚至从分母中删除了主要括号,并安排了这些术语,使它们逐渐地以某种方式平衡自己,例如: fact(N+i)/fact(N-i)/fact(i)/pwr2(i),也没有效果。

1 个答案:

答案 0 :(得分:1)

您不能使用本机类型执行您想要的操作,因为它们受位大小的限制。 但是你可以使用一些库来实现它们(This is one such example) 如果你真的需要它(但根据你的问题,你只是学习c ++所以我猜你不需要那些)