bgc-c/basic-geometry/basis.h

56 lines
1.8 KiB
C

#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