Помогите плес горит лаба
Реализуйте модуль, подключение которого перегружает операции помещения в поток вывода и извлечение из потока ввода для класса, содержащего методы разложения функции
ln(1+x)в ряд Тейлора. На экран должно выводитьсяnпервых слагаемых формулы Тейлора. Значениеnопределяет пользователь.Реализуйте модуль, пишите программу, реализующую класс для работы с целыми числами, не превышающими 254. Для данного класса реализуйте перегрузку операции сложения так, чтобы результатом сложения было побитовое ИЛИ.
Ответы (1 шт):
Вопрос 1
Решил помочь вам, закодировал решение вашей задачи в том виде в каком я понял вашу задачу.
Сделал даже немного больше, кроме вывода ряда в консоль ещё сделал ввод значения любой точки X и вывод значения ряда в этой точке, сделал это только для того чтобы проверить корректность закодированной формулы.
Не забудьте что нужно вводить такие a и x, что -1 < a*x < 1, иначе ряд не сойдётся.
Также ещё реализовал вариант кода ниже, но ряда Тейлора для функции cos(ax).
Смотрите пример ввода/вывода в конце моего ответа после кода.
// https://en.wikipedia.org/wiki/Taylor_series#Natural_logarithm
#include <vector>
#include <iostream>
#include <cmath>
class TaylorLog {
public:
// Конструктор. Вычисления ряда Тейлора для заданных n, a.
TaylorLog(size_t n, double a) {
double k = -1;
for (size_t i = 0; i < n; ++i) {
// Коэффициент каждого следующего элемента получается из предыдущего путём домножения на -a.
k *= -a;
s_.push_back(k / (i + 1));
}
}
// Вывод в поток (например консоль).
void Dump(std::ostream & sout) const {
for (size_t i = 0; i < s_.size(); ++i) {
// Выводим i-й коэффициент плюс x степени (i+1).
sout << s_[i] << " * x^" << (i + 1);
if (i + 1 < s_.size())
sout << " + ";
}
}
// Вычисление ряда Тейлора.
double Compute(double x) {
double r = 0, k = 1;
for (size_t i = 0; i < s_.size(); ++i) {
// Вычисляется степень x итеративно.
k *= x;
// Каждое следующее слагаемое равно коэффициенту домноженному на k (степень x).
r += s_[i] * k;
}
return r;
}
private:
std::vector<double> s_;
};
// Перегрузка оператора вывода в поток.
inline std::ostream & operator << (std::ostream & sout, TaylorLog const & tlog) {
tlog.Dump(sout);
return sout;
}
int main() {
std::cout << "Enter n and a: ";
size_t n = 0;
double a = 0;
std::cin >> n >> a;
// Конструируем объект класса ряда Тейлора.
TaylorLog tlog(n, a);
// Выводим ряд в поток.
std::cout << "Taylor serie for ln(1 + ax): " << tlog << std::endl;
double x = 0;
std::cout << "Enter x: ";
std::cin >> x;
std::cout << "Taylor serie value at point " << x << ": " << tlog.Compute(x) << std::endl;
// Вычисляем точное значение используя стандартную std::log(num) функцию.
std::cout << "Correct value of ln(1 + ax) at point " << x << ": " << std::log(1 + a * x) << std::endl;
}
Вывод:
Enter n and a: 7 2.5
Taylor serie for ln(1 + ax): 2.5 * x^1 + -3.125 * x^2 + 5.20833 * x^3 + -9.76562 * x^4 + 19.5312 * x^5 + -40.6901 * x^6 + 87.1931 * x^7
Enter x: 0.15
Taylor serie value at point 0.15: 0.31849
Correct value of ln(1 + ax) at point 0.15: 0.318454
Вопрос 2
#include <cstdint>
#include <iostream>
typedef uint8_t u8;
class Num {
public:
Num(u8 n) : n_(n) {}
Num(Num const & b) : n_(b.n_) {}
Num & operator = (Num const & b) {
n_ = b.n_;
return *this;
}
Num & operator = (u8 n) {
n_ = n;
return *this;
}
Num & operator += (Num const & b) {
n_ |= b.n_;
return *this;
}
Num operator + (Num const & b) const {
Num a = *this;
a += b;
return a;
}
private:
friend std::ostream & operator << (std::ostream &, Num const &);
u8 n_ = 0;
};
inline std::ostream & operator << (std::ostream & s, Num const & n) {
return (s << size_t(n.n_));
}
int main() {
std::cout << std::hex << "0x" << (Num(0xAA) + Num(0x33)) << std::endl;
}
Вывод:
0xbb