Вычисление числа Эйлера в C++

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

Я сделал все до цикла. Я не совсем понимаю, как я должен остановить цикл 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 ответа

Решение

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

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

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

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

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

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

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

do
{
  // ...
} while(abs(prevValue - value) >= threshold);
Другие вопросы по тегам