x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
test.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\math\tools\test.hpp
旋转
特效
属性
历史版本
// (C) Copyright John Maddock 2006. // 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) #ifndef BOOST_MATH_TOOLS_TEST_HPP #define BOOST_MATH_TOOLS_TEST_HPP #include
#include
#include
#include
#include
namespace boost{ namespace math{ namespace tools{ template
struct test_result { private: boost::math::tools::stats
stat; // Statistics for the test. unsigned worst_case; // Index of the worst case test. public: test_result() { worst_case = 0; } void set_worst(int i){ worst_case = i; } void add(const T& point){ stat.add(point); } // accessors: unsigned worst()const{ return worst_case; } T min BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return (stat.min)(); } T max BOOST_PREVENT_MACRO_SUBSTITUTION()const{ return (stat.max)(); } T total()const{ return stat.total(); } T mean()const{ return stat.mean(); } boost::uintmax_t count()const{ return stat.count(); } T variance()const{ return stat.variance(); } T variance1()const{ return stat.variance1(); } T rms()const{ return stat.rms(); } test_result& operator+=(const test_result& t) { if((t.stat.max)() > (stat.max)()) worst_case = t.worst_case; stat += t.stat; return *this; } }; template
struct calculate_result_type { typedef typename T::value_type row_type; typedef typename row_type::value_type value_type; }; template
T relative_error(T a, T b) { BOOST_MATH_STD_USING #ifdef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS // // If math.h has no long double support we can't rely // on the math functions generating exponents outside // the range of a double: // T min_val = (std::max)( tools::min_value
(), static_cast
((std::numeric_limits
::min)())); T max_val = (std::min)( tools::max_value
(), static_cast
((std::numeric_limits
::max)())); #else T min_val = tools::min_value
(); T max_val = tools::max_value
(); #endif if((a != 0) && (b != 0)) { // TODO: use isfinite: if(fabs(b) >= max_val) { if(fabs(a) >= max_val) return 0; // one infinity is as good as another! } // If the result is denormalised, treat all denorms as equivalent: if((a < min_val) && (a > 0)) a = min_val; else if((a > -min_val) && (a < 0)) a = -min_val; if((b < min_val) && (b > 0)) b = min_val; else if((b > -min_val) && (b < 0)) b = -min_val; return (std::max)(fabs((a-b)/a), fabs((a-b)/b)); } // Handle special case where one or both are zero: if(min_val == 0) return fabs(a-b); if(fabs(a) < min_val) a = min_val; if(fabs(b) < min_val) b = min_val; return (std::max)(fabs((a-b)/a), fabs((a-b)/b)); } #if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) template <> inline double relative_error
(double a, double b) { BOOST_MATH_STD_USING // // On Mac OS X we evaluate "double" functions at "long double" precision, // but "long double" actually has a very slightly narrower range than "double"! // Therefore use the range of "long double" as our limits since results outside // that range may have been truncated to 0 or INF: // double min_val = (std::max)((double)tools::min_value
(), tools::min_value
()); double max_val = (std::min)((double)tools::max_value
(), tools::max_value
()); if((a != 0) && (b != 0)) { // TODO: use isfinite: if(b > max_val) { if(a > max_val) return 0; // one infinity is as good as another! } // If the result is denormalised, treat all denorms as equivalent: if((a < min_val) && (a > 0)) a = min_val; else if((a > -min_val) && (a < 0)) a = -min_val; if((b < min_val) && (b > 0)) b = min_val; else if((b > -min_val) && (b < 0)) b = -min_val; return (std::max)(fabs((a-b)/a), fabs((a-b)/b)); } // Handle special case where one or both are zero: if(min_val == 0) return fabs(a-b); if(fabs(a) < min_val) a = min_val; if(fabs(b) < min_val) b = min_val; return (std::max)(fabs((a-b)/a), fabs((a-b)/b)); } #endif template
void print_row(const Seq& row) { for(unsigned i = 0; i < row.size(); ++i) { if(i) std::cout << ", "; std::cout << row[i]; } std::cout << std::endl; } // // Function test accepts an matrix of input values (probably a 2D boost::array) // and calls two functors for each row in the array - one calculates a value // to test, and one extracts the expected value from the array (or possibly // calculates it at high precision). The two functors are usually simple lambda // expressions. // template
test_result
::value_type> test(const A& a, F1 test_func, F2 expect_func) { typedef typename A::value_type row_type; typedef typename row_type::value_type value_type; test_result
result; for(unsigned i = 0; i < a.size(); ++i) { const row_type& row = a[i]; value_type point; try { point = test_func(row); } catch(const std::underflow_error&) { point = 0; } catch(const std::overflow_error&) { point = std::numeric_limits
::has_infinity ? std::numeric_limits
::infinity() : tools::max_value
(); } catch(const std::exception& e) { std::cerr << e.what() << std::endl; print_row(row); BOOST_ERROR("Unexpected exception."); // so we don't get further errors: point = expect_func(row); } value_type expected = expect_func(row); value_type err = relative_error(point, expected); #ifdef BOOST_INSTRUMENT if(err != 0) { std::cout << row[0] << " " << err; if(std::numeric_limits
::is_specialized) { std::cout << " (" << err / std::numeric_limits
::epsilon() << "eps)"; } std::cout << std::endl; } #endif if(!(boost::math::isfinite)(point) && (boost::math::isfinite)(expected)) { std::cout << "CAUTION: Found non-finite result, when a finite value was expected at entry " << i << "\n"; std::cout << "Found: " << point << " Expected " << expected << " Error: " << err << std::endl; print_row(row); BOOST_ERROR("Unexpected non-finite result"); } if(err > 0.5) { std::cout << "CAUTION: Gross error found at entry " << i << ".\n"; std::cout << "Found: " << point << " Expected " << expected << " Error: " << err << std::endl; print_row(row); BOOST_ERROR("Gross error"); } result.add(err); if((result.max)() == err) result.set_worst(i); } return result; } } // namespace tools } // namespace math } // namespace boost #endif
test.hpp
网页地址
文件地址
上一页
14/19
下一页
下载
( 7 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.