Помогите, пожалуйста, перевести из Pascal в C++
Const eps = 0.001;
Var f0,f1,f2, { члены ряда Фибоначчи }
n : word; { номер члена ряда Фибоначчи }
V, { текущее значение параметра V }
Vold, { предыдущее значение параметра V }
V1 : real; { точное значение золотого сечения }
Begin
f0:=0; f1:=1; f2:=1;
n:=1; V:=0;
Repeat
Vold:=V;
f0:=f1; f1:=f2; f2:=f0+f1;
Inc(n); V:=f2/f1;
Until abs(V-Vold)<=eps;
V1:=0.5*(1+sqrt(5));
Writeln('V = ',V:10:8,' V1 = ',V1:10:8,' n = ',n);
End
Само задание:
Золотое сечение, используемое в задачах оптимизации, определяется как предел отношения V = f(n)/f(n-1), где - два последовательных члена ряда Фибоначчи. Требуется вычислить значение eps с погрешностью, не превышающей заданного значения.
Ответы (1 шт):
Автор решения: DmitryK
→ Ссылка
Как-то так. Но в программе ошибка, в условии цикла должно быть >= eps, т.к. погрешность с каждой итерацией уменьшается. Иначе цикл заканчивается сразу после первой итерации.
И форматирование при выводе результатов не нужно - иначе не видно разницы в вычислениях.
#include <iostream>
#include <math.h>
int main()
{
const double eps = 0.001;
int f0 = 0, f1 = 1, f2 = 1; // члены ряда Фибоначчи
int n = 1; // номер члена ряда Фибоначчи
double V = 0.0; // текущее значение параметра V
double Vold; // предыдущее значение параметра V
double V1; // точное значение золотого сечения
do
{
Vold = V;
f0 = f1;
f1 = f2;
f2 = f0+f1;
n++;
V = (double)f2 / (double)f1;
}
while( fabs(V - Vold) >= eps ); // вот тут было неправильно
V1 = 0.5 * ( 1.0 + sqrt(5) );
printf("V = %f V1 = %f n = %d \n", V, V1, n); // без форматирования
// printf("V = %8.3f V1 = %8.3f n = %d \n", V, V1, n); // с форматированием
}