У меня есть этот код, чтобы получить логарифм числа с заданной общей базой:
#include <boost/math/special_functions/powm1.hpp>
#include <boost/math/special_functions/log1p.hpp>
#include <boost/math/special_functions/sqrt1pm1.hpp>
// ...
// Boost Log returns boost::math::log1p(x) = log(e, x + 1)
double res = (double)(boost::math::log1p(arg - 1));
// Base conversion: log(new, y) = log(old, y) / log(old, new)
// Then ==> log(base, arg) = log(e, arg) / log(e, base)
res = (double)(res / ((double)boost::math::log1p(base - 1)));
return res;
Как видите, загрузочные библиотеки определяют только неперианский журнал, и есть также хитрый способ получить этот журнал, потому что то, что эта библиотека возвращает вам, это не log (x), а log (x + 1). Как видите, эта проблема решается путем указания аргумента arg - 1, и все должно работать.
ХОРОШО Это работает, но только неперианский журнал в порядке, я имею в виду, если я запускаю этот код:
#include <boost/math/special_functions/powm1.hpp>
#include <boost/math/special_functions/log1p.hpp>
#include <boost/math/special_functions/sqrt1pm1.hpp>
// ...
// Boost Log returns boost::math::log1p(x) = log(e, x + 1)
double res = (double)(boost::math::log1p(arg - 1));
// Base conversion: log(new, y) = log(old, y) / log(old, new)
// Then ==> log(base, arg) = log(e, arg) / log(e, base)
//res = (double)(res / ((double)boost::math::log1p(base - 1)));
return res;
Все в порядке, но правильно, когда я выполняю базовое изменение, все не хорошо, я получаю неправильные результаты ... Я не знаю, может быть, это математическая проблема ... Я знаю этот журнал (basea, x ) = log (baseb, x) / log (baseb, basea) ...
Где я не так делаю ??
Ну, может быть, это математическая проблема, касающаяся числовой стабильности и т. Д. ... чтобы получить журнал на другой базе, какова лучшая практика ???????