mirror of
https://github.com/ThrowTheSwitch/Unity.git
synced 2025-06-25 18:57:58 +08:00
Refactor printing after the decimal point, signed types, small numbers...
Change some types to signed for simpler code and speed Added format to distinguish small numbers
This commit is contained in:
55
src/unity.c
55
src/unity.c
@ -251,6 +251,17 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number)
|
|||||||
|
|
||||||
/*-----------------------------------------------*/
|
/*-----------------------------------------------*/
|
||||||
#ifdef UNITY_FLOAT_VERBOSE
|
#ifdef UNITY_FLOAT_VERBOSE
|
||||||
|
static void UnityPrintDecimalAndNumberWithLeadingZeros(_US32 fraction_part, _US32 divisor)
|
||||||
|
{
|
||||||
|
UNITY_OUTPUT_CHAR('.');
|
||||||
|
while (divisor > 0)
|
||||||
|
{
|
||||||
|
UNITY_OUTPUT_CHAR('0' + fraction_part / divisor);
|
||||||
|
fraction_part %= divisor;
|
||||||
|
divisor /= 10;
|
||||||
|
if (fraction_part == 0) break; /* Truncate trailing 0's */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* char buffer[19];
|
* char buffer[19];
|
||||||
@ -270,60 +281,46 @@ void UnityPrintFloat(_UD number)
|
|||||||
|
|
||||||
if (isnan(number)) UnityPrint(UnityStrNaN);
|
if (isnan(number)) UnityPrint(UnityStrNaN);
|
||||||
else if (isinf(number)) UnityPrintLen(UnityStrInf, 3);
|
else if (isinf(number)) UnityPrintLen(UnityStrInf, 3);
|
||||||
else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small number format */
|
else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small numbers */
|
||||||
else if (number < 4294967296.0f) /* Fits in an integer */
|
else if (number < 4294967296.0f) /* Rounded result fits in 32 bits, "%.6f" format */
|
||||||
{
|
{
|
||||||
|
_US32 divisor = (1000000/10);
|
||||||
_UU32 integer_part = (_UU32)number;
|
_UU32 integer_part = (_UU32)number;
|
||||||
_UD fraction_part = number - integer_part;
|
_US32 fraction_part = (_US32)((number - integer_part)*1000000.0 + 0.5);
|
||||||
|
|
||||||
_U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0 + 0.5);
|
|
||||||
/* Double precision calculation gives best performance for six rounded decimal places */
|
/* Double precision calculation gives best performance for six rounded decimal places */
|
||||||
|
|
||||||
if (fraction_bits == 1000000)
|
if (fraction_part == 1000000)
|
||||||
{
|
{
|
||||||
fraction_bits = 0;
|
fraction_part = 0;
|
||||||
integer_part += 1;
|
integer_part += 1;
|
||||||
}
|
}
|
||||||
_U_UINT divisor = 100000;
|
|
||||||
|
|
||||||
UnityPrintNumberUnsigned(integer_part);
|
UnityPrintNumberUnsigned(integer_part);
|
||||||
UNITY_OUTPUT_CHAR('.');
|
UnityPrintDecimalAndNumberWithLeadingZeros(fraction_part, divisor);
|
||||||
/* now mod and print, then divide divisor */
|
|
||||||
do
|
|
||||||
{
|
|
||||||
UNITY_OUTPUT_CHAR((char)('0' + (fraction_bits / divisor)));
|
|
||||||
fraction_bits %= divisor;
|
|
||||||
if (fraction_bits == 0) break; // Truncate trailing 0's
|
|
||||||
divisor /= 10;
|
|
||||||
} while (divisor > 0);
|
|
||||||
}
|
}
|
||||||
else /* Won't fit in an integer type */
|
else /* Number is larger, use exponential format of 9 digits, "%.8e" */
|
||||||
{
|
{
|
||||||
_UU32 integer_part;
|
_US32 divisor = (1000000000/10);
|
||||||
|
_US32 integer_part;
|
||||||
double divide = 10.0;
|
double divide = 10.0;
|
||||||
_U_UINT exponent = 9;
|
int exponent = 9;
|
||||||
|
|
||||||
while (number / divide >= 1000000000.0)
|
while (number / divide >= 1000000000.0)
|
||||||
{
|
{
|
||||||
divide *= 10;
|
divide *= 10;
|
||||||
exponent++;
|
exponent++;
|
||||||
}
|
}
|
||||||
integer_part = (_UU32)(number / divide + 0.5);
|
integer_part = (_US32)(number / divide + 0.5);
|
||||||
/* Double precision calculation required for float, to produce 9 rounded digits */
|
/* Double precision calculation required for float, to produce 9 rounded digits */
|
||||||
|
|
||||||
_UU32 divisor = 100000000;
|
UNITY_OUTPUT_CHAR('0' + integer_part / divisor);
|
||||||
do
|
|
||||||
{
|
|
||||||
UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor)));
|
|
||||||
|
|
||||||
integer_part %= divisor;
|
integer_part %= divisor;
|
||||||
divisor /= 10;
|
divisor /= 10;
|
||||||
if (divisor == 10000000) UNITY_OUTPUT_CHAR('.');
|
UnityPrintDecimalAndNumberWithLeadingZeros(integer_part, divisor);
|
||||||
} while (divisor > 0);
|
|
||||||
UNITY_OUTPUT_CHAR('e');
|
UNITY_OUTPUT_CHAR('e');
|
||||||
UNITY_OUTPUT_CHAR('+');
|
UNITY_OUTPUT_CHAR('+');
|
||||||
if (exponent < 10) UNITY_OUTPUT_CHAR('0');
|
if (exponent < 10) UNITY_OUTPUT_CHAR('0');
|
||||||
UnityPrintNumberUnsigned(exponent);
|
UnityPrintNumber(exponent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif /* UNITY_FLOAT_VERBOSE */
|
#endif /* UNITY_FLOAT_VERBOSE */
|
||||||
|
Reference in New Issue
Block a user