From 3c3981e0e493d19232ac1cca8e1a88bd8c2e65a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Fri, 5 May 2017 10:37:48 +0200 Subject: [PATCH] [poincare] Fix bug in convert float to text Change-Id: I2b672cbb356a60a00a9fd11be8ed3787d2387c83 --- poincare/src/complex.cpp | 6 ++++-- poincare/test/complex.cpp | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/poincare/src/complex.cpp b/poincare/src/complex.cpp index a3f907cbe..3ee9ccd09 100644 --- a/poincare/src/complex.cpp +++ b/poincare/src/complex.cpp @@ -284,13 +284,15 @@ int Complex::convertFloatToTextPrivate(float f, char * buffer, int numberOfSigni * is too big (or too small), mantissa is now inf. We handle this case by * using logarithm function. */ if (isnan(mantissa) || isinf(mantissa)) { - mantissa = roundf(powf(10.0f, log10f(f)+(float)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))); + mantissa = roundf(powf(10.0f, log10f(fabsf(f))+(float)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))); + mantissa = copysignf(mantissa, f); } /* We update the exponent in base 10 (if 0.99999999 was rounded to 1 for * instance) */ float truncatedMantissa = (int)(f * powf(10, availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal)); if (isinf(truncatedMantissa) || isnan(truncatedMantissa)) { - truncatedMantissa = (int)(powf(10.0f, log10f(f)+(float)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))); + truncatedMantissa = (int)(powf(10.0f, log10f(fabsf(f))+(float)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))); + truncatedMantissa = copysignf(truncatedMantissa, f); } if (mantissa != truncatedMantissa) { float newLogBase10 = mantissa != 0.0f ? log10f(fabsf(mantissa/powf(10, availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))) : 0.0f; diff --git a/poincare/test/complex.cpp b/poincare/test/complex.cpp index d3ea1b7d1..bd3a74ddf 100644 --- a/poincare/test/complex.cpp +++ b/poincare/test/complex.cpp @@ -52,7 +52,7 @@ QUIZ_CASE(poincare_complex_to_text) { assert_float_converts_to(10000000.0f, "1E7", Decimal); assert_float_converts_to(0.000001f, "0.000001", Decimal); assert_float_converts_to(0.0000001f, "1E-7", Decimal); // FIXME: Explain. Would overflow? - // CRASH!! assert_float_converts_to(-0.00000000000000000000000000000000909090964f, "WHATEVER", Decimal); + assert_float_converts_to(-0.00000000000000000000000000000000909090964f, "-9.090897E-33", Decimal); // FIXME: explain why it is not -9.090964 ? assert_float_converts_to(123.421f, "123.4", Decimal, 4, 6); assert_float_converts_to(123.421f, "1.2E2", Decimal, 5, 6); }