#ifndef _GEOMETRY_BASIS_H_ #define _GEOMETRY_BASIS_H_ #define FP32_EPSYLON_EFFECTIVENESS_LIMIT 10.0f #define FP32_EPSYLON 5E-7f #define FP32_TWO_EPSYLON 1E-6f #define FP32_SQUARE_EPSYLON 2.5E-13f #define FP32_ONE_THIRD 0.333333333f #define FP32_ONE_SIXTH 0.166666667f #define FP32_ONE_NINETH 0.111111111f #define FP32_GOLDEN_RATIO_HIGH 1.618034f #define FP32_GOLDEN_RATIO_LOW 0.618034f #define FP64_EPSYLON_EFFECTIVENESS_LIMIT 10.0 #define FP64_EPSYLON 5E-14 #define FP64_TWO_EPSYLON 1E-13 #define FP64_SQUARE_EPSYLON 2.5E-27 #define FP64_ONE_THIRD 0.333333333333333333 #define FP64_ONE_SIXTH 0.166666666666666667 #define FP64_ONE_NINETH 0.111111111111111111 #define FP64_GOLDEN_RATIO_HIGH 1.61803398874989485 #define FP64_GOLDEN_RATIO_LOW 0.61803398874989485 inline int fp32_are_equal(const float value1, const float value2) { if (-FP32_EPSYLON_EFFECTIVENESS_LIMIT < value1 && value1 < FP32_EPSYLON_EFFECTIVENESS_LIMIT) { return -FP32_EPSYLON <= (value1 - value2) && (value1 - value2) <= FP32_EPSYLON; } if (value1 < 0.0f) { return (1.0f + FP32_EPSYLON) * value2 <= value1 && (1.0f + FP32_EPSYLON) * value1 <= value2; } return value2 <= value1 * (1.0f + FP32_EPSYLON) && value1 <= value2 * (1.0f + FP32_EPSYLON); } inline int fp64_are_equal(const double value1, const double value2) { if (-FP64_EPSYLON_EFFECTIVENESS_LIMIT < value1 && value1 < FP64_EPSYLON_EFFECTIVENESS_LIMIT) { return -FP64_EPSYLON <= (value1 - value2) && (value1 - value2) <= FP64_EPSYLON; } if (value1 < 0.0) { return (1.0 + FP64_EPSYLON) * value2 <= value1 && (1.0 + FP64_EPSYLON) * value1 <= value2; } return value2 <= value1 * (1.0 + FP64_EPSYLON) && value1 <= value2 * (1.0 + FP64_EPSYLON); } #endif