Смог сделать синус и косинус, но не понимаю как сделать арктангенс
double Rad(double r){
r= r*180/Pi;
while (r>360){
r = r-360;
}
return r*Pi/180;
}
double sin(double x)
{
x = Rad(x);
double res=0, pow=x, fact=1;
for(int i=0; i<20; ++i)
{
res+=pow/fact;
pow*=-1*x*x;
fact*=(2*(i+1))*(2*(i+1)+1);
}
return res;
}
double cos(double x){
return sin(x+Pi/2);
}
double tg(double x){
return sin(x)/cos(x);
}
C/C++
Как написать функцию которая вычисляет арктангенс из любого числа на c++ без использования библиотек
Насколько я помню, арктангкнс является обратной функцией для тангенса, а тангенс вы уже судя по всему посчитали.
Игорь Борисов
Да, обратная функция. Как это поможет?
принимаешь y;
из допустимых значений x выбираешь среднее - проверяешь результат. Если больше - берешь половину x c меньшей стороны, иначе с большей. И так далее, пока не достигнится нужная точность.
из допустимых значений x выбираешь среднее - проверяешь результат. Если больше - берешь половину x c меньшей стороны, иначе с большей. И так далее, пока не достигнится нужная точность.
(•‿•) Вот как можно сделать достаточно точно, надёжно и эффективно работающую функцию arctg(x) для любых вещественных х (с примером её применения !):
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
const double pi = 3.1415926535897932,
tau = 2. * pi, pip = pi / 2., piq = pi / 4., eps = 1e-18;
double Abs(double x)
{ return (x < 0) ? -x : x; }
double Sin(double x)
{ x -= tau * (int) (x / tau); double y = - x * x, p = x,
s = x, q = 1.; while (Abs(p) > eps) { q += 2.;
p *= y / (q * (q - 1.)); s += p; } return s; }
double Cos(double x)
{ x -= tau * (int)(x / tau); double y = - x * x, p = 1.,
s = p, q = 0.; while (Abs(p) > eps) { q += 2.;
p *= y / (q * (q - 1.)); s += p; } return s; }
double Arctg(double x)
{ if (x == 1) return piq; if (x == -1) return -piq;
if (x > 1) return pip - Arctg(1. / x);
if (x < -1) return - pip - Arctg(1. / x);
double y = - x * x, p = x, s = x, q = 1., e = q;
while (Abs(e) > eps) { q += 2.; p *= y; e = p / q;
s += e; } return s; }
double Exp(double x)
{ if (x < 0) return 1. / Exp(-x); double p = 1., s = p,
q = 0.; while (p / s > eps) { q++; p *= x / q; s += p; }
return s; }
double Sh(double x)
{ return (Exp(x) - Exp(-x)) * 0.5; }
double Max(double (*f)(double), double a,
double b, double h) { int i, n = (int)((b - a) / h);
double H = (b - a) / n; double y, max = f(a); for (i = 1;
i <= n; i++) { y = f(a + i * H); if (y > max) max = y; }
return max; }
int main()
{ double a, b, h, x; cout << "a b h » "; cin >> a >>
b >> h; string s[4] = {"sin »", "cos »", "arctg »",
"sh »"}; double max, y[4] = { Max(Sin, a, b, h),
Max(Cos, a, b, h), Max(Arctg, a, b, h),
Max(Sh, a, b, h) }; for (int i = 0; i < 4; i++)
{ cout << s[i] << setprecision(15)
<< fixed << setw(22) << y[i] << endl; if (y[i] > max)
max = y[i]; } cout << "max »" << setprecision(15)
<< setw(22) << max << endl; }
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
const double pi = 3.1415926535897932,
tau = 2. * pi, pip = pi / 2., piq = pi / 4., eps = 1e-18;
double Abs(double x)
{ return (x < 0) ? -x : x; }
double Sin(double x)
{ x -= tau * (int) (x / tau); double y = - x * x, p = x,
s = x, q = 1.; while (Abs(p) > eps) { q += 2.;
p *= y / (q * (q - 1.)); s += p; } return s; }
double Cos(double x)
{ x -= tau * (int)(x / tau); double y = - x * x, p = 1.,
s = p, q = 0.; while (Abs(p) > eps) { q += 2.;
p *= y / (q * (q - 1.)); s += p; } return s; }
double Arctg(double x)
{ if (x == 1) return piq; if (x == -1) return -piq;
if (x > 1) return pip - Arctg(1. / x);
if (x < -1) return - pip - Arctg(1. / x);
double y = - x * x, p = x, s = x, q = 1., e = q;
while (Abs(e) > eps) { q += 2.; p *= y; e = p / q;
s += e; } return s; }
double Exp(double x)
{ if (x < 0) return 1. / Exp(-x); double p = 1., s = p,
q = 0.; while (p / s > eps) { q++; p *= x / q; s += p; }
return s; }
double Sh(double x)
{ return (Exp(x) - Exp(-x)) * 0.5; }
double Max(double (*f)(double), double a,
double b, double h) { int i, n = (int)((b - a) / h);
double H = (b - a) / n; double y, max = f(a); for (i = 1;
i <= n; i++) { y = f(a + i * H); if (y > max) max = y; }
return max; }
int main()
{ double a, b, h, x; cout << "a b h » "; cin >> a >>
b >> h; string s[4] = {"sin »", "cos »", "arctg »",
"sh »"}; double max, y[4] = { Max(Sin, a, b, h),
Max(Cos, a, b, h), Max(Arctg, a, b, h),
Max(Sh, a, b, h) }; for (int i = 0; i < 4; i++)
{ cout << s[i] << setprecision(15)
<< fixed << setw(22) << y[i] << endl; if (y[i] > max)
max = y[i]; } cout << "max »" << setprecision(15)
<< setw(22) << max << endl; }
Grinia 1
У меня есть еще один шаг, благодаря которому функция быстро показывает точные результаты и не расходится вблизи модуля единицы. Ваша функция при приближении к единице слева выполняется все медленее (c просто бешеным кол-вом итераций), все менее точно (из-за бешеного кол-ва ошибок округления) и в конечном счете расходится при значении 0.9999999999
Edit: math.h здесь для сравнения самописной функции с функцией из стандартной библиотеки
Функция определена на всей числовой прямой.

Функция определена на всей числовой прямой.

Ходин Сергей
math.h использовать нельзя! :)
Похожие вопросы
- Написать РЕКУРСИВНУЮ функцию, которая принимает двухмерный массив целых чисел и выполняет круговой сдвиг массива ВЛЕВО.
- Напишите рекурсивную функцию, которая принимает двухмерный массив целых чисел и количество сдвигов и выполняет
- Написал функцию, которая добавляет элемент в конец массива, как можно улучшить? Нули не учитываются.
- Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде
- Написать программу, которая сравнивает число перестановок элементов при использовании сортировки «пузырьком» (усовершенс
- Создать функцию, которая возводит число в степень.Запрещено использовать функцию возведения в степень.
- Как написать функцию в c++ которая складывает все положительные числа
- C++ напишите функцию 2 треугольника похожи или нет
- Здравствуйте, помогите пожалуйста написать программу на C++ с использованием функций
- Помогите написать функцию на C++