From 34108547b691f26e11243045f66c72946a5081bf Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Tue, 1 Mar 2022 19:50:19 +1100 Subject: [PATCH] AK: Print NaN and infinite numbers in PrintfImplementation --- AK/PrintfImplementation.h | 26 +++++++++++++++++++++++++- Tests/LibC/TestSnprintf.cpp | 16 ++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/AK/PrintfImplementation.h b/AK/PrintfImplementation.h index 1da4294c23..032510503a 100644 --- a/AK/PrintfImplementation.h +++ b/AK/PrintfImplementation.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #ifdef __serenity__ @@ -165,7 +166,30 @@ ALWAYS_INLINE int print_double(PutChFunc putch, CharType*& bufptr, double number u32 whole_width = (field_width >= precision + 1) ? field_width - precision - 1 : 0; - bool sign = number < 0; + bool sign = signbit(number); + bool nan = isnan(number); + bool inf = isinf(number); + + if (nan || inf) { + for (unsigned i = 0; i < field_width - 3 - sign; i++) { + putch(bufptr, ' '); + length++; + } + if (sign) { + putch(bufptr, '-'); + length++; + } + if (nan) { + putch(bufptr, 'n'); + putch(bufptr, 'a'); + putch(bufptr, 'n'); + } else { + putch(bufptr, 'i'); + putch(bufptr, 'n'); + putch(bufptr, 'f'); + } + return length + 3; + } if (sign) number = -number; diff --git a/Tests/LibC/TestSnprintf.cpp b/Tests/LibC/TestSnprintf.cpp index bfb03d18d7..125f045c6b 100644 --- a/Tests/LibC/TestSnprintf.cpp +++ b/Tests/LibC/TestSnprintf.cpp @@ -273,3 +273,19 @@ TEST_CASE(inttypes_macros) EXPECT(test_single({ LITERAL("xxxxxxx"), "|%" PRIx16 "|", 0xC0DE, 6, LITERAL("|c0de|\0") })); EXPECT(test_single({ LITERAL("xxxxxxx"), "|%" PRIX16 "|", 0xC0DE, 6, LITERAL("|C0DE|\0") })); } + +TEST_CASE(float_values) +{ + union { + float f; + int i; + } v; + + v.i = 0x7fc00000; + EXPECT(test_single({ LITERAL("xxxxxxx"), "|%4f|", v.f, 6, LITERAL("| nan|\0") })); + EXPECT(test_single({ LITERAL("xxxxxxx"), "|%4f|", -v.f, 6, LITERAL("|-nan|\0") })); + + v.i = 0x7f800000; + EXPECT(test_single({ LITERAL("xxxxxxx"), "|%4f|", v.f, 6, LITERAL("| inf|\0") })); + EXPECT(test_single({ LITERAL("xxxxxxx"), "|%4f|", -v.f, 6, LITERAL("|-inf|\0") })); +}