bgc-c/basic-geometry/basis.h

56 lines
1.7 KiB
C

#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