0

我有以下代码,它返回: 2.7182818284590455348848081484902650118 其中只有2.718281828459045是正确的,其余的都是错误的。

我正在使用以下参考:2.7182818284590452353602874713526624977 http://www.vaxasoftware.com/doc_edu/mat/nume15000.pdf

我的代码是:

#include "gmp.h"
#include <stdio.h>
#include <math.h>

#define EPSILON 1.0e-15

int main() {
    unsigned long long fact = 1;
    double e = 2.0, e0;
    int n = 2;
    do {
        e0 = e;
        fact *= n++;
        e += 1.0 / fact;
    }
    while (fabs(e - e0) >= EPSILON);
    printf("e = %.37f\n", e);
    return 0;
}

如果有人可以帮助我,我将不胜感激。太感谢了!

4

3 回答 3

1

我的代码是:

#include "gmp.h"

仅包含此标头不会魔术般地使用多精度算术;您必须使用GNU MP 手册中记录的适当功能

例如,您将使用

{
  mpf_t x;
  mpf_init2 (x, 100);
  ...

初始化 100 位精度的浮点数 x,并进行计算,您可以使用此处的函数,例如mpf_add添加 2 个这样的变量。

于 2020-02-12T13:41:29.080 回答
1

如何在 C 中计算欧拉的 37 位小数?

2 128约为 3.4*10 38。通过形成一个 128 位整数分子/分母,我们可以实现所需的e

如下重写循环并运行到足够大n直到num*i + 1即将溢出(n = = 33),我们可以达到/接近所需的结果。

// Algorithm
wide_floating_point e() {
  unsigned n = 33;
  my_uint128 num = 1;
  my_uint128 den = 1;
  for (unsigned i=1; i <= n; i++) {
    num = num*i + 1;
    den = den*i;
  }
  return (wide_floating_point) num/fact;
}

现在 OP,可能没有 128 无符号整数类型,也无法执行 128/128 位浮点除法。然而 OP 只需要创建 2 个函数(未显示实现 - 但本质上是小学数学):

typedef struct {
  // or unsigned char decimal_digit[40] or 
  // however you want to save a big integer
  uint64_t hi,lo;
} my_uint128; 

my_uint128 times_add_128(my_uint128 x, unsigned m, bool a);
void print_quotient_128(my_uint128 num, my_uint128 dem);

如果我们测试算法并使用__int128并使用 a long double(精度为 80),我们将接近目标。

long double e(int n) {
  unsigned __int128 fact = 1;
  unsigned __int128 num = 1;
  for (int i=1; i<=n; i++) {
    fact *= i;
    if (num >  (((unsigned __int128)-1)-1)/i) { printf("%d!\n", i); exit(0); }
    num = num*i + 1;
  }
  return 1.0L*num/fact;
}

int main() {
  for (int i=1; i<34; i++)  {
    printf("%d %.25Lf\n", i, e(i));
  }
}

   2,718281828459045235 3602874713526624977
33 2.718281828459045235 4281681

我将 OP 的 2 个函数留给times_add_128(), print_quotient_128()编码:

于 2020-02-12T04:30:42.017 回答
-1

我降低了你的价值。

printf("e = %.37f\n", e);

printf("e = %.15f\n", e);

答案是:

2,718281828459046

于 2020-02-12T07:28:07.173 回答