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
//
//===----------------------------------------------------------------------===//
2022-11-25 10:25:10 -05:00
2019-04-25 12:11:43 +00:00
# ifndef SUPPORT_FP_COMPARE_H
# define SUPPORT_FP_COMPARE_H
2024-08-05 20:08:47 +00:00
# include <algorithm> // for std::max
2019-04-25 12:11:43 +00:00
# include <cassert>
2024-08-26 17:52:33 -04:00
# include <cmath> // for std::abs
# include "test_macros.h"
2019-04-25 12:11:43 +00:00
// 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
2024-08-05 20:08:47 +00:00
template < typename T >
bool fptest_close ( T val , T expected , T eps ) {
2024-08-26 17:52:33 -04:00
TEST_CONSTEXPR T zero = T ( 0 ) ;
2024-08-05 20:08:47 +00:00
assert ( eps > = zero ) ;
2019-04-25 12:11:43 +00:00
2024-08-05 20:08:47 +00: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
2024-08-05 20:08:47 +00:00
return std : : abs ( val - expected ) < eps & & std : : abs ( val - expected ) / std : : abs ( val ) < eps ;
2019-04-25 12:11:43 +00:00
}
2024-08-05 20:08:47 +00:00
template < typename T >
bool fptest_close_pct ( T val , T expected , T percent ) {
assert ( percent > = T ( 0 ) ) ;
T eps = ( percent / T ( 100 ) ) * std : : max ( std : : abs ( val ) , std : : abs ( expected ) ) ;
return fptest_close ( val , expected , eps ) ;
2019-04-25 12:11:43 +00:00
}
# endif // SUPPORT_FP_COMPARE_H