x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
floating_point_comparison.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\test\floating_point_comparison.hpp
旋转
特效
属性
历史版本
// (C) Copyright Gennadiy Rozental 2001-2007. // Distributed under 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) // See http://www.boost.org/libs/test for the library home page. // // File : $RCSfile$ // // Version : $Revision: 41369 $ // // Description : defines algoirthms for comparing 2 floating point values // *************************************************************************** #ifndef BOOST_TEST_FLOATING_POINT_COMPARISON_HPP_071894GER #define BOOST_TEST_FLOATING_POINT_COMPARISON_HPP_071894GER #include
// for std::numeric_limits #include
#include
//____________________________________________________________________________// namespace boost { namespace test_tools { using unit_test::readonly_property; // ************************************************************************** // // ************** floating_point_comparison_type ************** // // ************************************************************************** // enum floating_point_comparison_type { FPC_STRONG, // "Very close" - equation 1' in docs, the default FPC_WEAK // "Close enough" - equation 2' in docs. }; // ************************************************************************** // // ************** details ************** // // ************************************************************************** // namespace tt_detail { // FPT is Floating-Point Type: float, double, long double or User-Defined. template
inline FPT fpt_abs( FPT arg ) { return arg < static_cast
(0) ? -arg : arg; } //____________________________________________________________________________// template
struct fpt_limits { static FPT min_value() { return std::numeric_limits
::is_specialized ? (std::numeric_limits
::min)() : 0; } static FPT max_value() { return std::numeric_limits
::is_specialized ? (std::numeric_limits
::max)() : static_cast
(1000000); // for the our purpuses it doesn't really matter what value is returned here } }; //____________________________________________________________________________// // both f1 and f2 are unsigned here template
inline FPT safe_fpt_division( FPT f1, FPT f2 ) { // Avoid overflow. if( f2 < static_cast
(1) && f1 > f2*fpt_limits
::max_value() ) return fpt_limits
::max_value(); // Avoid underflow. if( f1 == static_cast
(0) || f2 > static_cast
(1) && f1 < f2*fpt_limits
::min_value() ) return static_cast
(0); return f1/f2; } //____________________________________________________________________________// } // namespace tt_detail // ************************************************************************** // // ************** tolerance presentation types ************** // // ************************************************************************** // template
struct percent_tolerance_t { explicit percent_tolerance_t( FPT v ) : m_value( v ) {} FPT m_value; }; //____________________________________________________________________________// template
Out& operator<<( Out& out, percent_tolerance_t
t ) { return out << t.m_value; } //____________________________________________________________________________// template
inline percent_tolerance_t
percent_tolerance( FPT v ) { return percent_tolerance_t
( v ); } //____________________________________________________________________________// template
struct fraction_tolerance_t { explicit fraction_tolerance_t( FPT v ) : m_value( v ) {} FPT m_value; }; //____________________________________________________________________________// template
Out& operator<<( Out& out, fraction_tolerance_t
t ) { return out << t.m_value; } //____________________________________________________________________________// template
inline fraction_tolerance_t
fraction_tolerance( FPT v ) { return fraction_tolerance_t
( v ); } //____________________________________________________________________________// // ************************************************************************** // // ************** close_at_tolerance ************** // // ************************************************************************** // template
class close_at_tolerance { public: // Public typedefs typedef bool result_type; // Constructor template
explicit close_at_tolerance( percent_tolerance_t
tolerance, floating_point_comparison_type fpc_type = FPC_STRONG ) : p_fraction_tolerance( tt_detail::fpt_abs( static_cast
(0.01)*tolerance.m_value ) ) , p_strong_or_weak( fpc_type == FPC_STRONG ) {} template
explicit close_at_tolerance( fraction_tolerance_t
tolerance, floating_point_comparison_type fpc_type = FPC_STRONG ) : p_fraction_tolerance( tt_detail::fpt_abs( tolerance.m_value ) ) , p_strong_or_weak( fpc_type == FPC_STRONG ) {} bool operator()( FPT left, FPT right ) const { FPT diff = tt_detail::fpt_abs( left - right ); FPT d1 = tt_detail::safe_fpt_division( diff, tt_detail::fpt_abs( right ) ); FPT d2 = tt_detail::safe_fpt_division( diff, tt_detail::fpt_abs( left ) ); return p_strong_or_weak ? (d1 <= p_fraction_tolerance && d2 <= p_fraction_tolerance) : (d1 <= p_fraction_tolerance || d2 <= p_fraction_tolerance); } // Public properties readonly_property
p_fraction_tolerance; readonly_property
p_strong_or_weak; }; //____________________________________________________________________________// // ************************************************************************** // // ************** check_is_close ************** // // ************************************************************************** // struct BOOST_TEST_DECL check_is_close_t { // Public typedefs typedef bool result_type; template
bool operator()( FPT left, FPT right, percent_tolerance_t
tolerance, floating_point_comparison_type fpc_type = FPC_STRONG ) { close_at_tolerance
pred( tolerance, fpc_type ); return pred( left, right ); } template
bool operator()( FPT left, FPT right, fraction_tolerance_t
tolerance, floating_point_comparison_type fpc_type = FPC_STRONG ) { close_at_tolerance
pred( tolerance, fpc_type ); return pred( left, right ); } }; namespace { check_is_close_t check_is_close; } //____________________________________________________________________________// // ************************************************************************** // // ************** check_is_small ************** // // ************************************************************************** // struct BOOST_TEST_DECL check_is_small_t { // Public typedefs typedef bool result_type; template
bool operator()( FPT fpv, FPT tolerance ) { return tt_detail::fpt_abs( fpv ) < tt_detail::fpt_abs( tolerance ); } }; namespace { check_is_small_t check_is_small; } //____________________________________________________________________________// } // namespace test_tools } // namespace boost //____________________________________________________________________________// #include
#endif // BOOST_FLOATING_POINT_COMAPARISON_HPP_071894GER
floating_point_comparison.hpp
网页地址
文件地址
上一页
6/28
下一页
下载
( 8 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.