1 #include "math_data_test.h" 2 ConvertDoubleToBiased(const double & value)3uint64_t ConvertDoubleToBiased(const double& value) 4 { 5 DoubleShape u; 6 u.value = value; 7 if (u.bits.sign) { 8 return ~u.sign_magnitude + 1; 9 } else { 10 u.bits.sign = 1; 11 return u.sign_magnitude; 12 } 13 } 14 DoubleUlpCmp(double expected,double actual,uint64_t ulp)15bool DoubleUlpCmp(double expected, double actual, uint64_t ulp) 16 { 17 if (!isnan(expected) && !isnan(actual)) { 18 uint64_t value_diff = ConvertDoubleToBiased(expected) >= ConvertDoubleToBiased(actual) ? 19 (ConvertDoubleToBiased(expected) - ConvertDoubleToBiased(actual)) : 20 (ConvertDoubleToBiased(actual) - ConvertDoubleToBiased(expected)); 21 return value_diff <= ulp; 22 } 23 return false; 24 } 25 ConvertFloatToBiased(const float & value)26uint32_t ConvertFloatToBiased(const float& value) 27 { 28 FloatShape u; 29 u.value = value; 30 if (u.bits.sign) { 31 return ~u.sign_magnitude + 1; 32 } else { 33 u.bits.sign = 1; 34 return u.sign_magnitude; 35 } 36 } FloatUlpCmp(float expected,float actual,uint32_t ulp)37bool FloatUlpCmp(float expected, float actual, uint32_t ulp) 38 { 39 if (!isnan(expected) && !isnan(actual)) { 40 uint32_t value_diff = ConvertFloatToBiased(expected) >= ConvertFloatToBiased(actual) ? 41 (ConvertFloatToBiased(expected) - ConvertFloatToBiased(actual)) : 42 (ConvertFloatToBiased(actual) - ConvertFloatToBiased(expected)); 43 return value_diff <= ulp; 44 } 45 return false; 46 }