From 2da00e7daae9a39654a70317783d865cd6bff70d Mon Sep 17 00:00:00 2001 From: mrdudz Date: Mon, 28 Aug 2023 02:01:56 +0200 Subject: [PATCH] fix output for negative numbers --- libsrc/float/softfloat/softloat-ftostr.c | 73 +++++++++++++++++++----- 1 file changed, 59 insertions(+), 14 deletions(-) diff --git a/libsrc/float/softfloat/softloat-ftostr.c b/libsrc/float/softfloat/softloat-ftostr.c index 203a2c21d..2479005e3 100644 --- a/libsrc/float/softfloat/softloat-ftostr.c +++ b/libsrc/float/softfloat/softloat-ftostr.c @@ -2,6 +2,10 @@ #include #include +//#define DEBUG_VALUE + +// This is really a terrible function that should get completely rewritten and +// tested by someone who knows what he is doing =P char *_ftostr(char *buffer, float f) { signed long intpart; float fracpart; @@ -12,42 +16,83 @@ char *_ftostr(char *buffer, float f) { is_negative = (raw_value & 0x80000000) ? 1 : 0; // very hacky indeed - intpart = (signed long)(f); + if (!is_negative) { + intpart = (signed long)(f); + } else { + intpart = (signed long)(f); + intpart = -intpart; + } f2 = intpart; +#if 0 + if (!is_negative) { + if (f2 > f) { + if (intpart > 0) { + --intpart; + } + } + } else { + if (f2 > f) { + if (intpart > 0) { + --intpart; + } + } +// ++intpart; + } - if (f2 > f) { - if (intpart > 0) { - --intpart; + if (!is_negative) { + if (intpart < 0) { + intpart *= -1; + } + } else { + if (intpart < 0) { + intpart *= -1; } } - - if (intpart < 0) { - intpart *= -1; - } - +#endif f2 = intpart; - fracpart = f - f2; + if (!is_negative) { + fracpart = f - f2; + } else { + fracpart = (-f) - f2; + } f1 = 10000.0f; f1 = f1 * fracpart; n0 = (signed long)f1; +#if 0 + // caution: make sure fracpart can never be negative if (n0 < 0) { n0 *= -1; } +#endif // printf("n0:%ld\n",n0); +#ifdef DEBUG_VALUE if (n0 >= 1000) { sprintf(buffer, "<0x%08lx:%s%ld.%ld>", raw_value, is_negative ? "-" : "", intpart, n0); } else if (n0 >= 100) { - sprintf(buffer, "<0x%08lx:%s%ld.0%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0); + sprintf(buffer, "<0x%08lx:%s%ld.0%ld>", raw_value, is_negative ? "-" : "", intpart, n0); } else if (n0 >= 10) { - sprintf(buffer, "<0x%08lx:%s%ld.00%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0); + sprintf(buffer, "<0x%08lx:%s%ld.00%ld>", raw_value, is_negative ? "-" : "", intpart, n0); } else if (n0 >= 1) { - sprintf(buffer, "<0x%08lx:%s%ld.000%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0); + sprintf(buffer, "<0x%08lx:%s%ld.000%ld>", raw_value, is_negative ? "-" : "", intpart, n0); } else { - sprintf(buffer, "<0x%08lx:%s%ld.0000%ld>", *((unsigned long*)(&f)), is_negative ? "-" : "", intpart, n0); + sprintf(buffer, "<0x%08lx:%s%ld.0000>", raw_value, is_negative ? "-" : "", intpart); } +#else + if (n0 >= 1000) { + sprintf(buffer, "%s%ld.%ld", is_negative ? "-" : "", intpart, n0); + } else if (n0 >= 100) { + sprintf(buffer, "%s%ld.0%ld", is_negative ? "-" : "", intpart, n0); + } else if (n0 >= 10) { + sprintf(buffer, "%s%ld.00%ld", is_negative ? "-" : "", intpart, n0); + } else if (n0 >= 1) { + sprintf(buffer, "%s%ld.000%ld", is_negative ? "-" : "", intpart, n0); + } else { + sprintf(buffer, "%s%ld.0000", is_negative ? "-" : "", intpart); + } +#endif return &buffer[0]; }