#ifndef __GEOMETRY__TYPES_H_ #define __GEOMETRY__TYPES_H_ #define BG_FP32_EPSYLON_EFFECTIVENESS_LIMIT 10.0f #define BG_FP32_EPSYLON 5E-7f #define BG_FP32_TWO_EPSYLON 1E-6f #define BG_FP32_SQUARE_EPSYLON 2.5E-13f #define BG_FP32_ONE_THIRD 0.333333333f #define BG_FP32_ONE_SIXTH 0.166666667f #define BG_FP32_ONE_NINETH 0.111111111f #define BG_FP32_GOLDEN_RATIO_HIGH 1.618034f #define BG_FP32_GOLDEN_RATIO_LOW 0.618034f #define BG_FP64_EPSYLON_EFFECTIVENESS_LIMIT 10.0 #define BG_FP64_EPSYLON 5E-14 #define BG_FP64_TWO_EPSYLON 1E-13 #define BG_FP64_SQUARE_EPSYLON 2.5E-27 #define BG_FP64_ONE_THIRD 0.333333333333333333 #define BG_FP64_ONE_SIXTH 0.166666666666666667 #define BG_FP64_ONE_NINETH 0.111111111111111111 #define BG_FP64_GOLDEN_RATIO_HIGH 1.61803398874989485 #define BG_FP64_GOLDEN_RATIO_LOW 0.61803398874989485 static inline int bg_fp32_are_equal(const float value1, const float value2) { if (-BG_FP32_EPSYLON_EFFECTIVENESS_LIMIT < value1 && value1 < BG_FP32_EPSYLON_EFFECTIVENESS_LIMIT) { return -BG_FP32_EPSYLON <= (value1 - value2) && (value1 - value2) <= BG_FP32_EPSYLON; } if (value1 < 0.0f) { return (1.0f + BG_FP32_EPSYLON) * value2 <= value1 && (1.0f + BG_FP32_EPSYLON) * value1 <= value2; } return value2 <= value1 * (1.0f + BG_FP32_EPSYLON) && value1 <= value2 * (1.0f + BG_FP32_EPSYLON); } static inline int bg_fp64_are_equal(const double value1, const double value2) { if (-BG_FP64_EPSYLON_EFFECTIVENESS_LIMIT < value1 && value1 < BG_FP64_EPSYLON_EFFECTIVENESS_LIMIT) { return -BG_FP64_EPSYLON <= (value1 - value2) && (value1 - value2) <= BG_FP64_EPSYLON; } if (value1 < 0.0) { return (1.0 + BG_FP64_EPSYLON) * value2 <= value1 && (1.0 + BG_FP64_EPSYLON) * value1 <= value2; } return value2 <= value1 * (1.0 + BG_FP64_EPSYLON) && value1 <= value2 * (1.0 + BG_FP64_EPSYLON); } #endif