From c5e1a42eb7eeb8720a4942801798fae20748976a Mon Sep 17 00:00:00 2001 From: timerix Date: Fri, 20 Jan 2023 00:24:55 +0600 Subject: [PATCH] fixed float printing errors --- src/base/type_system/base_toString.c | 3 +++ src/kprint/kprint.h | 9 ++++++++- tests/test_kprint.c | 14 +++++++------- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/base/type_system/base_toString.c b/src/base/type_system/base_toString.c index 1ad15cb..0e33986 100644 --- a/src/base/type_system/base_toString.c +++ b/src/base/type_system/base_toString.c @@ -68,6 +68,9 @@ char* toString_uint(uint64 n, bool withPostfix, bool uppercase){ if(precision==0)\ precision=toString_float_default_precision;\ int cn=sprintf(str, "%.*f", precision, n);\ + /* remove trailing zeroes except .0*/\ + while(str[cn-1]=='0' && str[cn-2]!='.')\ + cn--;\ if(withPostfix)\ str[cn++]= uppercase ? 'F' : 'f';\ str[cn]='\0';\ diff --git a/src/kprint/kprint.h b/src/kprint/kprint.h index ab93761..60a7ab0 100644 --- a/src/kprint/kprint.h +++ b/src/kprint/kprint.h @@ -20,7 +20,14 @@ typedef union { float64 f64; void* ptr; } __kp_value_union; -#define __kpVU(value) (__kp_value_union){ value } + + +static inline __kp_value_union __kpVU_f(float64 f) { return (__kp_value_union){ .f64=f }; } +inline __kp_value_union __kpVU_i(int64 f) { return (__kp_value_union){ .i64=f }; } + +#define __kpVU_selectType(V) _Generic(V, float: __kpVU_f, double: __kpVU_f, default: __kpVU_i)(V) + +#define __kpVU(V) __kpVU_selectType(V) #define __kp_argsToFmts8(\ a0, a1, a2, a3, a4, a5, a6, a7,...)\ diff --git a/tests/test_kprint.c b/tests/test_kprint.c index 9e43ee2..587ff59 100644 --- a/tests/test_kprint.c +++ b/tests/test_kprint.c @@ -10,19 +10,19 @@ void test_kprint(){ kp_u|kp_post,-8888, kp_c|kp_post|kp_upper,' ', kp_u,0, kp_c,' ', kp_u,1234567890987654321LL, kp_c,'\n'); //float - kprint(kp_bgGreenD|kp_fgRed| + kprint(kp_fgCyanD| kp_f,-4000.0109f, kp_c,' ', kp_f,-0.000020004f, kp_c,'\n', kp_f,-1.0f, kp_c,' ', kp_f,0.0f, kp_c,' ', kp_f,1.0f, kp_c,'\n', kp_f|kp_post,0.000020004f, kp_c,' ', kp_f|kp_post|kp_upper,4000.0109f, kp_c,'\n'); //double - kprint(kp_bgBlueD|kp_fgRed| + kprint(kp_fgYellowD| kp_f,-4000.0109, kp_c,' ', kp_f,-0.000020004, kp_c,'\n', kp_f,-1.0, kp_c,' ', kp_f,0.0, kp_c,' ', kp_f,1.0, kp_c,'\n', kp_f|kp_post,0.000020004, kp_c,' ', kp_f|kp_post|kp_upper,4000.0109, kp_c,'\n'); //hex - kprint(kp_bgBlack|kp_fgYellow| + kprint(kp_fgYellow| kp_h,0, kp_c,' ', kp_h,1, kp_c,' ', kp_h,-1, kp_c,' ', kp_h,15, kp_c,'\n', kp_h,4095, kp_c,' ', kp_h,-4095, kp_c,'\n', kp_h,1234567890987654321LL, kp_c,'\n', kp_h,-1234567890987654321LL, kp_c,'\n'); @@ -34,12 +34,12 @@ void test_kprint(){ kp_h|kp_pre|kp_upper,-115515.009, kp_c,'\n'); //bin kprint(kp_fgBlue| - kp_b,0, kp_c,' ', kp_b,1, kp_c,' ', kp_b,-1, kp_c,' ', kp_b,15, kp_c,' ', - kp_b,4095, kp_c,' ', kp_b,-4095, kp_c,'\n', + kp_b,0, kp_c,'\n', kp_b,1, kp_c,'\n', kp_b,-1, kp_c,'\n', kp_b,15, kp_c,'\n', + kp_b,4095, kp_c,'\n', kp_b,-4095, kp_c,'\n', kp_b,1234567890987654321LL, kp_c,'\n', kp_b,-1234567890987654321LL, kp_c,'\n'); kprint( - kp_b,-1.0f, kp_c,' ', kp_b,0.0f, kp_c,' ', kp_b,1.0f, kp_c,'\n', - kp_b, 0.00016f, kp_c,' ', kp_b,-115515.009f, kp_c,'\n'); + kp_b,-1.0f, kp_c,'\n', kp_b,0.0f, kp_c,'\n', kp_b,1.0f, kp_c,'\n', + kp_b, 0.00016f, kp_c,'\n', kp_b,-115515.009f, kp_c,'\n'); kprint( kp_b|kp_pre, 0.00016, kp_c,'\n', kp_b|kp_pre|kp_upper,-115515.009, kp_c,'\n');