Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2013, 20:19   #1
Shonny94
Пользователь
 
Регистрация: 15.09.2012
Сообщений: 11
По умолчанию Рекурсивные функции

Задача состоит в том, что надо рекурсивно вычислить функцию Y=LN(X), разложенную в степенной ряд, с заданной степенью точности

Код:
#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>

double F(int n,float x,double log1,float eps)
{
if (fabs(pow(-1,n-1)*pow(x-1,(int)n)/n) < eps ) return log1+(pow(-1,(int)n-1)*pow(x-1,(int)n)/n);
log1+=(pow(-1,(int)n-1)*pow(x-1,n)/n);
log1=F(n+1,x,log1,eps);
return log1;
}

int main()
{
clrscr();
int T=1;
float x,eps;
printf("Vvedite x=");
scanf("%f",&x);
  while (x>2)
  {
  T=2*T;
  x=sqrt(x);
  }
printf("Vvedite eps=");
scanf("%f",&eps);
double log=T*F(1,x,0,eps);
printf("log=%lf\n",&log);
getch();
return 0;
}
Ругается на pow, думаю что надо перед pow проставить double т.к. функция определена как: double pow(double x, double y);
Да и в коде не совсем уверен правильно ли я думаю?


1>f:\rec\rec\rec.cpp(9) : error C2668: 'pow' : ambiguous call to overloaded function
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(575): could be 'long double pow(long double,int)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(527): or 'float pow(float,int)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(489): or 'double pow(double,int)'
1> while trying to match the argument list '(int, int)'
1>f:\rec\rec\rec.cpp(9) : error C2668: 'pow' : ambiguous call to overloaded function
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(575): could be 'long double pow(long double,int)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(527): or 'float pow(float,int)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(489): or 'double pow(double,int)'
1> while trying to match the argument list '(int, int)'
1>f:\rec\rec\rec.cpp(10) : error C2668: 'pow' : ambiguous call to overloaded function
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(575): could be 'long double pow(long double,int)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(527): or 'float pow(float,int)'
1> c:\program files (x86)\microsoft visual studio 8\vc\include\math.h(489): or 'double pow(double,int)'
1> while trying to match the argument list '(int, int)'
Shonny94 вне форума Ответить с цитированием
Старый 05.06.2013, 20:48   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

У Вас просто неразбериха с передаваемыми в функции типами переменных, отсюда и ошибки....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 05.06.2013, 21:41   #3
Shonny94
Пользователь
 
Регистрация: 15.09.2012
Сообщений: 11
По умолчанию

в этой части?
Код:
double F(int n,float x,double log1,float eps)
Shonny94 вне форума Ответить с цитированием
Старый 05.06.2013, 22:27   #4
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

у Вас третий передаваемый передаваемый параметр - double:
а Вы передаете,в качестве аргумента int - 0). Нужно: 0. (0 + точка)

-
Код:
(int)n
ненужное приведение типа int к типу int...

Последний раз редактировалось Igor95; 05.06.2013 в 22:37.
Igor95 вне форума Ответить с цитированием
Старый 05.06.2013, 23:10   #5
Shonny94
Пользователь
 
Регистрация: 15.09.2012
Сообщений: 11
По умолчанию

Код:
#include <stdafx.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>

double F(int n,float x,double log1,float eps)
{
if (fabs((double) pow((double) -1.,n-1)*(float) pow((float)x-1,n)/n) < eps ) return log1+((double)pow((double)-1.,n-1)*(float)pow((float)x-1,n)/n);
log1+=((double)pow((double)-1.,n-1)*(float)pow((float)x-1,n)/n);
log1=F(n+1,x,log1,eps);
return log1;
}

int main()
{
int T=1;
float x,eps;
printf("Vvedite x=");
scanf("%f",&x);
  while (x>2)
  {
  T=2*T;
  x=sqrt(x);
  }
printf("Vvedite eps=");
scanf("%f",&eps);
double log=T*F(1,x,0.,eps);
printf("log=%lf\n",&log);
getch();
return 0;
}
Теперь не правильно выдает результат
Изображения
Тип файла: jpg Безымянный.jpg (22.5 Кб, 75 просмотров)
Shonny94 вне форума Ответить с цитированием
Старый 06.06.2013, 00:13   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Теперь не правильно выдает результат
Ну ещё бы.
1) Зафиксировано неправильное использование printf. Ей, в отличие от scanf, передаются значения, а не адреса.

2) Научитесь отлаживать программу самостоятельно. Например, если в начало функции F добавить строчку
Код:
printf("F(%d, %f, %lf, %f)\n", n, x, log1, eps);
, то Вы прекрасно увидите, что происходит "в мозгах" компьютера.

3) Вы вроде уже третий человек за месяц, кто пытается возводить -1 в n-ную степень с помощью pow. И Вам тоже напоминаю, что целое число не всегда может быть представлено типом double идеально точно, а (-1)^(7.000000001) - величина неопределённая.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рекурсивные функции (C,C++) vladimir.nsk Помощь студентам 0 07.12.2011 20:51
Рекурсивные функции в С Licwin Общие вопросы C/C++ 1 14.11.2011 01:49
рекурсивные функции Kukurudza Общие вопросы C/C++ 5 23.06.2011 12:16
Рекурсивные функции NiaSpa Помощь студентам 3 04.03.2010 11:53
Рекурсивные функции. Geg[C/c++] Общие вопросы C/C++ 2 11.10.2009 11:28