C/C++
C++ нахождение функция нахождения логарифма
Есть ли открытый код, как вычислить логарифм не используя сторонние библиотеки (math и т.д)
Math не сторонняя, а стандартная.
А зачем тебе это?
Ищи справочники по приближенным вычислениям, разложение логарифма в быстросходящиеся ряды и т. п.
Достаточно найти такие разложения, например, для натурального логарифма, а потом, если нужно, переходить к произвольному основанию.
Ищи справочники по приближенным вычислениям, разложение логарифма в быстросходящиеся ряды и т. п.
Достаточно найти такие разложения, например, для натурального логарифма, а потом, если нужно, переходить к произвольному основанию.
Ищи по «приближенные вычисления» может в википедии есть готовый код, а мат. вроде 1 что нашлось scask.ru/g_book_f_math2.php?id=147
Для не очень больших и не очень маленьких положительных чисел это вообще элементарно:
#include <iostream>
#include <cmath>
using namespace std;
double ln(double x)
{
if (x < 1) return -ln(1. / x);
double e = 1., a = (x - e) / (x + e), b = a * a,
p = a, s = a, q = e; while (e > 1e-18)
{ q += 2.; p *= b; e = p / q; s += e; }
return 2. * s;
}
int main()
{
double x, y; while (true)
{
cout << "x = ?\b"; cin >> x; y = ln(x);
cout.precision(16); cout << y << ", error = ";
cout.precision(6); cout << y - log(x) << endl;
}
}
В этой программе модуль cmath используется для сравнения функции ln(x), вычисляющей натуральный логарифм числа x путём его разложения в ряд по нечётным степеням вспомогательного числа (x-1)/(x+1), с функцией log из этого модуля, тоже вычисляющей натуральный логарифм. А для больших и маленьких чисел надо уметь работать с битовым представлением вещественных чисел, то есть знать, где в их двоичном представлении что находится (мантиссы, порядки и знаки) и уметь пользоваться школьными формулами вроде такой вот:
ln(a·2ⁿ) = ln(a) + n·ln(2).
#include <iostream>
#include <cmath>
using namespace std;
double ln(double x)
{
if (x < 1) return -ln(1. / x);
double e = 1., a = (x - e) / (x + e), b = a * a,
p = a, s = a, q = e; while (e > 1e-18)
{ q += 2.; p *= b; e = p / q; s += e; }
return 2. * s;
}
int main()
{
double x, y; while (true)
{
cout << "x = ?\b"; cin >> x; y = ln(x);
cout.precision(16); cout << y << ", error = ";
cout.precision(6); cout << y - log(x) << endl;
}
}
В этой программе модуль cmath используется для сравнения функции ln(x), вычисляющей натуральный логарифм числа x путём его разложения в ряд по нечётным степеням вспомогательного числа (x-1)/(x+1), с функцией log из этого модуля, тоже вычисляющей натуральный логарифм. А для больших и маленьких чисел надо уметь работать с битовым представлением вещественных чисел, то есть знать, где в их двоичном представлении что находится (мантиссы, порядки и знаки) и уметь пользоваться школьными формулами вроде такой вот:
ln(a·2ⁿ) = ln(a) + n·ln(2).
Похожие вопросы
- C++, Нахождение НОД
- C++ напишите функцию 2 треугольника похожи или нет
- Написать программу в С++ (нахождение площади трапеции)
- Сделать перестановку чисел с помощью функции в C++, но у меня получается чепуха
- C++ Выведите в порядке возрастания все простые числа на отрезке [l;r]. Оформите решение в виде функции bool
- Помогите решить задачу, c++, функции
- СОЗДАНИЕ ФУНКЦИЙ В C++
- Передача в метод класса указателя на функцию C++
- Добавить функцию в код [C++]
- Массив функции c++ помогите