Аппроксимация e - Получение максимально возможного количества цифр - PullRequest
0 голосов
/ 24 марта 2012

Я пытался приблизиться к e, используя последовательное представление, чтобы получить как можно больше прецизионных цифр, используя приведенный ниже код, но независимо от того, сколько терминов я вычисляю, количество прецизионных цифр, похоже, остается неизменным.то есть:

2.71828198432922363281250000000000000000000000000000

Это мой подход не так?Вот код:

  1 #include <stdio.h>
  2 #include <iostream>
  3 #include <math.h>
  4 using namespace std;
  5 
  6 float factorial (float a)
  7 {
  8         if (a > 1)
  9         {
 10                 return (a * factorial (a-1));
 11         } else
 12         {
 13                 return 1;
 14         }
 15 }
 16 
 17 int main()
 18 {
 19         float sum  = 0;
 20         int range=100000;
 21 
 22         for (int i=0; i<=range;i++)
 23         {
 24                 sum += pow(-1,i)/factorial(i);
 25         }
 26         sum = pow(sum,-1);
 27         printf("%4.50f\n", sum);
 28 } 

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

Чтобы получить более точные цифры, вы должны написать свой класс данных, в котором будет храниться больше цифр, скажем, 1000 цифр. Самое сложное - это написать операции +, -, *, /.

Если вам нужно просто поэкспериментировать с математической формулой, вы можете выбрать другой язык, например Python . Он имеет типы данных, такие как Decimal, Fraction, которые могут выполнять более точные вычисления.

Я люблю математику, поэтому пишу скрипт на python для проверки формулы:

from decimal import Decimal, getcontext
prec = 100
getcontext().prec = prec

fac = Decimal(1)/2
sum = Decimal(0)
eps = Decimal(0.1)
eps = eps**prec

realE = '2.71828182845904523536028747135266249775724709369995'

i = 3
while 1:
    ds = fac - fac/i
    sum += ds
    if ds < eps: break
    fac /= i * (i+1)
    i += 2

print 'After %d iteration:' % i
print realE
print str(1/sum)

Вот результат:

After 71 iteration:
2.71828182845904523536028747135266249775724709369995
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166429
0 голосов
/ 24 марта 2012

Вы достигли предела, когда добавленное число намного меньше суммы, и поскольку числа с плавающей точкой в ​​основном рациональные числа, это обрезается.Вот хорошее прочтение о тонкостях чисел с плавающей запятой

Пример:

 12345.123
+    0.0001
------------
 12345.123

, если в числе сохранены только первые 8 цифр.

Простым решением будет итерация от диапазона до 0, чтобы вы начали свою сумму с небольших чисел и отслеживали потерянные цифры.Как пример:

sum0 = 12345.123
b0   =     0.0001
sum1 = sum0 + b0 # 12345.123
diff1 = (sum1 - sum0) - b0 # 0.0001
# the result you want is sum1 + diff1

# keep on iterating and summing
...