Skip to content

Commit

Permalink
libc: minimal: Fix handling of %f conversion specifiers for inf & nan
Browse files Browse the repository at this point in the history
The C standard says that %f should use '[-]inf' or '[-]infinity' (which
style is implementation defined) for infinity handling and '[-]nan' for
NaN.

We where adding a '+' and had the wrong case for 'inf' and 'nan'.

Before -> After

+INF -> inf
-INF -> -inf
 NaN -> nan

Signed-off-by: Kumar Gala <kumar.gala@linaro.org>
  • Loading branch information
galak committed Jul 12, 2018
1 parent e6f4f62 commit 96ea7ab
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 11 deletions.
14 changes: 8 additions & 6 deletions lib/libc/minimal/source/stdout/prf.c
Expand Up @@ -226,14 +226,16 @@ static int _to_float(char *buf, uint64_t double_temp, int c,

if (exp == 0x7ff) {
if (!fract) {
*buf++ = sign ? '-' : '+';
*buf++ = 'I';
*buf++ = 'N';
*buf++ = 'F';
if (sign) {
*buf++ = '-';
}
*buf++ = 'i';
*buf++ = 'n';
*buf++ = 'f';
} else {
*buf++ = 'N';
*buf++ = 'n';
*buf++ = 'a';
*buf++ = 'N';
*buf++ = 'n';
}
*buf = 0;
return buf - start;
Expand Down
10 changes: 5 additions & 5 deletions tests/lib/sprintf/src/main.c
Expand Up @@ -74,20 +74,20 @@ void test_sprintf_double(void)
var.u1 = 0x00000000;
var.u2 = 0x7ff00000; /* Bit pattern for +INF (double) */
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "+INF") == 0),
"sprintf(+INF) - incorrect output '%s'\n", buffer);
zassert_true((strcmp(buffer, "inf") == 0),
"sprintf(inf) - incorrect output '%s'\n", buffer);

var.u1 = 0x00000000;
var.u2 = 0xfff00000; /* Bit pattern for -INF (double) */
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "-INF") == 0),
zassert_true((strcmp(buffer, "-inf") == 0),
"sprintf(-INF) - incorrect output '%s'\n", buffer);

var.u1 = 0x00000000;
var.u2 = 0x7ff80000; /* Bit pattern for NaN (double) */
sprintf(buffer, "%f", var.d);
zassert_true((strcmp(buffer, "NaN") == 0),
"sprintf(NaN) - incorrect output '%s'\n", buffer);
zassert_true((strcmp(buffer, "nan") == 0),
"sprintf(nan) - incorrect output '%s'\n", buffer);

var.d = 1.0;
sprintf(buffer, "%f", var.d);
Expand Down

0 comments on commit 96ea7ab

Please sign in to comment.