20260829 Redesign

This commit is contained in:
2026-08-29 00:53:40 +08:00
parent f9345bdc0a
commit bf5fc3bda6
44 changed files with 2941 additions and 1 deletions
+1
View File
@@ -0,0 +1 @@
#include <c_float.h>
+164
View File
@@ -0,0 +1,164 @@
#ifndef INCLUDED_C_FLOAT_H
#define INCLUDED_C_FLOAT_H
#ifndef INCLUDED_FLOAT_H
#define INCLUDED_FLOAT_H
#include <float.h>
#endif /*INCLUDED_FLOAT_H*/
#ifndef INCLUDED_STDINT_H
#define INCLUDED_STDINT_H
#include <stdint.h>
#endif /*INCLUDED_STDINT_H*/
#ifndef INCLUDED_MATH_H
#define INCLUDED_MATH_H
#include <math.h>
#endif /*INCLUDED_MATH_H*/
#ifndef INCLUDED_C_COMPILER_H
#include <c_Compiler.h>
#endif /*INCLUDED_C_COMPILER_H*/
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
typedef union {
float f;
uint32_t u;
struct {
uint32_t sign: 1;
uint32_t exponent: 8;
uint32_t mantissa: 23;
}IEEE754;
}c_Float_t;
typedef union {
double d;
uint64_t u;
struct {
uint64_t sign: 1;
uint64_t exponent: 11;
uint64_t mantissa: 52;
};
}c_Double_t;
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
C_STATIC_FORCE_INLINE
int c_float_is_eq(const float a, const float b) {
return fabsf(a - b) < FLT_EPSILON;
}
C_STATIC_FORCE_INLINE
int c_float_is_gt(const float a, const float b) {
return (a - b) > FLT_EPSILON;
}
C_STATIC_FORCE_INLINE
int c_float_is_ge(const float a, const float b) {
return (a - b) >= -FLT_EPSILON;
}
C_STATIC_FORCE_INLINE
int c_float_cmp_safe(const float fa, const float fb) {
int nan_a = isnan(fa);
int nan_b = isnan(fb);
if (C_UNLIKELY(nan_a || nan_b)) {
if (nan_a && nan_b) return 0;
if (nan_a) return 1;
return -1;
}
if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;
}
/* ------------------------------------------------------------------------------------------------------------------ */
/* double */
C_STATIC_FORCE_INLINE
int c_double_is_eq(const double a, const double b) {
return fabs(a - b) < DBL_EPSILON;
}
C_STATIC_FORCE_INLINE
int c_double_is_gt(const double a, const double b) {
return (a - b) > DBL_EPSILON;
}
C_STATIC_FORCE_INLINE
int c_double_is_ge(const double a, const double b) {
return (a - b) >= -DBL_EPSILON;
}
C_STATIC_FORCE_INLINE
int c_double_cmp_safe(const double da, const double db) {
int nan_a = isnan(da);
int nan_b = isnan(db);
/* --- 1. 处理 NaN 的极端分支 --- */
/* 采用 C_UNLIKELY 优化,因为大部分待排数据中 NaN 是极少数,提示 CPU 预读正常分支 */
if (C_UNLIKELY(nan_a || nan_b)) {
if (nan_a && nan_b) return 0; /* 两个都是 NaN,视为相等 */
if (nan_a) return 1; /* a 是 NaNb 是正常数,视为 a > b(NaN排到最后) */
return -1; /* a 是正常数,b 是 NaN,视为 a < b */
}
/* --- 2. 正常数值的三向比较分支 --- */
if (da < db) return -1;
if (da > db) return 1;
return 0;
}
/* ------------------------------------------------------------------------------------------------------------------ */
/* */
C_STATIC_FORCE_INLINE
int c_float_ptr_cmp_safe(const void* a, const void* b) {
float fa = *(const float*)a;
float fb = *(const float*)b;
int nan_a = isnan(fa);
int nan_b = isnan(fb);
if (C_UNLIKELY(nan_a || nan_b)) {
if (nan_a && nan_b) return 0;
if (nan_a) return 1;
return -1;
}
if (fa < fb) return -1;
if (fa > fb) return 1;
return 0;
}
C_STATIC_FORCE_INLINE
int c_double_ptr_cmp_safe(const void* a, const void* b) {
double da = *(const double*)a;
double db = *(const double*)b;
int nan_a = isnan(da);
int nan_b = isnan(db);
/* --- 1. 处理 NaN 的极端分支 --- */
/* 采用 C_UNLIKELY 优化,因为大部分待排数据中 NaN 是极少数,提示 CPU 预读正常分支 */
if (C_UNLIKELY(nan_a || nan_b)) {
if (nan_a && nan_b) return 0; /* 两个都是 NaN,视为相等 */
if (nan_a) return 1; /* a 是 NaNb 是正常数,视为 a > b(NaN排到最后) */
return -1; /* a 是正常数,b 是 NaN,视为 a < b */
}
/* --- 2. 正常数值的三向比较分支 --- */
if (da < db) return -1;
if (da > db) return 1;
return 0;
}
#endif /*INCLUDED_C_FLOAT_H*/
+23
View File
@@ -0,0 +1,23 @@
#include "c_float.h"
#include <stdlib.h>
#include <stdio.h>
static void c_Double_print(c_Double_t value) {
uint64_t sign = value.sign;
uint64_t exponent = value.exponent;
uint64_t fraction = value.mantissa;
printf("数值: %.15f\n", value.d);
printf("整体十六进制: 0x%016llX\n", (unsigned long long)value.u);
printf("符号位 (Sign): %llu (%s)\n", (unsigned long long)sign, sign ? "" : "");
printf("指数位 (Exponent 原始值): %llu (实际 2 阶: %d)\n",
(unsigned long long)exponent, (int)exponent - 1023);
printf("尾数位 (Fraction 16进制): 0x%013llX\n", (unsigned long long)fraction);
printf("---------------------------------------\n");
}
int main(int argc, char** argv){
c_Double_t d={.d=1.0f};
c_Double_print(d);
return 0;
}