![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Distribution Construction ExamplesBoost , Math Toolkit 2.5.0 , Worked Examples
|
![]() |
Caution |
---|---|
Это удобство типизациине предусмотрено, если столкновение произойдет с названием функции: в настоящее время только< |
После использования заявления,
using boost::math::negative_binomial;
У нас есть удобный шрифт<negative_binomial_distribution<double>
>:
negative_binomial mydist(8., 0.25);
Еще несколько примеров с использованием удобного typedef:
negative_binomial mydist10(5., 0.4); // Both arguments double.
И происходит автоматическое преобразование, поэтому вы можете использовать целые числа и поплавки:
negative_binomial mydist11(5, 0.4); // Using provided typedef double, int and double arguments.
Это, вероятно, наиболее распространенное использование.
negative_binomial mydist12(5., 0.4F); // Double and float arguments. negative_binomial mydist13(5, 1); // Both arguments integer.
Аналогично для большинства других распределений, таких как биномиал.
binomial mybinomial(1, 0.5); // is more concise than binomial_distribution<> mybinomd1(1, 0.5);
Для случаев, когда имя распределения типдефа столкнется с математической специальной функцией (в настоящее время только бета и гамма), типдеф намеренно не предоставляется, и должна использоваться более длинная версия имени. Например, не использовать:
using boost::math::beta; beta mybetad0(1, 0.5); // Error beta is a math FUNCTION!
Что вызывает сообщения об ошибках:
error C2146: syntax error : missing ';' before identifier 'mybetad0' warning C4551: function call missing argument list error C3861: 'mybetad0': identifier not found
Вместо этого вы должны использовать:
using boost::math::beta_distribution; beta_distribution<> mybetad1(1, 0.5);
или для гамма-распределения:
gamma_distribution<> mygammad1(1, 0.5);
Мы можем, конечно, все еще предоставить тип явно таким образом:
// Explicit double precision: both arguments are double: negative_binomial_distribution<double> mydist1(8., 0.25); // Explicit float precision, double arguments are truncated to float: negative_binomial_distribution<float> mydist2(8., 0.25); // Explicit float precision, integer & double arguments converted to float: negative_binomial_distribution<float> mydist3(8, 0.25); // Explicit float precision, float arguments, so no conversion: negative_binomial_distribution<float> mydist4(8.F, 0.25F); // Explicit float precision, integer arguments promoted to float. negative_binomial_distribution<float> mydist5(8, 1); // Explicit double precision: negative_binomial_distribution<double> mydist6(8., 0.25); // Explicit long double precision: negative_binomial_distribution<long double> mydist7(8., 0.25);
И вы можете использовать свой собственный RealType, например<boost::math::cpp_dec_float_50
>(произвольный тип точности 50 десятичных цифр), тогда мы можем написать:
using namespace boost::multiprecision; negative_binomial_distribution<cpp_dec_float_50> mydist8(8, 0.25); // `integer` arguments are promoted to your RealType exactly, but // `double` argument are converted to RealType, // possibly losing precision, so don't write: negative_binomial_distribution<cpp_dec_float_50> mydist20(8, 0.23456789012345678901234567890); // to avoid truncation of second parameter to `0.2345678901234567`. negative_binomial_distribution<cpp_dec_float_50> mydist21(8, cpp_dec_float_50("0.23456789012345678901234567890") ); // Ensure that all potentially significant digits are shown. std::cout.precision(std::numeric_limits<cpp_dec_float_50>::digits10); cpp_dec_float_50 x("1.23456789012345678901234567890"); std::cout << pdf(mydist8, x) << std::endl;
showing 0.00012630010495970320103876754721976419438231705359935
![]() |
Warning |
---|---|
При использовании многоточности слишком легко получить случайное усечение! |
Например, если вы пишете
std::cout << pdf(mydist8, 1.23456789012345678901234567890) << std::endl;
показывает 0,00012630010495970318465064569310967179576805651692929, Что не так примерно с 17-й десятичной цифрой!
Это связано с тем, что предоставленное значение усечено до<double
>, фактически<doublex
=1.23456789012345678901234567890;
>.
Тогда теперь<doublex
>переходит к функции<pdf
>, и это усеченное<double
>значение, наконец, повышается до<cpp_dec_float_50
>.
Другой способ получить неправильный ответ — написать:
std::cout << pdf(mydist8, cpp_dec_float_50(1.23456789012345678901234567890)) << std::endl;
Правильный путь от многозначного значения строки
std::cout << pdf(mydist8, cpp_dec_float_50("1.23456789012345678901234567890")) << std::endl;
![]() |
Tip |
---|---|
Получение около 17 десятичных цифр, за которыми следует множество нулей, часто является признаком случайного усечения. |
Обратите внимание, что аргументы конструктора по умолчанию приведены только для некоторых дистрибутивов. Поэтому, если вы ошибочно принимаете аргумент по умолчанию, вы получите сообщение об ошибке, например:
negative_binomial_distribution<> mydist8;
error C2512 no appropriate default constructor available.
Конструкторы по умолчанию не предусмотрены для распределения<negative
binomial
>, потому что трудно выбрать какие-либо разумные значения по умолчанию для этого распределения.
Для других распределений, таких как нормальное распределение, очевидно, очень полезно обеспечить «стандартные» по умолчанию для среднего (ноль) и стандартного отклонения (единство) таким образом:
normal_distribution(RealType mean = 0, RealType sd = 1);
В этом случае мы можем написать:
using boost::math::normal; normal norm1; // Standard normal distribution. normal norm2(2); // Mean = 2, std deviation = 1. normal norm3(2, 3); // Mean = 2, std deviation = 3. } catch(std::exception &ex) { std::cout << ex.what() << std::endl; } return 0; } // int main()
Полезных результатов этой демонстрационной программы, конечно, нет.
См.distribution_construction.cppдля полного исходного кода.
Статья Distribution Construction Examples раздела Math Toolkit 2.5.0 Worked Examples может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Worked Examples ::
реклама |