#ifndef _BGC_UTILITIES_H_INCLUDED_ #define _BGC_UTILITIES_H_INCLUDED_ #define BGC_FP32_EPSILON_EFFECTIVENESS_LIMIT 1.0f #define BGC_FP32_EPSILON 4.76837E-7f #define BGC_FP32_SQUARE_EPSILON (BGC_FP32_EPSILON * BGC_FP32_EPSILON) #define BGC_FP32_ONE_THIRD 0.3333333333f #define BGC_FP32_ONE_SIXTH 0.1666666667f #define BGC_FP32_ONE_SEVENTH 0.142857142857f #define BGC_FP32_ONE_NINETH 0.1111111111f #define BGC_FP32_GOLDEN_RATIO_HIGH 1.618034f #define BGC_FP32_GOLDEN_RATIO_LOW 0.618034f #define BGC_FP64_EPSILON_EFFECTIVENESS_LIMIT 1.0 #define BGC_FP64_EPSILON 4.996003611E-14 #define BGC_FP64_SQUARE_EPSILON (BGC_FP64_EPSILON * BGC_FP64_EPSILON) #define BGC_FP64_ONE_THIRD 0.3333333333333333333 #define BGC_FP64_ONE_SIXTH 0.1666666666666666667 #define BGC_FP64_ONE_SEVENTH 0.142857142857142857 #define BGC_FP64_ONE_NINETH 0.1111111111111111111 #define BGC_FP64_GOLDEN_RATIO_HIGH 1.61803398874989485 #define BGC_FP64_GOLDEN_RATIO_LOW 0.61803398874989485 #define BGC_SUCCESS 0 #define BGC_FAILED -1 #define BGC_ATTITUDE_ANY 0 #define BGC_ATTITUDE_ZERO 1 #define BGC_ATTITUDE_ORTHOGONAL 2 #define BGC_ATTITUDE_CO_DIRECTIONAL 3 #define BGC_ATTITUDE_COUNTER_DIRECTIONAL 4 #define BGC_AXIS_X1 1 #define BGC_AXIS_X2 2 #define BGC_AXIS_X3 3 #define BGC_AXIS_REVERSE_X1 -1 #define BGC_AXIS_REVERSE_X2 -2 #define BGC_AXIS_REVERSE_X3 -3 inline int bgc_is_correct_axis(const int axis) { return axis == BGC_AXIS_X1 || axis == BGC_AXIS_REVERSE_X1 || axis == BGC_AXIS_X2 || axis == BGC_AXIS_REVERSE_X2 || axis == BGC_AXIS_X3 || axis == BGC_AXIS_REVERSE_X3; } inline int bgc_fp32_is_zero(const float value) { return (-BGC_FP32_EPSILON <= value) && (value <= BGC_FP32_EPSILON); } inline int bgc_fp64_is_zero(const double value) { return (-BGC_FP64_EPSILON <= value) && (value <= BGC_FP64_EPSILON); } inline int bgc_fp32_is_unit(const float value) { return (1.0f - BGC_FP32_EPSILON <= value) && (value <= 1.0f + BGC_FP32_EPSILON); } inline int bgc_fp64_is_unit(const double value) { return (1.0 - BGC_FP64_EPSILON <= value) && (value <= 1.0 + BGC_FP64_EPSILON); } inline int bgc_fp32_is_square_unit(const float square_value) { return (1.0f - 2.0f * BGC_FP32_EPSILON <= square_value) && (square_value <= 1.0f + 2.0f * BGC_FP32_EPSILON); } inline int bgc_fp64_is_square_unit(const double square_value) { return (1.0 - 2.0 * BGC_FP64_EPSILON <= square_value) && (square_value <= 1.0 + 2.0 * BGC_FP64_EPSILON); } // ================== Are Close ================= // inline int bgc_fp32_are_close(const float value1, const float value2) { const float difference = value1 - value2; const float square_value1 = value1 * value1; const float square_value2 = value2 * value2; const float square_difference = difference * difference; if (square_value1 <= BGC_FP32_EPSILON_EFFECTIVENESS_LIMIT || square_value2 <= BGC_FP32_EPSILON_EFFECTIVENESS_LIMIT) { return square_difference <= BGC_FP32_SQUARE_EPSILON; } return square_difference <= BGC_FP32_SQUARE_EPSILON * square_value1 && square_difference <= BGC_FP32_SQUARE_EPSILON * square_value2; } inline int bgc_fp64_are_close(const double value1, const double value2) { const double difference = value1 - value2; const double square_value1 = value1 * value1; const double square_value2 = value2 * value2; const double square_difference = difference * difference; if (square_value1 <= BGC_FP64_EPSILON_EFFECTIVENESS_LIMIT || square_value2 <= BGC_FP64_EPSILON_EFFECTIVENESS_LIMIT) { return square_difference <= BGC_FP64_SQUARE_EPSILON; } return square_difference <= BGC_FP64_SQUARE_EPSILON * square_value1 && square_difference <= BGC_FP64_SQUARE_EPSILON * square_value2; } #endif