Fixed rounding up in SDL_PrintFloat

This wasn't caught by the 9.9999999 case, because that value is actually just equal to 10.0
This commit is contained in:
Brick
2023-08-07 16:33:44 +01:00
committed by Sam Lantinga
parent 75a020aa6b
commit c03f5b4b69
2 changed files with 23 additions and 18 deletions

View File

@@ -1758,16 +1758,17 @@ static size_t SDL_PrintFloat(char *text, size_t maxlen, SDL_FormatInfo *info, do
} }
if (num[i] == '9') { if (num[i] == '9') {
num[i] = '0'; num[i] = '0';
if (i == 0 || num[i - 1] == '-' || num[i - 1] == '+') {
SDL_memmove(&num[i+1], &num[i], length - i);
num[i] = '1';
++length;
break;
}
} else { } else {
++num[i]; ++num[i];
break; break;
} }
} }
if (i == 0 || num[i] == '-' || num[i] == '+') {
SDL_memmove(&num[i+1], &num[i], length - i);
num[i] = '1';
++length;
}
SDL_assert(length < sizeof(num)); SDL_assert(length < sizeof(num));
num[length++] = '0'; num[length++] = '0';
} else { } else {

View File

@@ -197,30 +197,34 @@ static int stdlib_snprintf(void *arg)
{ {
static struct static struct
{ {
int precision;
float value; float value;
const char *expected_f; const char *expected_f;
const char *expected_g; const char *expected_g;
} f_and_g_test_cases[] = { } f_and_g_test_cases[] = {
{ 100.0f, "100.000000", "100" }, { 6, 100.0f, "100.000000", "100" },
{ -100.0f, "-100.000000", "-100" }, { 6, -100.0f, "-100.000000", "-100" },
{ 100.75f, "100.750000", "100.75" }, { 6, 100.75f, "100.750000", "100.75" },
{ -100.75f, "-100.750000", "-100.75" }, { 6, -100.75f, "-100.750000", "-100.75" },
{ ((100 * 60 * 1000) / 1001) / 100.0f, "59.939999", "59.94" }, { 6, ((100 * 60 * 1000) / 1001) / 100.0f, "59.939999", "59.94" },
{ -((100 * 60 * 1000) / 1001) / 100.0f, "-59.939999", "-59.94" }, { 6, -((100 * 60 * 1000) / 1001) / 100.0f, "-59.939999", "-59.94" },
{ ((100 * 120 * 1000) / 1001) / 100.0f, "119.879997", "119.88" }, { 6, ((100 * 120 * 1000) / 1001) / 100.0f, "119.879997", "119.88" },
{ -((100 * 120 * 1000) / 1001) / 100.0f, "-119.879997", "-119.88" }, { 6, -((100 * 120 * 1000) / 1001) / 100.0f, "-119.879997", "-119.88" },
{ 9.9999999f, "10.000000", "10" }, { 6, 0.9999999f, "1.000000", "1" },
{ -9.9999999f, "-10.000000", "-10" }, { 6, -0.9999999f, "-1.000000", "-1" },
{ 5, 9.999999f, "10.00000", "10" },
{ 5, -9.999999f, "-10.00000", "-10" },
}; };
int i; int i;
for (i = 0; i < SDL_arraysize(f_and_g_test_cases); ++i) { for (i = 0; i < SDL_arraysize(f_and_g_test_cases); ++i) {
float value = f_and_g_test_cases[i].value; float value = f_and_g_test_cases[i].value;
int prec = f_and_g_test_cases[i].precision;
result = SDL_snprintf(text, sizeof(text), "%f", value); result = SDL_snprintf(text, sizeof(text), "%.*f", prec, value);
predicted = SDL_snprintf(NULL, 0, "%f", value); predicted = SDL_snprintf(NULL, 0, "%.*f", prec, value);
expected = f_and_g_test_cases[i].expected_f; expected = f_and_g_test_cases[i].expected_f;
SDLTest_AssertPass("Call to SDL_snprintf(\"%%f\", %g)", value); SDLTest_AssertPass("Call to SDL_snprintf(\"%%.5f\", %g)", value);
SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text); SDLTest_AssertCheck(SDL_strcmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == SDL_strlen(expected), "Check result value, expected: %d, got: %d", (int)SDL_strlen(expected), result); SDLTest_AssertCheck(result == SDL_strlen(expected), "Check result value, expected: %d, got: %d", (int)SDL_strlen(expected), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted); SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);