2019-04-25 12:11:43 +00:00
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
# ifndef SUPPORT_FP_COMPARE_H
# define SUPPORT_FP_COMPARE_H
# include <cmath> // for std::abs
# include <algorithm> // for std::max
# include <cassert>
// See https://www.boost.org/doc/libs/1_70_0/libs/test/doc/html/boost_test/testing_tools/extended_comparison/floating_point/floating_points_comparison_theory.html
template < typename T >
bool fptest_close ( T val , T expected , T eps )
{
2022-08-18 17:41:13 -04:00
constexpr T zero = T ( 0 ) ;
assert ( eps > = zero ) ;
2019-04-25 12:11:43 +00:00
2022-08-18 17:41:13 -04:00
// Handle the zero cases
if ( eps = = zero ) return val = = expected ;
if ( val = = zero ) return std : : abs ( expected ) < = eps ;
if ( expected = = zero ) return std : : abs ( val ) < = eps ;
2019-04-25 12:11:43 +00:00
2022-08-18 17:41:13 -04:00
return std : : abs ( val - expected ) < eps
& & std : : abs ( val - expected ) / std : : abs ( val ) < eps ;
2019-04-25 12:11:43 +00:00
}
template < typename T >
bool fptest_close_pct ( T val , T expected , T percent )
{
2022-08-18 17:41:13 -04:00
constexpr T zero = T ( 0 ) ;
assert ( percent > = zero ) ;
2019-04-25 12:11:43 +00:00
2022-08-18 17:41:13 -04:00
// Handle the zero cases
if ( percent = = zero ) return val = = expected ;
T eps = ( percent / T ( 100 ) ) * std : : max ( std : : abs ( val ) , std : : abs ( expected ) ) ;
2019-04-25 12:11:43 +00:00
2022-08-18 17:41:13 -04:00
return fptest_close ( val , expected , eps ) ;
2019-04-25 12:11:43 +00:00
}
# endif // SUPPORT_FP_COMPARE_H