⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 CPP
字号:
//  Copyright John Maddock 2007.//  Use, modification and distribution are subject to the//  Boost Software License, Version 1.0. (See accompanying file//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#include "required_defines.hpp"#include <map>#include <set>#include <iostream>#include <iomanip>#include <string>#include <cstring>#include <boost/math/tools/config.hpp>#include <boost/regex.hpp>#include <boost/type_traits/is_same.hpp>#include "performance_measure.hpp"#include <boost/math/policies/policy.hpp>#ifdef TEST_GSL#include <gsl/gsl_errno.h>#include <gsl/gsl_message.h>#endifextern void reference_evaluate();std::map<std::string, double> times;std::set<test_info> tests;double total = 0;int call_count = 0;std::set<test_info>& all_tests(){   static std::set<test_info> i;   return i;}void add_new_test(test_info i){   all_tests().insert(i);}void set_call_count(int i){   call_count = i;}void show_help(){   std::cout << "Specify on the command line which functions to test.\n"      "Available options are:\n";   std::set<test_info>::const_iterator i(all_tests().begin()), j(all_tests().end());   while(i != j)   {      std::cout << "   --" << (*i).name << std::endl;      ++i;   }   std::cout << "Or use --all to test everything." << std::endl;   std::cout << "You can also specify what to test as a regular expression,\n"      " for example --dist.* to test all the distributions." << std::endl;}void run_tests(){   // Get time for empty proceedure:   double reference_time = performance_measure(reference_evaluate);   std::set<test_info>::const_iterator i, j;   for(i = tests.begin(), j = tests.end(); i != j; ++i)   {      set_call_count(1);      std::cout << "Testing " << std::left << std::setw(40) << i->name << std::flush;      double time = performance_measure(i->proc) - reference_time;      time /= call_count;      std::cout << std::setprecision(3) << std::scientific << time << std::endl;   }}bool add_named_test(const char* name){   bool found = false;   boost::regex e(name);   std::set<test_info>::const_iterator a(all_tests().begin()), b(all_tests().end());   while(a != b)   {      if(regex_match((*a).name, e))      {         found = true;         tests.insert(*a);      }      ++a;   }   return found;}void print_current_config(){   std::cout << "Currently, polynomial evaluation uses method " << BOOST_MATH_POLY_METHOD << std::endl;   std::cout << "Currently, rational function evaluation uses method " << BOOST_MATH_RATIONAL_METHOD << std::endl;   if(BOOST_MATH_POLY_METHOD + BOOST_MATH_RATIONAL_METHOD > 0)      std::cout << "Currently, the largest order of polynomial or rational function"         " that uses a method other than 0, is " << BOOST_MATH_MAX_POLY_ORDER << std::endl;   bool uses_mixed_tables = boost::is_same<BOOST_MATH_INT_TABLE_TYPE(double, int), int>::value;   if(uses_mixed_tables)      std::cout << "Currently, rational functions with integer coefficients are evaluated using mixed integer/real arithmetic" << std::endl;   else      std::cout << "Currently, rational functions with integer coefficients are evaluated using all real arithmetic (integer coefficients are actually stored as reals)" << std::endl << std::endl;   std::cout << "Policies are currently set as follows:\n\n";   std::cout << "Policy                                  Value\n";   std::cout << "BOOST_MATH_DOMAIN_ERROR_POLICY          " << BOOST_STRINGIZE(BOOST_MATH_DOMAIN_ERROR_POLICY) << std::endl;   std::cout << "BOOST_MATH_POLE_ERROR_POLICY            " << BOOST_STRINGIZE(BOOST_MATH_POLE_ERROR_POLICY) << std::endl;   std::cout << "BOOST_MATH_OVERFLOW_ERROR_POLICY        " << BOOST_STRINGIZE(BOOST_MATH_OVERFLOW_ERROR_POLICY) << std::endl;   std::cout << "BOOST_MATH_UNDERFLOW_ERROR_POLICY       " << BOOST_STRINGIZE(BOOST_MATH_UNDERFLOW_ERROR_POLICY) << std::endl;   std::cout << "BOOST_MATH_DENORM_ERROR_POLICY          " << BOOST_STRINGIZE(BOOST_MATH_DENORM_ERROR_POLICY) << std::endl;   std::cout << "BOOST_MATH_EVALUATION_ERROR_POLICY      " << BOOST_STRINGIZE(BOOST_MATH_EVALUATION_ERROR_POLICY) << std::endl;   std::cout << "BOOST_MATH_DIGITS10_POLICY              " << BOOST_STRINGIZE(BOOST_MATH_DIGITS10_POLICY) << std::endl;   std::cout << "BOOST_MATH_PROMOTE_FLOAT_POLICY         " << BOOST_STRINGIZE(BOOST_MATH_PROMOTE_FLOAT_POLICY) << std::endl;   std::cout << "BOOST_MATH_PROMOTE_DOUBLE_POLICY        " << BOOST_STRINGIZE(BOOST_MATH_PROMOTE_DOUBLE_POLICY) << std::endl;   std::cout << "BOOST_MATH_DISCRETE_QUANTILE_POLICY     " << BOOST_STRINGIZE(BOOST_MATH_DISCRETE_QUANTILE_POLICY) << std::endl;   std::cout << "BOOST_MATH_ASSERT_UNDEFINED_POLICY      " << BOOST_STRINGIZE(BOOST_MATH_ASSERT_UNDEFINED_POLICY) << std::endl;   std::cout << "BOOST_MATH_MAX_SERIES_ITERATION_POLICY  " << BOOST_STRINGIZE(BOOST_MATH_MAX_SERIES_ITERATION_POLICY) << std::endl;   std::cout << "BOOST_MATH_MAX_ROOT_ITERATION_POLICY    " << BOOST_STRINGIZE(BOOST_MATH_MAX_ROOT_ITERATION_POLICY) << std::endl;}int main(int argc, const char** argv){   try{#ifdef TEST_GSL   gsl_set_error_handler_off();#endif   if(argc >= 2)   {      for(int i = 1; i < argc; ++i)      {         if(std::strcmp(argv[i], "--help") == 0)         {            show_help();         }         else if(std::strcmp(argv[i], "--tune") == 0)         {            print_current_config();            add_named_test("Polynomial-method-0");            add_named_test("Polynomial-method-1");            add_named_test("Polynomial-method-2");            add_named_test("Polynomial-method-3");            add_named_test("Polynomial-mixed-method-0");            add_named_test("Polynomial-mixed-method-1");            add_named_test("Polynomial-mixed-method-2");            add_named_test("Polynomial-mixed-method-3");            add_named_test("Rational-method-0");            add_named_test("Rational-method-1");            add_named_test("Rational-method-2");            add_named_test("Rational-method-3");            add_named_test("Rational-mixed-method-0");            add_named_test("Rational-mixed-method-1");            add_named_test("Rational-mixed-method-2");            add_named_test("Rational-mixed-method-3");         }         else if(std::strcmp(argv[i], "--all") == 0)         {            print_current_config();            std::set<test_info>::const_iterator a(all_tests().begin()), b(all_tests().end());            while(a != b)            {               tests.insert(*a);               ++a;            }         }         else         {            bool found = false;            if((argv[i][0] == '-') && (argv[i][1] == '-'))            {               found = add_named_test(argv[i] + 2);            }            if(!found)            {               std::cerr << "Unknown option: " << argv[i] << std::endl;               show_help();               return 1;            }         }      }      run_tests();   }   else   {      show_help();   }   //   // This is just to confuse the optimisers:   //   if(argc == 100000)   {      std::cerr << total << std::endl;   }   }   catch(const std::exception& e)   {      std::cerr << e.what() << std::endl;   }   return 0;}void consume_result(double x){   // Do nothing proceedure, don't let whole program optimisation   // optimise this away - doing so may cause false readings....   total += x;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -