提交 2de0e828 编写于 作者: J jsalling

Key idea is using double precision calculations makes everything better

Print 9 digits
上级 e48fe0a0
...@@ -255,7 +255,7 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number) ...@@ -255,7 +255,7 @@ void UnityPrintMask(const _U_UINT mask, const _U_UINT number)
/* /*
* char buffer[19]; * char buffer[19];
* if (number > 4294967296.0 || -number > 4294967296.0) * if (number > 4294967296.0 || -number > 4294967296.0)
* snprintf(buffer, sizeof buffer, "%.6e", number); * snprintf(buffer, sizeof buffer, "%.8e", number);
* else * else
* snprintf(buffer, sizeof buffer, "%.6f", number); * snprintf(buffer, sizeof buffer, "%.6f", number);
* UnityPrint(buffer); * UnityPrint(buffer);
...@@ -276,7 +276,8 @@ void UnityPrintFloat(_UD number) ...@@ -276,7 +276,8 @@ void UnityPrintFloat(_UD number)
_UU32 integer_part = (_UU32)number; _UU32 integer_part = (_UU32)number;
_UD fraction_part = number - integer_part; _UD fraction_part = number - integer_part;
_U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0f + 0.5f); _U_UINT fraction_bits = (_U_UINT)(fraction_part * 1000000.0 + 0.5);
/* Double precision calculation gives best performance for six rounded decimal places */
if (fraction_bits == 1000000) if (fraction_bits == 1000000)
{ {
...@@ -299,24 +300,25 @@ void UnityPrintFloat(_UD number) ...@@ -299,24 +300,25 @@ void UnityPrintFloat(_UD number)
else /* Won't fit in an integer type */ else /* Won't fit in an integer type */
{ {
_UU32 integer_part; _UU32 integer_part;
_UD divide = 10.0f; double divide = 10.0;
_U_UINT exponent = 7; _U_UINT exponent = 9;
while (number / divide >= 10000000.0f) while (number / divide >= 1000000000.0)
{ {
divide *= 10; divide *= 10;
exponent++; exponent++;
} }
integer_part = (_UU32)(number / divide + 0.5f); integer_part = (_UU32)(number / divide + 0.5);
/* Double precision calculation required for float, to produce 9 rounded digits */
_UU32 divisor = 1000000; _UU32 divisor = 100000000;
do do
{ {
UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor))); UNITY_OUTPUT_CHAR((char)('0' + (integer_part / divisor)));
integer_part %= divisor; integer_part %= divisor;
divisor /= 10; divisor /= 10;
if (divisor == 100000) UNITY_OUTPUT_CHAR('.'); if (divisor == 10000000) UNITY_OUTPUT_CHAR('.');
} while (divisor > 0); } while (divisor > 0);
UNITY_OUTPUT_CHAR('e'); UNITY_OUTPUT_CHAR('e');
UNITY_OUTPUT_CHAR('+'); UNITY_OUTPUT_CHAR('+');
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册