This commit is contained in:
2026-05-19 11:49:22 +08:00
commit add7af4222
96 changed files with 8635 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
#ifndef INCLUDED_IEEE_FLOAT_H
#define INCLUDED_IEEE_FLOAT_H
#ifndef INCLUDED_STDINT_H
#define INCLUDED_STDINT_H
#include <stdint.h>
#endif /*INCLUDED_STDINT_H*/
#ifndef INCLUDED_FLOAT_H
#define INCLUDED_FLOAT_H
#include <float.h>
#endif /*INCLUDED_FLOAT_H*/
#ifndef INCLUDED_STDBOOL_H
#define INCLUDED_STDBOOL_H
#include <stdbool.h>
#endif /*INCLUDED_STDBOOL_H*/
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
typedef struct {
union{
struct{
uint32_t sign:1;
uint32_t exponent:8;
uint32_t mantissa:23;
}IEEE754;
uint32_t uint;
float f;
}value;
}ieee_float_t;
typedef struct {
union{
struct{
uint64_t sign:1;
uint64_t exponent:11;
uint64_t mantissa:52;
}IEEE754;
uint64_t uint;
double f;
}value;
}ieee_double_t;
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
#define IEEE_FLOAT_POSITIVE_INFINITY (1.0f/0.0f)
#define IEEE_FLOAT_NEGATIVE_INFINITY (-1.0f/0.0f)
#define IEEE_FLOAT_NAN (0.0f/0.0f)
#define IEEE_FLOAT_EPSILON (FLT_EPSILON)
#define IEEE_DOUBLE_EPSILON (DBL_EPSILON)
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
int ieee_float_cmp(const float a, const float b, const float maxDiff);
int ieee_double_cmp(const double a, const double b, const double maxDiff);
// 当将 float 看作 uint32 时进行比较,maxUlpsDiff 就是作为无符号整数允许的最大差异,一般取 `1` 就可以
// maxFloatDiff 一般取 IEEE_FLOAT_EPSILON, 是将数值作为 float 进行比较,但是如果两个 float 无法完成比较,就可以通过
// 无符号整数的形式来进行比较
int ieee_float_UlpsCmp(const float a, const float b, const float maxFloatDiff, const int maxUlpsDiff);
int ieee_double_UlpsCmp(const double a, const double b, const double maxFloatDiff, const int maxUlpsDiff);
bool ieee_float_is_zero(const float a, const float maxDiff);
bool ieee_double_is_zero(const double a, const double maxDiff);
#endif /*INCLUDED_IEEE_FLOAT_H*/