Ошибка "невозможно преобразовать аргумент" - C (СИ)
Формулировка задачи:
Ошибка 2 error C2664: "double newton(double (__cdecl *)(double),double (__cdecl *)(double),double,double)": невозможно преобразовать аргумент 2 из "double (__cdecl *)(double,double)" в "double (__cdecl *)(double)" c:\users\1\documents\visual studio 2013\projects\consoleapplication107\consoleapplication107\consoleapplication107.cpp 118 1 ConsoleApplication107
Ошибка 3 IntelliSense: аргумент типа "double (*)(double x, double y)" несовместим с параметром типа "double (*)(double)" c:\Users\1\Documents\Visual Studio 2013\Projects\ConsoleApplication107\ConsoleApplication107\ConsoleApplication107.cpp 118 38 ConsoleApplication107
Обе ошибки указывают на эту строку, на "fp1"
Функция для метода Ньютона.
и та самая "fp1"- производная моей функции, для вычисления методом Ньютона
Далее весь код с комментариями(на вяский случай)
printf("%.*f\n", width, newton(f1, fp1, -1.0, 0.0));
double newton(double(*f)(double), double(*fp)(double), double a0, double b0) { double a, b, x, x0; a = a0; b = b0; x0 = (a + b) / 2; x = x0 - (f(x0) / fp(x0)); while (xabs(x - x0) > e * 10) { x0 = x; x = x0 - (f(x0) / fp(x0)); } return x; }
double fp1(double x, double y) //proizvodnaya { return 1/(2*pow(cos(x/2),2))-1/(2*(pow(sin(x/2),2)))+1; }
#include <stdio.h> #include <math.h> #include <float.h> double bubu(double s) { return s; } double get_e() { double e = 1.0; while (bubu(e / 2 + 1) > 1) e = e / 2; return e; } const double e = DBL_EPSILON; double f1(double x) //ФУНКЦИЯ 1 { return tan(x / 2) - (1 / tan(x / 2)) + x; } double f2(double x) //ФУНКЦИЯ 2 { return x*tan(x) - 1 / 3; } double f11(double x) //ВЫРАЖАЕМ Х ИЗ Ф-ИИ 1) { return 1/tan(x/2)-tan(x/2); } double f22(double x) //ВЫРАЖАЕМ Х ИЗ Ф-ИИ 2) { return 1 / (3 * tan(x)); } double fp1(double x, double y) // ПРОИЗВОДНАЯ Ф-ИИ 1) { return 1/(2*pow(cos(x/2),2))-1/(2*(pow(sin(x/2),2)))+1; } double fp2(double x) // ПРОИЗВОДНАЯ Ф-ИИ 2) { return tan(x)+x*(1/pow(cos(x),2)); } double dichotomy(double(*f)(double), double a0, double b0) // МЕТОД ДИХОТОМИИ { double a, b; a = a0; b = b0; while (fabs(a - b) > e * 2) { double m = (a + b) / 2; if (f(a)*f(m) >= 0) a = (a + b) / 2; if (f(b)*f(m) >= 0) b = (a + b) / 2; } return (a + b) / 2; } double xabs(double x){ // ФУНКЦИЯ МОДУЛЯ(НЕ ИСПОЛЬЗОВАЛАСЬ) if (x < 0) return -x; return x; } double iteraciy(double(*f)(double), double a0, double b0) // МЕТОД ИТЕРАЦИИ { double a, b, x, x0; a = a0; b = b0; x0 = (a + b) / 2; x = f(x0); while (xabs(x - x0) > e * 10) { x0 = x; x = f(x0); } return x; } double newton(double(*f)(double), double(*fp)(double), double a0, double b0) //МЕТОД НТЮТОНА { double a, b, x, x0; a = a0; b = b0; x0 = (a + b) / 2; x = x0 - (f(x0) / fp(x0)); while (xabs(x - x0) > e * 10) { x0 = x; x = x0 - (f(x0) / fp(x0)); } return x; } int main() // ВЫВОД { int width = ceil(-log10(e)); printf("%.*f\n", width, dichotomy(f1, -1.0, 0.0)); printf("%.*f\n", width, iteraciy(f11, -1.0, 0.0)); printf("%.*f\n", width, newton(f1, fp1, -1.0, 0.0)); printf("%.*f\n", width, dichotomy(f2, 2.0, 3.0)); printf("%.*f\n", width, iteraciy(f22, 2.0, 3.0)); printf("%.*f\n", width, newton(f2, fp2, 2.0, 3.0)); return 0; }
Решение задачи: «Ошибка "невозможно преобразовать аргумент"»
textual
Листинг программы
#include<stdio.h> void f1(double a) { printf("%lf\n", a); } void f2(double a, double b) { printf("%lf %lf\n", a, b); } int main(void) { void (*fp1)(double) = f1; void (*fp2)(double, double) = f2; fp1(1.888); fp2(1.2, 3.4); return 0; }
Объяснение кода листинга программы
- Подключение необходимых библиотек: #include
- Объявление двух функций:
- f1(double a) — принимает один аргумент типа double и выводит его значение
- f2(double a, double b) — принимает два аргумента типа double и выводит их значения
- Объявление функции main():
- int main(void) — возвращает значение типа int, не принимает аргументов
- Объявление двух указателей на функции:
- void (*fp1)(double) — указатель на функцию, которая принимает один аргумент типа double и возвращает void
- void (*fp2)(double, double) — указатель на функцию, которая принимает два аргумента типа double и возвращает void
- Вызов функции f1() через указатель fp1 с аргументом 1.888
- Вызов функции f2() через указатель fp2 с аргументами 1.2 и 3.4
- Возврат значения 0 функцией main(), что означает успешный конец работы программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д