Вычисление числа Эйлера в C ++ - PullRequest
3 голосов
/ 24 марта 2011

Напишите программу, которая рассчитывает число Эйлера e. Для этого сначала напишите функцию, которая принимает параметр n и возвращает результат (1 + 1 / n) n . Предел этой функции приближается к e, когда n приближается к бесконечности. В вашей основной программе напишите цикл, который вызывает эту функцию с увеличением значения n. На каждой итерации умножьте n на 2 (если вы просто добавляете 1 к n каждый раз, алгоритм победил) и остановитесь, когда ваше новое приближение и ваше предыдущее приближение отличаются менее чем на 1e-8. Теперь у вас есть довольно хорошая оценка. Поэтому в main () выведите наилучшее приближение и число n, которое его сгенерировало.

Я сделал все до цикла for. Я не совсем понимаю, как я должен остановить цикл for после того, как новые и предыдущие числа примерно одинаковы.

Вот моя функция:

double euler_finder(double n)
{
    return pow((1+1/n), n);
}

А вот мой цикл for в основном методе, где ??? вот где у меня проблема:

for (int i=0; i<????; i*=2) {

}

РЕДАКТИРОВАТЬ: Решение было опубликовано так вот как это выглядит:

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

double euler(int n);

int main()
{
    int trialN = 4;

    double guess1, guess2;

    guess1 = euler(1);
    guess2 = euler(2);

    while(  abs(guess1-guess2) > 1e-8 )
    {
        cout<< trialN << " " << guess2<<endl;
        guess1 = guess2;
        guess2 = euler( trialN );
        trialN*=2;
    }

    cout<<setprecision(8)<<"e is approximately "<<guess2<<" and we got it with a value of ";
    cout<<trialN<<" for n";

    return 0;
}

double euler(int n)
{
    return pow((1+1.0/n), n);
}

Выход:

4 2.25
8 2.44141
16 2.56578
32 2.63793
64 2.67699
128 2.69734
256 2.70774
512 2.71299
1024 2.71563
2048 2.71696
4096 2.71762
8192 2.71795
16384 2.71812
32768 2.7182
65536 2.71824
131072 2.71826
262144 2.71827
524288 2.71828
1048576 2.71828
2097152 2.71828
4194304 2.71828
8388608 2.71828
16777216 2.71828
33554432 2.71828
67108864 2.71828
134217728 2.71828
e is approximately 2.7182818 and we got it with a value of 268435456 for n

Ответы [ 3 ]

5 голосов
/ 24 марта 2011

Прежде всего, если я начну с 0, а вы продолжите умножать на 2, это не продвинется очень далеко.Начните с 1.

Во-вторых, согласно постановке задачи, вам следует остановиться, когда ваше приближение будет достаточно хорошим.Таким образом, условие остановки цикла не на i, а на abs (Proper_E - your_approximation)> 1e-8

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

Не забывайте, что есть несколько конструкций цикла ; цикл do ... while (), вероятно, будет лучшим выбором для этого конкретного алгоритма. (Да, я уверен, что вы могли бы сделать его вписанным в цикл for, но это могло бы выглядеть не так четко.)

1 голос
/ 24 марта 2011

Не сказано использовать цикл for. Можно, хотя я считаю какое-то время или занятие более читабельным. В любом случае вам нужно условие вроде:

while(abs(prevValue - value) >= threshold)

РЕДАКТИРОВАТЬ: Исправлено. Строго говоря, это должно быть >=.

РЕДАКТИРОВАТЬ 2: Вы можете начать с искусственных prevValue и value, таких как 0 и 1, или использовать do-while (как уже упоминалось).

do
{
  // ...
} while(abs(prevValue - value) >= threshold);
...