提交 393f2cb5 编写于 作者: J jsalling

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
上级 2de0e828
......@@ -251,6 +251,17 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number)
/*-----------------------------------------------*/
#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];
......@@ -270,60 +281,46 @@ void UnityPrintFloat(_UD number)
if (isnan(number)) UnityPrint(UnityStrNaN);
else if (isinf(number)) UnityPrintLen(UnityStrInf, 3);
else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small number format */
else if (number < 4294967296.0f) /* Fits in an integer */
else if (number < 0.0000005 && number > 0) UnityPrint("0.000000..."); /* Small numbers */
else if (number < 4294967296.0f) /* Rounded result fits in 32 bits, "%.6f" format */
{
_US32 divisor = (1000000/10);
_UU32 integer_part = (_UU32)number;
_UD fraction_part = number - integer_part;
_U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0 + 0.5);
_US32 fraction_part = (_US32)((number - integer_part)*1000000.0 + 0.5);
/* 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;
}
_U_UINT divisor = 100000;
UnityPrintNumberUnsigned(integer_part);
UNITY_OUTPUT_CHAR('.');
/* 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);
UnityPrintDecimalAndNumberWithLeadingZeros(fraction_part, divisor);
}
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;
_U_UINT exponent = 9;
int exponent = 9;
while (number / divide >= 1000000000.0)
{
divide *= 10;
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 */
_UU32 divisor = 100000000;
do
{
UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor)));
integer_part %= divisor;
divisor /= 10;
if (divisor == 10000000) UNITY_OUTPUT_CHAR('.');
} while (divisor > 0);
UNITY_OUTPUT_CHAR('0' + integer_part / divisor);
integer_part %= divisor;
divisor /= 10;
UnityPrintDecimalAndNumberWithLeadingZeros(integer_part, divisor);
UNITY_OUTPUT_CHAR('e');
UNITY_OUTPUT_CHAR('+');
if (exponent < 10) UNITY_OUTPUT_CHAR('0');
UnityPrintNumberUnsigned(exponent);
UnityPrintNumber(exponent);
}
}
#endif /* UNITY_FLOAT_VERBOSE */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册