From 6de71ae1455d6005a80ce1c630d034febd11ea57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Wed, 14 Feb 2018 17:45:06 +0100 Subject: [PATCH] [poincare] Clean: convertFloatToText should be in PrintFloat instead of Complex --- apps/calculation/calculation.cpp | 2 +- apps/graph/graph/graph_controller_helper.cpp | 2 +- .../graph/intersection_graph_controller.cpp | 2 +- apps/graph/graph/tangent_graph_controller.cpp | 4 +- .../hardware_test/battery_test_controller.cpp | 2 +- apps/probability/calculation_controller.cpp | 4 +- apps/regression/calculation_controller.cpp | 6 +- apps/regression/graph_controller.cpp | 14 +- apps/sequence/sequence.cpp | 4 +- apps/settings/sub_controller.cpp | 2 +- apps/shared/curve_view.cpp | 4 +- .../editable_cell_table_view_controller.cpp | 4 +- .../editable_cell_table_view_controller.h | 2 +- apps/shared/float_parameter_controller.cpp | 2 +- apps/shared/function.cpp | 2 +- apps/shared/function_banner_delegate.cpp | 4 +- apps/shared/store_controller.cpp | 2 +- apps/shared/sum_graph_controller.cpp | 12 +- apps/shared/values_controller.cpp | 4 +- apps/statistics/box_controller.cpp | 2 +- apps/statistics/calculation_controller.cpp | 2 +- apps/statistics/histogram_controller.cpp | 8 +- apps/title_bar_view.cpp | 2 +- apps/variable_box_controller.cpp | 4 +- ion/src/device/bench/command/adc.cpp | 2 +- poincare/include/poincare/absolute_value.h | 2 +- poincare/include/poincare/addition.h | 2 +- poincare/include/poincare/arc_cosine.h | 2 +- poincare/include/poincare/arc_sine.h | 2 +- poincare/include/poincare/arc_tangent.h | 2 +- .../include/poincare/binomial_coefficient.h | 2 +- poincare/include/poincare/ceiling.h | 2 +- poincare/include/poincare/complex.h | 21 +- poincare/include/poincare/complex_argument.h | 2 +- .../include/poincare/confidence_interval.h | 2 +- poincare/include/poincare/conjugate.h | 2 +- poincare/include/poincare/cosine.h | 2 +- poincare/include/poincare/decimal.h | 2 +- poincare/include/poincare/derivative.h | 2 +- poincare/include/poincare/determinant.h | 2 +- poincare/include/poincare/division.h | 2 +- poincare/include/poincare/division_quotient.h | 2 +- .../include/poincare/division_remainder.h | 2 +- poincare/include/poincare/expression.h | 9 +- poincare/include/poincare/factor.h | 2 +- poincare/include/poincare/factorial.h | 2 +- poincare/include/poincare/floor.h | 2 +- poincare/include/poincare/frac_part.h | 2 +- .../include/poincare/great_common_divisor.h | 2 +- .../include/poincare/hyperbolic_arc_cosine.h | 2 +- .../include/poincare/hyperbolic_arc_sine.h | 2 +- .../include/poincare/hyperbolic_arc_tangent.h | 2 +- poincare/include/poincare/hyperbolic_cosine.h | 2 +- poincare/include/poincare/hyperbolic_sine.h | 2 +- .../include/poincare/hyperbolic_tangent.h | 2 +- poincare/include/poincare/ieee754.h | 23 ++ poincare/include/poincare/imaginary_part.h | 2 +- poincare/include/poincare/integral.h | 2 +- poincare/include/poincare/layout_engine.h | 4 +- .../include/poincare/least_common_multiple.h | 2 +- poincare/include/poincare/logarithm.h | 2 +- poincare/include/poincare/matrix.h | 2 +- poincare/include/poincare/matrix_dimension.h | 2 +- poincare/include/poincare/matrix_inverse.h | 2 +- poincare/include/poincare/matrix_trace.h | 2 +- poincare/include/poincare/matrix_transpose.h | 2 +- poincare/include/poincare/multiplication.h | 2 +- .../include/poincare/naperian_logarithm.h | 2 +- poincare/include/poincare/nth_root.h | 2 +- poincare/include/poincare/opposite.h | 2 +- poincare/include/poincare/parenthesis.h | 2 +- .../include/poincare/permute_coefficient.h | 2 +- poincare/include/poincare/power.h | 2 +- .../include/poincare/prediction_interval.h | 2 +- poincare/include/poincare/preferences.h | 6 +- poincare/include/poincare/print_float.h | 26 ++- poincare/include/poincare/randint.h | 2 +- poincare/include/poincare/random.h | 2 +- poincare/include/poincare/rational.h | 2 +- poincare/include/poincare/real_part.h | 2 +- poincare/include/poincare/round.h | 2 +- poincare/include/poincare/sequence.h | 2 +- .../include/poincare/simplification_root.h | 2 +- poincare/include/poincare/sine.h | 2 +- poincare/include/poincare/square_root.h | 2 +- poincare/include/poincare/store.h | 2 +- poincare/include/poincare/subtraction.h | 2 +- poincare/include/poincare/symbol.h | 2 +- poincare/include/poincare/tangent.h | 2 +- poincare/include/poincare/undefined.h | 2 +- poincare/src/absolute_value.cpp | 4 +- poincare/src/binomial_coefficient.cpp | 4 +- poincare/src/ceiling.cpp | 4 +- poincare/src/complex.cpp | 206 ++---------------- poincare/src/conjugate.cpp | 4 +- poincare/src/decimal.cpp | 2 +- poincare/src/division.cpp | 4 +- poincare/src/expression.cpp | 4 +- poincare/src/factorial.cpp | 4 +- poincare/src/floor.cpp | 4 +- poincare/src/integral.cpp | 4 +- poincare/src/layout_engine.cpp | 8 +- poincare/src/logarithm.cpp | 4 +- poincare/src/matrix.cpp | 4 +- poincare/src/multiplication.cpp | 2 +- poincare/src/nth_root.cpp | 4 +- poincare/src/opposite.cpp | 4 +- poincare/src/parenthesis.cpp | 4 +- poincare/src/power.cpp | 4 +- poincare/src/preferences.cpp | 8 +- poincare/src/print_float.cpp | 157 +++++++++++++ poincare/src/rational.cpp | 2 +- poincare/src/sequence.cpp | 4 +- poincare/src/square_root.cpp | 4 +- poincare/src/store.cpp | 4 +- poincare/src/symbol.cpp | 4 +- poincare/src/undefined.cpp | 4 +- poincare/test/convert_expression_to_text.cpp | 10 +- 118 files changed, 392 insertions(+), 388 deletions(-) diff --git a/apps/calculation/calculation.cpp b/apps/calculation/calculation.cpp index 2c8827cf9..c89ba7283 100644 --- a/apps/calculation/calculation.cpp +++ b/apps/calculation/calculation.cpp @@ -98,7 +98,7 @@ Expression * Calculation::input() { ExpressionLayout * Calculation::inputLayout() { if (m_inputLayout == nullptr && input() != nullptr) { - m_inputLayout = input()->createLayout(Expression::FloatDisplayMode::Decimal, Expression::ComplexFormat::Cartesian); + m_inputLayout = input()->createLayout(PrintFloat::Mode::Decimal, Expression::ComplexFormat::Cartesian); } return m_inputLayout; } diff --git a/apps/graph/graph/graph_controller_helper.cpp b/apps/graph/graph/graph_controller_helper.cpp index c85ba2b81..579eb5519 100644 --- a/apps/graph/graph/graph_controller_helper.cpp +++ b/apps/graph/graph/graph_controller_helper.cpp @@ -25,7 +25,7 @@ void GraphControllerHelper::reloadDerivativeInBannerViewForCursorOnFunction(Shar buffer[0] = function->name()[0]; buffer[1] = '\''; double y = function->approximateDerivative(cursor->x(), app->localContext()); - numberOfChar += Complex::convertFloatToText(y, buffer + legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(y, buffer + legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits); strlcpy(buffer+numberOfChar, space, spaceLength+1); buffer[k_maxDigitLegendLength+6] = 0; bannerView()->setLegendAtIndex(buffer, 2); diff --git a/apps/graph/graph/intersection_graph_controller.cpp b/apps/graph/graph/intersection_graph_controller.cpp index 7d66a3bd4..94d5f6335 100644 --- a/apps/graph/graph/intersection_graph_controller.cpp +++ b/apps/graph/graph/intersection_graph_controller.cpp @@ -30,7 +30,7 @@ void IntersectionGraphController::reloadBannerView() { numberOfChar += legendLength; buffer[0] = m_function->name()[0]; buffer[5] = m_intersectedFunction->name()[0]; - numberOfChar += Complex::convertFloatToText(m_cursor->y(), buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(m_cursor->y(), buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); strlcpy(buffer+numberOfChar, space, spaceLength+1); buffer[FunctionBannerDelegate::k_maxDigitLegendLength+legendLength] = 0; bannerView()->setLegendAtIndex(buffer, 1); diff --git a/apps/graph/graph/tangent_graph_controller.cpp b/apps/graph/graph/tangent_graph_controller.cpp index a585bf34e..4d6b30f59 100644 --- a/apps/graph/graph/tangent_graph_controller.cpp +++ b/apps/graph/graph/tangent_graph_controller.cpp @@ -46,14 +46,14 @@ void TangentGraphController::reloadBannerView() { int legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); double y = m_function->approximateDerivative(m_cursor->x(), myApp->localContext()); - Complex::convertFloatToText(y, buffer + legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + PrintFloat::convertFloatToText(y, buffer + legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); m_bannerView->setLegendAtIndex(buffer, 4); legend = "b="; legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); y = -y*m_cursor->x()+m_function->evaluateAtAbscissa(m_cursor->x(), myApp->localContext()); - Complex::convertFloatToText(y, buffer + legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + PrintFloat::convertFloatToText(y, buffer + legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); m_bannerView->setLegendAtIndex(buffer, 5); } diff --git a/apps/hardware_test/battery_test_controller.cpp b/apps/hardware_test/battery_test_controller.cpp index 6186448e9..2892e4410 100644 --- a/apps/hardware_test/battery_test_controller.cpp +++ b/apps/hardware_test/battery_test_controller.cpp @@ -45,7 +45,7 @@ void BatteryTestController::updateBatteryState(float batteryLevel, bool batteryC const char * legend = "Battery level: "; int legendLength = strlen(legend); strlcpy(bufferLevel, legend, legendLength+1); - Complex::convertFloatToText(batteryLevel, bufferLevel+legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(batteryLevel, bufferLevel+legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); m_view.batteryLevelTextView()->setText(bufferLevel); char bufferCharging[ContentView::k_maxNumberOfCharacters + PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; diff --git a/apps/probability/calculation_controller.cpp b/apps/probability/calculation_controller.cpp index 01d5ea3e6..cb31bbe95 100644 --- a/apps/probability/calculation_controller.cpp +++ b/apps/probability/calculation_controller.cpp @@ -201,7 +201,7 @@ void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int return; } char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Complex::convertFloatToText(m_calculation->parameterAtIndex(i-1), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(m_calculation->parameterAtIndex(i-1), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, PrintFloat::Mode::Decimal); field->setText(buffer); } } @@ -296,7 +296,7 @@ void CalculationController::updateTitle() { strlcpy(m_titleBuffer+currentChar, " = ", 4); currentChar += 3; char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits)]; - Complex::convertFloatToText(m_law->parameterValueAtIndex(index), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(m_law->parameterValueAtIndex(index), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, PrintFloat::Mode::Decimal); strlcpy(m_titleBuffer+currentChar, buffer, strlen(buffer)+1); currentChar += strlen(buffer); m_titleBuffer[currentChar++] = ' '; diff --git a/apps/regression/calculation_controller.cpp b/apps/regression/calculation_controller.cpp index 4b231acc6..92b123c1c 100644 --- a/apps/regression/calculation_controller.cpp +++ b/apps/regression/calculation_controller.cpp @@ -149,9 +149,9 @@ void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int double calculation2 = (m_store->*calculationMethods[j-1])(1); EvenOddDoubleBufferTextCell * myCell = (EvenOddDoubleBufferTextCell *)cell; char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Complex::convertFloatToText(calculation1, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(calculation1, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); myCell->setFirstText(buffer); - Complex::convertFloatToText(calculation2, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(calculation2, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); myCell->setSecondText(buffer); return; } @@ -167,7 +167,7 @@ void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int double calculation = (m_store->*calculationMethods[j-k_totalNumberOfDoubleBufferRows-1])(); EvenOddBufferTextCell * myCell = (EvenOddBufferTextCell *)cell; char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Complex::convertFloatToText(calculation, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(calculation, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); myCell->setText(buffer); return; } diff --git a/apps/regression/graph_controller.cpp b/apps/regression/graph_controller.cpp index 5229dd8a0..b664a02b2 100644 --- a/apps/regression/graph_controller.cpp +++ b/apps/regression/graph_controller.cpp @@ -82,7 +82,7 @@ void GraphController::reloadBannerView() { strlcpy(buffer+numberOfChar, legend, legendLength+1); numberOfChar += legendLength; } else { - numberOfChar += Complex::convertFloatToText(std::round((float)*m_selectedDotIndex+1.0f), buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + numberOfChar += PrintFloat::convertFloatToText(std::round((float)*m_selectedDotIndex+1.0f), buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), Constant::ShortNumberOfSignificantDigits, PrintFloat::Mode::Decimal); } legend = ") "; legendLength = strlen(legend); @@ -102,7 +102,7 @@ void GraphController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(x, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(x, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); @@ -120,7 +120,7 @@ void GraphController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(y, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(y, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); @@ -133,7 +133,7 @@ void GraphController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(slope, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(slope, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); @@ -146,7 +146,7 @@ void GraphController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(yIntercept, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(yIntercept, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); @@ -159,7 +159,7 @@ void GraphController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(r, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(r, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); @@ -172,7 +172,7 @@ void GraphController::reloadBannerView() { legendLength = strlen(legend); strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; - numberOfChar += Complex::convertFloatToText(r2, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(r2, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); diff --git a/apps/sequence/sequence.cpp b/apps/sequence/sequence.cpp index 289f97212..44d42ba32 100644 --- a/apps/sequence/sequence.cpp +++ b/apps/sequence/sequence.cpp @@ -165,7 +165,7 @@ Poincare::ExpressionLayout * Sequence::firstInitialConditionLayout() { if (m_firstInitialConditionLayout == nullptr) { Expression * nonSimplifedExpression = Expression::parse(m_firstInitialConditionText); if (nonSimplifedExpression) { - m_firstInitialConditionLayout = nonSimplifedExpression->createLayout(Expression::FloatDisplayMode::Decimal); + m_firstInitialConditionLayout = nonSimplifedExpression->createLayout(PrintFloat::Mode::Decimal); delete nonSimplifedExpression; } } @@ -176,7 +176,7 @@ Poincare::ExpressionLayout * Sequence::secondInitialConditionLayout() { if (m_secondInitialConditionLayout == nullptr) { Expression * nonSimplifedExpression = Expression::parse(m_secondInitialConditionText); if (nonSimplifedExpression) { - m_secondInitialConditionLayout = nonSimplifedExpression->createLayout(Expression::FloatDisplayMode::Decimal); + m_secondInitialConditionLayout = nonSimplifedExpression->createLayout(PrintFloat::Mode::Decimal); delete nonSimplifedExpression; } } diff --git a/apps/settings/sub_controller.cpp b/apps/settings/sub_controller.cpp index 9ea464dfb..b4a341419 100644 --- a/apps/settings/sub_controller.cpp +++ b/apps/settings/sub_controller.cpp @@ -256,7 +256,7 @@ void SubController::setPreferenceWithValueIndex(I18n::Message message, int value Preferences::sharedPreferences()->setAngleUnit((Expression::AngleUnit)valueIndex); } if (message == I18n::Message::DisplayMode) { - Preferences::sharedPreferences()->setDisplayMode((Expression::FloatDisplayMode)valueIndex); + Preferences::sharedPreferences()->setDisplayMode((PrintFloat::Mode)valueIndex); } if (message == I18n::Message::ComplexFormat) { Preferences::sharedPreferences()->setComplexFormat((Expression::ComplexFormat)valueIndex); diff --git a/apps/shared/curve_view.cpp b/apps/shared/curve_view.cpp index d66e323b0..8b57e90a6 100644 --- a/apps/shared/curve_view.cpp +++ b/apps/shared/curve_view.cpp @@ -135,9 +135,9 @@ void CurveView::computeLabels(Axis axis) { if (labelValue < step && labelValue > -step) { labelValue = 0.0f; } - Complex::convertFloatToText(labelValue, buffer, + PrintFloat::convertFloatToText(labelValue, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::ShortNumberOfSignificantDigits), - Constant::ShortNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + Constant::ShortNumberOfSignificantDigits, PrintFloat::Mode::Decimal); //TODO: check for size of label? strlcpy(label(axis, index), buffer, strlen(buffer)+1); } diff --git a/apps/shared/editable_cell_table_view_controller.cpp b/apps/shared/editable_cell_table_view_controller.cpp index ec754c27e..d845a6f58 100644 --- a/apps/shared/editable_cell_table_view_controller.cpp +++ b/apps/shared/editable_cell_table_view_controller.cpp @@ -62,7 +62,7 @@ KDCoordinate EditableCellTableViewController::rowHeight(int j) { return k_cellHeight; } -void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(HighlightCell * cell, int i, int j, Expression::FloatDisplayMode floatDisplayMode) { +void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(HighlightCell * cell, int i, int j, PrintFloat::Mode floatDisplayMode) { EvenOddCell * myCell = (EvenOddCell *)cell; /* We set the cell even or odd state only if the cell is not being edited. * Otherwise, the cell background is white whichever it is an odd or even cell @@ -85,7 +85,7 @@ void EditableCellTableViewController::willDisplayCellAtLocationWithDisplayMode(H } if (!myEditableValueCell->editableTextCell()->textField()->isEditing()) { myCell->setEven(j%2 == 0); - Complex::convertFloatToText(dataAtLocation(i, j), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, floatDisplayMode); + PrintFloat::convertFloatToText(dataAtLocation(i, j), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, floatDisplayMode); myEditableValueCell->editableTextCell()->textField()->setText(buffer); } return; diff --git a/apps/shared/editable_cell_table_view_controller.h b/apps/shared/editable_cell_table_view_controller.h index 22b45809c..3171ce411 100644 --- a/apps/shared/editable_cell_table_view_controller.h +++ b/apps/shared/editable_cell_table_view_controller.h @@ -16,7 +16,7 @@ public: bool textFieldDidFinishEditing(TextField * textField, const char * text, Ion::Events::Event event) override; int numberOfRows() override; - void willDisplayCellAtLocationWithDisplayMode(HighlightCell * cell, int i, int j, Poincare::Expression::FloatDisplayMode FloatDisplayMode); + void willDisplayCellAtLocationWithDisplayMode(HighlightCell * cell, int i, int j, Poincare::PrintFloat::Mode mode); KDCoordinate rowHeight(int j) override; void viewWillAppear() override; void didBecomeFirstResponder() override; diff --git a/apps/shared/float_parameter_controller.cpp b/apps/shared/float_parameter_controller.cpp index f4f71ddd8..9e6188bec 100644 --- a/apps/shared/float_parameter_controller.cpp +++ b/apps/shared/float_parameter_controller.cpp @@ -106,7 +106,7 @@ void FloatParameterController::willDisplayCellForIndex(HighlightCell * cell, int return; } char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Complex::convertFloatToText(parameterAtIndex(index), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(parameterAtIndex(index), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, PrintFloat::Mode::Decimal); myCell->setAccessoryText(buffer); } diff --git a/apps/shared/function.cpp b/apps/shared/function.cpp index 2c36c64cc..7f612856d 100644 --- a/apps/shared/function.cpp +++ b/apps/shared/function.cpp @@ -80,7 +80,7 @@ Poincare::ExpressionLayout * Function::layout() { if (m_layout == nullptr) { Expression * nonSimplifiedExpression = Expression::parse(m_text); if (nonSimplifiedExpression != nullptr) { - m_layout = nonSimplifiedExpression->createLayout(Expression::FloatDisplayMode::Decimal); + m_layout = nonSimplifiedExpression->createLayout(PrintFloat::Mode::Decimal); delete nonSimplifiedExpression; } } diff --git a/apps/shared/function_banner_delegate.cpp b/apps/shared/function_banner_delegate.cpp index f7b8ffc6a..72c686962 100644 --- a/apps/shared/function_banner_delegate.cpp +++ b/apps/shared/function_banner_delegate.cpp @@ -15,7 +15,7 @@ void FunctionBannerDelegate::reloadBannerViewForCursorOnFunction(CurveViewCursor strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; buffer[0] = symbol; - numberOfChar += Complex::convertFloatToText(cursor->x(), buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(cursor->x(), buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); strlcpy(buffer+numberOfChar, space, spaceLength+1); buffer[k_maxDigitLegendLength+2] = 0; bannerView()->setLegendAtIndex(buffer, 0); @@ -27,7 +27,7 @@ void FunctionBannerDelegate::reloadBannerViewForCursorOnFunction(CurveViewCursor strlcpy(buffer, legend, legendLength+1); buffer[2] = symbol; buffer[0] = function->name()[0]; - numberOfChar += Complex::convertFloatToText(cursor->y(), buffer+legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(cursor->y(), buffer+legendLength, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits); strlcpy(buffer+numberOfChar, space, spaceLength+1); buffer[k_maxDigitLegendLength+5] = 0; bannerView()->setLegendAtIndex(buffer, 1); diff --git a/apps/shared/store_controller.cpp b/apps/shared/store_controller.cpp index 083555902..e3aeb7633 100644 --- a/apps/shared/store_controller.cpp +++ b/apps/shared/store_controller.cpp @@ -63,7 +63,7 @@ int StoreController::typeAtLocation(int i, int j) { } void StoreController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { - willDisplayCellAtLocationWithDisplayMode(cell, i, j, Expression::FloatDisplayMode::Decimal); + willDisplayCellAtLocationWithDisplayMode(cell, i, j, PrintFloat::Mode::Decimal); } void StoreController::didBecomeFirstResponder() { diff --git a/apps/shared/sum_graph_controller.cpp b/apps/shared/sum_graph_controller.cpp index 6e25820e5..0f162a333 100644 --- a/apps/shared/sum_graph_controller.cpp +++ b/apps/shared/sum_graph_controller.cpp @@ -158,7 +158,7 @@ bool SumGraphController::textFieldDidAbortEditing(TextField * textField, const c default: assert(false); } - Complex::convertFloatToText(parameter, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(parameter, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, PrintFloat::Mode::Decimal); textField->setText(buffer); return true; } @@ -233,7 +233,7 @@ void SumGraphController::LegendView::setLegendMessage(I18n::Message message, Ste void SumGraphController::LegendView::setEditableZone(double d) { char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits)]; - Complex::convertFloatToText(d, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(d, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, PrintFloat::Mode::Decimal); m_editableZone.setText(buffer); } @@ -248,19 +248,19 @@ void SumGraphController::LegendView::setSumSymbol(Step step, double start, doubl m_sumLayout = new StringLayout(sigma, sizeof(sigma)); } else if (step == Step::SecondParameter) { char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits)]; - Complex::convertFloatToText(start, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(start, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::MediumNumberOfSignificantDigits), Constant::MediumNumberOfSignificantDigits, PrintFloat::Mode::Decimal); m_sumLayout = new CondensedSumLayout(new StringLayout(sigma, sizeof(sigma)), new StringLayout(buffer, strlen(buffer), KDText::FontSize::Small), nullptr); } else { char buffer[2+PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Complex::convertFloatToText(start, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(start, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, PrintFloat::Mode::Decimal); ExpressionLayout * start = new StringLayout(buffer, strlen(buffer), KDText::FontSize::Small); - Complex::convertFloatToText(end, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(end, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits, PrintFloat::Mode::Decimal); ExpressionLayout * end = new StringLayout(buffer, strlen(buffer), KDText::FontSize::Small); m_sumLayout = new CondensedSumLayout(new StringLayout(sigma, sizeof(sigma)), start, end); ExpressionLayout * childrenLayouts[3]; strlcpy(buffer, "= ", 3); - Complex::convertFloatToText(result, buffer+2, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(result, buffer+2, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); childrenLayouts[2] = new StringLayout(buffer, strlen(buffer), KDText::FontSize::Small); childrenLayouts[1] = functionLayout; childrenLayouts[0] = m_sumLayout; diff --git a/apps/shared/values_controller.cpp b/apps/shared/values_controller.cpp index 8a2820213..43dcbea7c 100644 --- a/apps/shared/values_controller.cpp +++ b/apps/shared/values_controller.cpp @@ -123,7 +123,7 @@ Button * ValuesController::buttonAtIndex(int index, ButtonRowController::Positio } void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, int j) { - willDisplayCellAtLocationWithDisplayMode(cell, i, j, Expression::FloatDisplayMode::Default); + willDisplayCellAtLocationWithDisplayMode(cell, i, j, PrintFloat::Mode::Default); if (cellAtLocationIsEditable(i, j)) { return; } @@ -143,7 +143,7 @@ void ValuesController::willDisplayCellAtLocation(HighlightCell * cell, int i, in // The cell is a value cell EvenOddBufferTextCell * myValueCell = (EvenOddBufferTextCell *)cell; double x = m_interval->element(j-1); - Complex::convertFloatToText(evaluationOfAbscissaAtColumn(x, i), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(evaluationOfAbscissaAtColumn(x, i), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); myValueCell->setText(buffer); } } diff --git a/apps/statistics/box_controller.cpp b/apps/statistics/box_controller.cpp index ae173d96e..77dd73868 100644 --- a/apps/statistics/box_controller.cpp +++ b/apps/statistics/box_controller.cpp @@ -71,7 +71,7 @@ void BoxController::reloadBannerView() { CalculPointer calculationMethods[5] = {&Store::minValue, &Store::firstQuartile, &Store::median, &Store::thirdQuartile, &Store::maxValue}; double calculation = (m_store->*calculationMethods[(int)m_view.selectedQuantile()])(); - Complex::convertFloatToText(calculation, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(calculation, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); m_boxBannerView.setLegendAtIndex(buffer, 1); } diff --git a/apps/statistics/calculation_controller.cpp b/apps/statistics/calculation_controller.cpp index 4da4fdc82..d65b771b6 100644 --- a/apps/statistics/calculation_controller.cpp +++ b/apps/statistics/calculation_controller.cpp @@ -84,7 +84,7 @@ void CalculationController::willDisplayCellAtLocation(HighlightCell * cell, int double calculation = (m_store->*calculationMethods[j])(); EvenOddBufferTextCell * myCell = (EvenOddBufferTextCell *)cell; char buffer[PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits)]; - Complex::convertFloatToText(calculation, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + PrintFloat::convertFloatToText(calculation, buffer, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); myCell->setText(buffer); } } diff --git a/apps/statistics/histogram_controller.cpp b/apps/statistics/histogram_controller.cpp index a7895b8fe..8651278b5 100644 --- a/apps/statistics/histogram_controller.cpp +++ b/apps/statistics/histogram_controller.cpp @@ -157,10 +157,10 @@ void HistogramController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; double lowerBound = m_store->startOfBarAtIndex(*m_selectedBarIndex); - numberOfChar += Complex::convertFloatToText(lowerBound, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(lowerBound, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); buffer[numberOfChar++] = ';'; double upperBound = m_store->endOfBarAtIndex(*m_selectedBarIndex); - numberOfChar += Complex::convertFloatToText(upperBound, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(upperBound, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); buffer[numberOfChar++] = '['; legend = " "; legendLength = strlen(legend); @@ -174,7 +174,7 @@ void HistogramController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; double size = m_store->heightOfBarAtIndex(*m_selectedBarIndex); - numberOfChar += Complex::convertFloatToText(size, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(size, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); @@ -187,7 +187,7 @@ void HistogramController::reloadBannerView() { strlcpy(buffer, legend, legendLength+1); numberOfChar += legendLength; double frequency = size/m_store->sumOfColumn(1); - numberOfChar += Complex::convertFloatToText(frequency, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); + numberOfChar += PrintFloat::convertFloatToText(frequency, buffer+numberOfChar, PrintFloat::bufferSizeForFloatsWithPrecision(Constant::LargeNumberOfSignificantDigits), Constant::LargeNumberOfSignificantDigits); legend = " "; legendLength = strlen(legend); strlcpy(buffer+numberOfChar, legend, legendLength+1); diff --git a/apps/title_bar_view.cpp b/apps/title_bar_view.cpp index 9dbbbdafe..62c4815b4 100644 --- a/apps/title_bar_view.cpp +++ b/apps/title_bar_view.cpp @@ -84,7 +84,7 @@ void TitleBarView::layoutSubviews() { void TitleBarView::refreshPreferences() { char buffer[13]; int numberOfChar = 0; - if (Preferences::sharedPreferences()->displayMode() == Expression::FloatDisplayMode::Scientific) { + if (Preferences::sharedPreferences()->displayMode() == PrintFloat::Mode::Scientific) { strlcpy(buffer, I18n::translate(I18n::Message::Sci), strlen(I18n::translate(I18n::Message::Sci))+1); numberOfChar += strlen(I18n::translate(I18n::Message::Sci)); } diff --git a/apps/variable_box_controller.cpp b/apps/variable_box_controller.cpp index 33327e63a..dda683f33 100644 --- a/apps/variable_box_controller.cpp +++ b/apps/variable_box_controller.cpp @@ -154,9 +154,9 @@ void VariableBoxController::ContentViewController::willDisplayCellForIndex(Highl const Matrix * matrixEvaluation = static_cast(evaluation); myCell->setExpression(matrixEvaluation); char buffer[2*PrintFloat::bufferSizeForFloatsWithPrecision(2)+1]; - int numberOfChars = Complex::convertFloatToText(matrixEvaluation->numberOfRows(), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(2), 2, Expression::FloatDisplayMode::Decimal); + int numberOfChars = PrintFloat::convertFloatToText(matrixEvaluation->numberOfRows(), buffer, PrintFloat::bufferSizeForFloatsWithPrecision(2), 2, PrintFloat::Mode::Decimal); buffer[numberOfChars++] = 'x'; - Complex::convertFloatToText(matrixEvaluation->numberOfColumns(), buffer+numberOfChars, PrintFloat::bufferSizeForFloatsWithPrecision(2), 2, Expression::FloatDisplayMode::Decimal); + PrintFloat::convertFloatToText(matrixEvaluation->numberOfColumns(), buffer+numberOfChars, PrintFloat::bufferSizeForFloatsWithPrecision(2), 2, PrintFloat::Mode::Decimal); myCell->setSubtitle(buffer); } else { myCell->setExpression(nullptr); diff --git a/ion/src/device/bench/command/adc.cpp b/ion/src/device/bench/command/adc.cpp index 9f7886358..30d2eaf79 100644 --- a/ion/src/device/bench/command/adc.cpp +++ b/ion/src/device/bench/command/adc.cpp @@ -17,7 +17,7 @@ void ADC(const char * input) { constexpr int precision = 8; constexpr int bufferSize = Poincare::PrintFloat::bufferSizeForFloatsWithPrecision(precision); char responseBuffer[bufferSize+4] = {'A', 'D', 'C', '='}; // ADC= - Poincare::Complex::convertFloatToText(result, responseBuffer+4, bufferSize, precision); + Poincare::PrintFloat::convertFloatToText(result, responseBuffer+4, bufferSize, precision); reply(responseBuffer); } diff --git a/poincare/include/poincare/absolute_value.h b/poincare/include/poincare/absolute_value.h index 543515250..c5b75d48d 100644 --- a/poincare/include/poincare/absolute_value.h +++ b/poincare/include/poincare/absolute_value.h @@ -16,7 +16,7 @@ public: private: Expression * setSign(Sign s, Context & context, AngleUnit angleUnit) override; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "abs"); } diff --git a/poincare/include/poincare/addition.h b/poincare/include/poincare/addition.h index e4b12bd9e..12c715bd5 100644 --- a/poincare/include/poincare/addition.h +++ b/poincare/include/poincare/addition.h @@ -30,7 +30,7 @@ public: private: /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createInfixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/arc_cosine.h b/poincare/include/poincare/arc_cosine.h index 227bd6980..71ae77674 100644 --- a/poincare/include/poincare/arc_cosine.h +++ b/poincare/include/poincare/arc_cosine.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/arc_sine.h b/poincare/include/poincare/arc_sine.h index bddd3e36b..3aa871d05 100644 --- a/poincare/include/poincare/arc_sine.h +++ b/poincare/include/poincare/arc_sine.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/arc_tangent.h b/poincare/include/poincare/arc_tangent.h index 498407253..e915ab332 100644 --- a/poincare/include/poincare/arc_tangent.h +++ b/poincare/include/poincare/arc_tangent.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/binomial_coefficient.h b/poincare/include/poincare/binomial_coefficient.h index b5fd53b8e..b5085bb67 100644 --- a/poincare/include/poincare/binomial_coefficient.h +++ b/poincare/include/poincare/binomial_coefficient.h @@ -15,7 +15,7 @@ public: private: constexpr static int k_maxNValue = 300; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "binomial"); } diff --git a/poincare/include/poincare/ceiling.h b/poincare/include/poincare/ceiling.h index e96efcf0d..e55e96f8c 100644 --- a/poincare/include/poincare/ceiling.h +++ b/poincare/include/poincare/ceiling.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, name()); } diff --git a/poincare/include/poincare/complex.h b/poincare/include/poincare/complex.h index 80e893c9b..47545eaa3 100644 --- a/poincare/include/poincare/complex.h +++ b/poincare/include/poincare/complex.h @@ -40,22 +40,10 @@ public: * because Complex expressions are always transformed into an addition of * Decimal and I symbol before compared with another Expression. */ - /* The parameter 'DisplayMode' refers to the way to display float 'scientific' - * or 'auto'. The scientific mode returns float with style -1.2E2 whereas - * the auto mode tries to return 'natural' float like (0.021) and switches - * to scientific mode if the float is too small or too big regarding the - * number of significant digits. If the buffer size is too small to display - * the right number of significant digits, the function forces the scientific - * mode and cap the number of significant digits to fit the buffer. If the - * buffer is too small to display any float, the text representing the float - * is truncated at the end of the buffer. - * ConvertFloat to Text return the number of characters that have been written - * in buffer (excluding the last \O character) */ - static int convertFloatToText(T d, char * buffer, int bufferSize, int numberOfSignificantDigits, Expression::FloatDisplayMode mode = Expression::FloatDisplayMode::Default); private: Complex(T a, T b); /* Layout */ - ExpressionLayout * privateCreateLayout(Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat) const override; /* Simplification */ static Expression * CreateDecimal(T f); Expression * shallowReduce(Context & context, AngleUnit angleUnit) override; @@ -65,10 +53,9 @@ private: template Complex * templatedApproximate(Context& context, Expression::AngleUnit angleUnit) const; /* convertComplexToText and convertFloatToTextPrivate return the string length * of the buffer (does not count the 0 last char)*/ - int convertComplexToText(char * buffer, int bufferSize, int numberOfSignificantDigits, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, char multiplicationSign) const; - static int convertFloatToTextPrivate(T f, char * buffer, int numberOfSignificantDigits, Expression::FloatDisplayMode mode); - ExpressionLayout * createPolarLayout(Expression::FloatDisplayMode floatDisplayMode) const; - ExpressionLayout * createCartesianLayout(Expression::FloatDisplayMode floatDisplayMode) const; + int convertComplexToText(char * buffer, int bufferSize, int numberOfSignificantDigits, PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat, char multiplicationSign) const; + ExpressionLayout * createPolarLayout(PrintFloat::Mode floatDisplayMode) const; + ExpressionLayout * createCartesianLayout(PrintFloat::Mode floatDisplayMode) const; T m_a; T m_b; }; diff --git a/poincare/include/poincare/complex_argument.h b/poincare/include/poincare/complex_argument.h index eef139363..14d283528 100644 --- a/poincare/include/poincare/complex_argument.h +++ b/poincare/include/poincare/complex_argument.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/confidence_interval.h b/poincare/include/poincare/confidence_interval.h index 6eb790635..f83fe0bf1 100644 --- a/poincare/include/poincare/confidence_interval.h +++ b/poincare/include/poincare/confidence_interval.h @@ -13,7 +13,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/conjugate.h b/poincare/include/poincare/conjugate.h index 2ffe75a81..e43767171 100644 --- a/poincare/include/poincare/conjugate.h +++ b/poincare/include/poincare/conjugate.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "conj"); } diff --git a/poincare/include/poincare/cosine.h b/poincare/include/poincare/cosine.h index 4ef8ee2e7..9511d2ff2 100644 --- a/poincare/include/poincare/cosine.h +++ b/poincare/include/poincare/cosine.h @@ -17,7 +17,7 @@ public: template static Complex computeOnComplex(const Complex c, AngleUnit angleUnit = AngleUnit::Radian); private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/decimal.h b/poincare/include/poincare/decimal.h index 1b52e40fb..5b4e1d940 100644 --- a/poincare/include/poincare/decimal.h +++ b/poincare/include/poincare/decimal.h @@ -33,7 +33,7 @@ private: int simplificationOrderSameType(const Expression * e, bool canBeInterrupted) const override; /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; /* Simplification */ Expression * shallowReduce(Context& context, AngleUnit angleUnit) override; Expression * shallowBeautify(Context& context, AngleUnit angleUnit) override; diff --git a/poincare/include/poincare/derivative.h b/poincare/include/poincare/derivative.h index 1e842ca28..f6d501ba0 100644 --- a/poincare/include/poincare/derivative.h +++ b/poincare/include/poincare/derivative.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/determinant.h b/poincare/include/poincare/determinant.h index bcb00be10..7db860bc1 100644 --- a/poincare/include/poincare/determinant.h +++ b/poincare/include/poincare/determinant.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/division.h b/poincare/include/poincare/division.h index 9942da27f..f631640ad 100644 --- a/poincare/include/poincare/division.h +++ b/poincare/include/poincare/division.h @@ -19,7 +19,7 @@ public: private: /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writeInfixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "/"); } diff --git a/poincare/include/poincare/division_quotient.h b/poincare/include/poincare/division_quotient.h index c40479ad5..318d09c0e 100644 --- a/poincare/include/poincare/division_quotient.h +++ b/poincare/include/poincare/division_quotient.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/division_remainder.h b/poincare/include/poincare/division_remainder.h index 86cb41e48..05a79ea73 100644 --- a/poincare/include/poincare/division_remainder.h +++ b/poincare/include/poincare/division_remainder.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index 4c5b96dd4..e13bcf9d8 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -145,11 +145,6 @@ public: PredictionInterval, SimplificationRoot, }; - enum class FloatDisplayMode { - Decimal = 0, - Scientific = 1, - Default = 2 - }; enum class ComplexFormat { Cartesian = 0, Polar = 1, @@ -214,7 +209,7 @@ public: } /* Layout Engine */ - ExpressionLayout * createLayout(FloatDisplayMode floatDisplayMode = FloatDisplayMode::Default, ComplexFormat complexFormat = ComplexFormat::Default) const; // Returned object must be deleted + ExpressionLayout * createLayout(PrintFloat::Mode floatDisplayMode = PrintFloat::Mode::Default, ComplexFormat complexFormat = ComplexFormat::Default) const; // Returned object must be deleted virtual int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const = 0; /* Simplification */ @@ -267,7 +262,7 @@ private: //TODO: What should be the implementation for complex? virtual int simplificationOrderSameType(const Expression * e, bool canBeInterrupted) const { return 0; } /* Layout Engine */ - virtual ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const = 0; + virtual ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const = 0; /* Simplification */ static void Reduce(Expression ** expressionAddress, Context & context, AngleUnit angleUnit, bool recursively = true); Expression * deepBeautify(Context & context, AngleUnit angleUnit); diff --git a/poincare/include/poincare/factor.h b/poincare/include/poincare/factor.h index 68e537eb2..4ded7f021 100644 --- a/poincare/include/poincare/factor.h +++ b/poincare/include/poincare/factor.h @@ -17,7 +17,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/factorial.h b/poincare/include/poincare/factorial.h index b427441d9..e6a173957 100644 --- a/poincare/include/poincare/factorial.h +++ b/poincare/include/poincare/factorial.h @@ -15,7 +15,7 @@ private: constexpr static int k_maxOperandValue = 100; /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; /* Simplication */ Expression * shallowReduce(Context& context, AngleUnit angleUnit) override; diff --git a/poincare/include/poincare/floor.h b/poincare/include/poincare/floor.h index db8b556f2..8a4196f32 100644 --- a/poincare/include/poincare/floor.h +++ b/poincare/include/poincare/floor.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, name()); } diff --git a/poincare/include/poincare/frac_part.h b/poincare/include/poincare/frac_part.h index 219931ed5..2fb4f6d88 100644 --- a/poincare/include/poincare/frac_part.h +++ b/poincare/include/poincare/frac_part.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/great_common_divisor.h b/poincare/include/poincare/great_common_divisor.h index ef55dc552..83d8f5d9e 100644 --- a/poincare/include/poincare/great_common_divisor.h +++ b/poincare/include/poincare/great_common_divisor.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/hyperbolic_arc_cosine.h b/poincare/include/poincare/hyperbolic_arc_cosine.h index a78daf06a..8bc94757e 100644 --- a/poincare/include/poincare/hyperbolic_arc_cosine.h +++ b/poincare/include/poincare/hyperbolic_arc_cosine.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/hyperbolic_arc_sine.h b/poincare/include/poincare/hyperbolic_arc_sine.h index a2c586032..41f7ac7bc 100644 --- a/poincare/include/poincare/hyperbolic_arc_sine.h +++ b/poincare/include/poincare/hyperbolic_arc_sine.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/hyperbolic_arc_tangent.h b/poincare/include/poincare/hyperbolic_arc_tangent.h index b19db8cfe..1beaa2947 100644 --- a/poincare/include/poincare/hyperbolic_arc_tangent.h +++ b/poincare/include/poincare/hyperbolic_arc_tangent.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/hyperbolic_cosine.h b/poincare/include/poincare/hyperbolic_cosine.h index 3a11979ec..a3325b86f 100644 --- a/poincare/include/poincare/hyperbolic_cosine.h +++ b/poincare/include/poincare/hyperbolic_cosine.h @@ -15,7 +15,7 @@ public: template static Complex computeOnComplex(const Complex c, AngleUnit angleUnit); private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/hyperbolic_sine.h b/poincare/include/poincare/hyperbolic_sine.h index d3cf039cb..83b4c5f2f 100644 --- a/poincare/include/poincare/hyperbolic_sine.h +++ b/poincare/include/poincare/hyperbolic_sine.h @@ -15,7 +15,7 @@ public: template static Complex computeOnComplex(const Complex c, AngleUnit angleUnit); private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/hyperbolic_tangent.h b/poincare/include/poincare/hyperbolic_tangent.h index a7b12dd5c..4ec0dabed 100644 --- a/poincare/include/poincare/hyperbolic_tangent.h +++ b/poincare/include/poincare/hyperbolic_tangent.h @@ -15,7 +15,7 @@ public: template static Complex computeOnComplex(const Complex c, AngleUnit angleUnit); private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/ieee754.h b/poincare/include/poincare/ieee754.h index 275d9c0c3..a7866ccd5 100644 --- a/poincare/include/poincare/ieee754.h +++ b/poincare/include/poincare/ieee754.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace Poincare { @@ -50,6 +51,28 @@ public: exp -= exponentOffset(); return exp; } + static int exponentBase10(T f) { + static T k_log10base2 = 3.321928094887362347870319429489390175864831393024580612054; + if (f == 0.0) { + return 0; + } + T exponentBase2 = exponent(f); + /* Compute the exponent in base 10 from exponent in base 2: + * f = m1*2^e1 + * f = m2*10^e2 + * --> f = m1*10^(e1/log(10,2)) + * --> f = m1*10^x*10^(e1/log(10,2)-x), with x in [-1,1] + * Thus e2 = e1/log(10,2)-x, + * with x such as 1 <= m1*10^x < 9 and e1/log(10,2)-x is round. + * Knowing that the equation 1 <= m1*10^x < 10 with 1<=m1<2 has its solution + * in -0.31 < x < 1, we get: + * e2 = [e1/log(10,2)] or e2 = [e1/log(10,2)]-1 depending on m1. */ + int exponentBase10 = std::round(exponentBase2/k_log10base2); + if (std::pow(10.0, exponentBase10) > std::fabs(f)) { + exponentBase10--; + } + return exponentBase10; + } private: union uint_float { uint64_t ui; diff --git a/poincare/include/poincare/imaginary_part.h b/poincare/include/poincare/imaginary_part.h index ee6f855c5..2c5757b7b 100644 --- a/poincare/include/poincare/imaginary_part.h +++ b/poincare/include/poincare/imaginary_part.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/integral.h b/poincare/include/poincare/integral.h index ccbfe2871..dcf2ed690 100644 --- a/poincare/include/poincare/integral.h +++ b/poincare/include/poincare/integral.h @@ -15,7 +15,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "int"); } diff --git a/poincare/include/poincare/layout_engine.h b/poincare/include/poincare/layout_engine.h index 690e82fa5..5b0f7b87d 100644 --- a/poincare/include/poincare/layout_engine.h +++ b/poincare/include/poincare/layout_engine.h @@ -7,8 +7,8 @@ namespace Poincare { class LayoutEngine { public: - static ExpressionLayout * createInfixLayout(const Expression * expression, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName); - static ExpressionLayout * createPrefixLayout(const Expression * expression, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName); + static ExpressionLayout * createInfixLayout(const Expression * expression, PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName); + static ExpressionLayout * createPrefixLayout(const Expression * expression, PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName); static int writeInfixExpressionTextInBuffer(const Expression * expression, char * buffer, int bufferSize, int numberOfDigits, const char * operatorName); static int writePrefixExpressionTextInBuffer(const Expression * expression, char * buffer, int bufferSize, int numberOfDigits, const char * operatorName); diff --git a/poincare/include/poincare/least_common_multiple.h b/poincare/include/poincare/least_common_multiple.h index e918a3af8..eddf83d93 100644 --- a/poincare/include/poincare/least_common_multiple.h +++ b/poincare/include/poincare/least_common_multiple.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/logarithm.h b/poincare/include/poincare/logarithm.h index ba8742e78..ded4cce79 100644 --- a/poincare/include/poincare/logarithm.h +++ b/poincare/include/poincare/logarithm.h @@ -15,7 +15,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "log"); } diff --git a/poincare/include/poincare/matrix.h b/poincare/include/poincare/matrix.h index 72e34b612..3cf62943a 100644 --- a/poincare/include/poincare/matrix.h +++ b/poincare/include/poincare/matrix.h @@ -31,7 +31,7 @@ public: template static Matrix * createApproximateIdentity(int dim); private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; /* Evaluation */ Expression * privateApproximate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } Expression * privateApproximate(DoublePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } diff --git a/poincare/include/poincare/matrix_dimension.h b/poincare/include/poincare/matrix_dimension.h index d8a95c724..f6b608b4c 100644 --- a/poincare/include/poincare/matrix_dimension.h +++ b/poincare/include/poincare/matrix_dimension.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/matrix_inverse.h b/poincare/include/poincare/matrix_inverse.h index b342d105e..0acae6ef6 100644 --- a/poincare/include/poincare/matrix_inverse.h +++ b/poincare/include/poincare/matrix_inverse.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Evaluation */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/matrix_trace.h b/poincare/include/poincare/matrix_trace.h index e4c46407c..14b140ad6 100644 --- a/poincare/include/poincare/matrix_trace.h +++ b/poincare/include/poincare/matrix_trace.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/matrix_transpose.h b/poincare/include/poincare/matrix_transpose.h index a212c153b..42ad6455a 100644 --- a/poincare/include/poincare/matrix_transpose.h +++ b/poincare/include/poincare/matrix_transpose.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/multiplication.h b/poincare/include/poincare/multiplication.h index 774f443f5..4f9599a41 100644 --- a/poincare/include/poincare/multiplication.h +++ b/poincare/include/poincare/multiplication.h @@ -33,7 +33,7 @@ private: Expression * setSign(Sign s, Context & context, AngleUnit angleUnit) override; /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; /* Simplification */ Expression * shallowReduce(Context& context, AngleUnit angleUnit) override; diff --git a/poincare/include/poincare/naperian_logarithm.h b/poincare/include/poincare/naperian_logarithm.h index 95ea9e9f2..89a5173d1 100644 --- a/poincare/include/poincare/naperian_logarithm.h +++ b/poincare/include/poincare/naperian_logarithm.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/nth_root.h b/poincare/include/poincare/nth_root.h index 143e156e3..dfd8f5392 100644 --- a/poincare/include/poincare/nth_root.h +++ b/poincare/include/poincare/nth_root.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, "root"); } diff --git a/poincare/include/poincare/opposite.h b/poincare/include/poincare/opposite.h index 0e5593516..876e0da42 100644 --- a/poincare/include/poincare/opposite.h +++ b/poincare/include/poincare/opposite.h @@ -16,7 +16,7 @@ public: private: /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; /* Simplification */ Expression * shallowReduce(Context& context, AngleUnit angleUnit) override; diff --git a/poincare/include/poincare/parenthesis.h b/poincare/include/poincare/parenthesis.h index 18ac775b3..653634561 100644 --- a/poincare/include/poincare/parenthesis.h +++ b/poincare/include/poincare/parenthesis.h @@ -14,7 +14,7 @@ public: Type type() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, ""); } diff --git a/poincare/include/poincare/permute_coefficient.h b/poincare/include/poincare/permute_coefficient.h index 0234c4ca2..63ad49a78 100644 --- a/poincare/include/poincare/permute_coefficient.h +++ b/poincare/include/poincare/permute_coefficient.h @@ -15,7 +15,7 @@ public: private: constexpr static int k_maxNValue = 100; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/power.h b/poincare/include/poincare/power.h index 5063e506b..82bd92798 100644 --- a/poincare/include/poincare/power.h +++ b/poincare/include/poincare/power.h @@ -28,7 +28,7 @@ private: /* Property */ Expression * setSign(Sign s, Context & context, AngleUnit angleUnit) override; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; bool needParenthesisWithParent(const Expression * e) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writeInfixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, name()); diff --git a/poincare/include/poincare/prediction_interval.h b/poincare/include/poincare/prediction_interval.h index 12b42f564..834c62773 100644 --- a/poincare/include/poincare/prediction_interval.h +++ b/poincare/include/poincare/prediction_interval.h @@ -13,7 +13,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/preferences.h b/poincare/include/poincare/preferences.h index 40925dbd6..fe751a825 100644 --- a/poincare/include/poincare/preferences.h +++ b/poincare/include/poincare/preferences.h @@ -11,15 +11,15 @@ public: static Preferences * sharedPreferences(); Expression::AngleUnit angleUnit() const; void setAngleUnit(Expression::AngleUnit angleUnit); - Expression::FloatDisplayMode displayMode() const; - void setDisplayMode(Expression::FloatDisplayMode FloatDisplayMode); + PrintFloat::Mode displayMode() const; + void setDisplayMode(PrintFloat::Mode mode); Expression::ComplexFormat complexFormat() const; void setComplexFormat(Expression::ComplexFormat complexFormat); char numberOfSignificantDigits() const; void setNumberOfSignificantDigits(char numberOfSignificantDigits); private: Expression::AngleUnit m_angleUnit; - Expression::FloatDisplayMode m_displayMode; + PrintFloat::Mode m_displayMode; Expression::ComplexFormat m_complexFormat; char m_numberOfSignificantDigits; }; diff --git a/poincare/include/poincare/print_float.h b/poincare/include/poincare/print_float.h index 5423b9d39..17cbc1951 100644 --- a/poincare/include/poincare/print_float.h +++ b/poincare/include/poincare/print_float.h @@ -7,6 +7,16 @@ namespace Poincare { namespace PrintFloat { + /* The 'Mode' refers to the way to display float 'scientific' or 'auto'. The + * scientific mode returns float with style -1.2E2 whereas the auto mode + * tries to return 'natural' float like (0.021) and switches to scientific + * mode if the float is too small or too big regarding the number of + * significant digits. */ + enum class Mode { + Decimal = 0, + Scientific = 1, + Default = 2 + }; constexpr static int bufferSizeForFloatsWithPrecision(int numberOfSignificantDigits) { // The wors case is -1.234E-38 return numberOfSignificantDigits + 7; @@ -35,11 +45,17 @@ namespace PrintFloat { * -1.99999999999999e-308*e^(-1.99999999999999e-308*i) (14+14+7+1 char) */ constexpr static int k_maxComplexBufferLength = k_maxFloatBufferLength-1+k_maxFloatBufferLength-1+7+1; - - // TODO: move these two functions here. Watch out, Expression::FloatDisplayMode has also to be moved. - //int convertFloatToText(T d, char * buffer, int bufferSize, int numberOfSignificantDigits, Expression::FloatDisplayMode mode = Expression::FloatDisplayMode::Default); - - //static int convertFloatToTextPrivate(T f, char * buffer, int numberOfSignificantDigits, Expression::FloatDisplayMode mode); + /* If the buffer size is too small to display the right number of significant + * digits, the function forces the scientific mode and cap the number of + * significant digits to fit the buffer. If the buffer is too small to + * display any float, the text representing the float is truncated at the end + * of the buffer. + * ConvertFloatToText return the number of characters that have been written + * in buffer (excluding the last \O character) */ + template + int convertFloatToText(T d, char * buffer, int bufferSize, int numberOfSignificantDigits, Mode mode = Mode::Default); + template + static int convertFloatToTextPrivate(T f, char * buffer, int numberOfSignificantDigits, Mode mode); } } diff --git a/poincare/include/poincare/randint.h b/poincare/include/poincare/randint.h index 4f977e35b..39d99e031 100644 --- a/poincare/include/poincare/randint.h +++ b/poincare/include/poincare/randint.h @@ -13,7 +13,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/random.h b/poincare/include/poincare/random.h index 9f5498b11..537b89106 100644 --- a/poincare/include/poincare/random.h +++ b/poincare/include/poincare/random.h @@ -17,7 +17,7 @@ public: private: Expression * setSign(Sign s, Context & context, AngleUnit angleUnit) override; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/rational.h b/poincare/include/poincare/rational.h index 5cdc313b9..075a43060 100644 --- a/poincare/include/poincare/rational.h +++ b/poincare/include/poincare/rational.h @@ -43,7 +43,7 @@ public: static int NaturalOrder(const Rational & i, const Rational & j); private: bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; Expression * privateApproximate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } Expression * privateApproximate(DoublePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } diff --git a/poincare/include/poincare/real_part.h b/poincare/include/poincare/real_part.h index a8ac670b6..16b6fdfd4 100644 --- a/poincare/include/poincare/real_part.h +++ b/poincare/include/poincare/real_part.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/round.h b/poincare/include/poincare/round.h index 1d972aee3..fa0bd81da 100644 --- a/poincare/include/poincare/round.h +++ b/poincare/include/poincare/round.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/sequence.h b/poincare/include/poincare/sequence.h index 735143e20..6815ce4f4 100644 --- a/poincare/include/poincare/sequence.h +++ b/poincare/include/poincare/sequence.h @@ -10,7 +10,7 @@ namespace Poincare { class Sequence : public StaticHierarchy<3> { using StaticHierarchy<3>::StaticHierarchy; private: - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return LayoutEngine::writePrefixExpressionTextInBuffer(this, buffer, bufferSize, numberOfSignificantDigits, name()); } diff --git a/poincare/include/poincare/simplification_root.h b/poincare/include/poincare/simplification_root.h index d24476a12..cae8466ce 100644 --- a/poincare/include/poincare/simplification_root.h +++ b/poincare/include/poincare/simplification_root.h @@ -19,7 +19,7 @@ public: } Expression * clone() const override { return nullptr; } Type type() const override { return Expression::Type::SimplificationRoot; } - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return nullptr; } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { return 0; } diff --git a/poincare/include/poincare/sine.h b/poincare/include/poincare/sine.h index eafe8f721..940cd5b78 100644 --- a/poincare/include/poincare/sine.h +++ b/poincare/include/poincare/sine.h @@ -17,7 +17,7 @@ public: template static Complex computeOnComplex(const Complex c, AngleUnit angleUnit = AngleUnit::Radian); private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/square_root.h b/poincare/include/poincare/square_root.h index 7f64c80b7..52b9f33f4 100644 --- a/poincare/include/poincare/square_root.h +++ b/poincare/include/poincare/square_root.h @@ -14,7 +14,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; /* Simplification */ Expression * shallowReduce(Context& context, AngleUnit angleUnit) override; diff --git a/poincare/include/poincare/store.h b/poincare/include/poincare/store.h index 4b85ed88f..b88fa98d4 100644 --- a/poincare/include/poincare/store.h +++ b/poincare/include/poincare/store.h @@ -17,7 +17,7 @@ private: /* Simplification */ Expression * shallowReduce(Context& context, AngleUnit angleUnit) override; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; /* Evalutation */ Expression * privateApproximate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } diff --git a/poincare/include/poincare/subtraction.h b/poincare/include/poincare/subtraction.h index e68a9c543..d158e59ad 100644 --- a/poincare/include/poincare/subtraction.h +++ b/poincare/include/poincare/subtraction.h @@ -16,7 +16,7 @@ public: private: /* Layout */ bool needParenthesisWithParent(const Expression * e) const override; - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createInfixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/symbol.h b/poincare/include/poincare/symbol.h index 1dec1c76e..4f78a7889 100644 --- a/poincare/include/poincare/symbol.h +++ b/poincare/include/poincare/symbol.h @@ -48,7 +48,7 @@ private: /* Comparison */ int simplificationOrderSameType(const Expression * e, bool canBeInterrupted) const override; /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; /* Evaluation */ Expression * privateApproximate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } diff --git a/poincare/include/poincare/tangent.h b/poincare/include/poincare/tangent.h index 5a075b918..40c8683bc 100644 --- a/poincare/include/poincare/tangent.h +++ b/poincare/include/poincare/tangent.h @@ -15,7 +15,7 @@ public: Expression * clone() const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override { + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, name()); } int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override { diff --git a/poincare/include/poincare/undefined.h b/poincare/include/poincare/undefined.h index 1231cdbda..dab87403e 100644 --- a/poincare/include/poincare/undefined.h +++ b/poincare/include/poincare/undefined.h @@ -13,7 +13,7 @@ public: int writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignificantDigits = PrintFloat::k_numberOfStoredSignificantDigits) const override; private: /* Layout */ - ExpressionLayout * privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const override; + ExpressionLayout * privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const override; /* Evaluation */ Expression * privateApproximate(SinglePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } Expression * privateApproximate(DoublePrecision p, Context& context, AngleUnit angleUnit) const override { return templatedApproximate(context, angleUnit); } diff --git a/poincare/src/absolute_value.cpp b/poincare/src/absolute_value.cpp index 62bbe0000..ef9217f47 100644 --- a/poincare/src/absolute_value.cpp +++ b/poincare/src/absolute_value.cpp @@ -24,8 +24,8 @@ Expression * AbsoluteValue::setSign(Sign s, Context & context, AngleUnit angleUn return this; } -ExpressionLayout * AbsoluteValue::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * AbsoluteValue::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new AbsoluteValueLayout(operand(0)->createLayout(floatDisplayMode, complexFormat)); } diff --git a/poincare/src/binomial_coefficient.cpp b/poincare/src/binomial_coefficient.cpp index 10c88ab60..8dba72b53 100644 --- a/poincare/src/binomial_coefficient.cpp +++ b/poincare/src/binomial_coefficient.cpp @@ -73,8 +73,8 @@ Expression * BinomialCoefficient::shallowReduce(Context& context, AngleUnit angl return replaceWith(new Rational(result), true); } -ExpressionLayout * BinomialCoefficient::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * BinomialCoefficient::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout * childrenLayouts[2]; childrenLayouts[0] = operand(0)->createLayout(floatDisplayMode, complexFormat); diff --git a/poincare/src/ceiling.cpp b/poincare/src/ceiling.cpp index 3fd5205e4..a49969daf 100644 --- a/poincare/src/ceiling.cpp +++ b/poincare/src/ceiling.cpp @@ -59,8 +59,8 @@ Complex Ceiling::computeOnComplex(const Complex c, AngleUnit angleUnit) { return Complex::Float(std::ceil(c.a())); } -ExpressionLayout * Ceiling::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Ceiling::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new CeilingLayout(m_operands[0]->createLayout(floatDisplayMode, complexFormat)); } diff --git a/poincare/src/complex.cpp b/poincare/src/complex.cpp index 668464fd9..d221801b6 100644 --- a/poincare/src/complex.cpp +++ b/poincare/src/complex.cpp @@ -19,30 +19,6 @@ extern "C" { namespace Poincare { -template -int exponent(T f) { - static T k_log10base2 = 3.321928094887362347870319429489390175864831393024580612054; - if (f == 0.0) { - return 0; - } - T exponentBase2 = IEEE754::exponent(f); - /* Compute the exponent in base 10 from exponent in base 2: - * f = m1*2^e1 - * f = m2*10^e2 - * --> f = m1*10^(e1/log(10,2)) - * --> f = m1*10^x*10^(e1/log(10,2)-x), with x in [-1,1] - * Thus e2 = e1/log(10,2)-x, - * with x such as 1 <= m1*10^x < 9 and e1/log(10,2)-x is round. - * Knowing that the equation 1 <= m1*10^x < 10 with 1<=m1<2 has its solution - * in -0.31 < x < 1, we get: - * e2 = [e1/log(10,2)] or e2 = [e1/log(10,2)]-1 depending on m1. */ - int exponentBase10 = std::round(exponentBase2/k_log10base2); - if (std::pow(10.0, exponentBase10) > std::fabs(f)) { - exponentBase10--; - } - return exponentBase10; -} - template Complex Complex::Float(T x) { return Complex(x,0); @@ -224,32 +200,7 @@ bool Complex::needParenthesisWithParent(const Expression * e) const { } } -template -int Complex::convertFloatToText(T f, char * buffer, int bufferSize, - int numberOfSignificantDigits, Expression::FloatDisplayMode mode) { - assert(numberOfSignificantDigits > 0); - if (mode == Expression::FloatDisplayMode::Default) { - return convertFloatToText(f, buffer, bufferSize, numberOfSignificantDigits, Preferences::sharedPreferences()->displayMode()); - } - char tempBuffer[PrintFloat::k_maxFloatBufferLength]; - int requiredLength = convertFloatToTextPrivate(f, tempBuffer, numberOfSignificantDigits, mode); - /* if the required buffer size overflows the buffer size, we first force the - * display mode to scientific and decrease the number of significant digits to - * fit the buffer size. If the buffer size is still to small, we only write - * the beginning of the float and truncate it (which can result in a non sense - * text) */ - if (mode == Expression::FloatDisplayMode::Decimal && requiredLength >= bufferSize) { - requiredLength = convertFloatToTextPrivate(f, tempBuffer, numberOfSignificantDigits, Expression::FloatDisplayMode::Scientific); - } - if (requiredLength >= bufferSize) { - int adjustedNumberOfSignificantDigits = numberOfSignificantDigits - requiredLength + bufferSize - 1; - adjustedNumberOfSignificantDigits = adjustedNumberOfSignificantDigits < 1 ? 1 : adjustedNumberOfSignificantDigits; - requiredLength = convertFloatToTextPrivate(f, tempBuffer, adjustedNumberOfSignificantDigits, Expression::FloatDisplayMode::Scientific); - } - requiredLength = requiredLength < bufferSize ? requiredLength : bufferSize; - strlcpy(buffer, tempBuffer, bufferSize); - return requiredLength; -} + template Complex::Complex(T a, T b) : @@ -259,8 +210,8 @@ Complex::Complex(T a, T b) : } template -ExpressionLayout * Complex::privateCreateLayout(Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat) const { - assert(floatDisplayMode != Expression::FloatDisplayMode::Default); +ExpressionLayout * Complex::privateCreateLayout(PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); if (complexFormat == Expression::ComplexFormat::Polar) { return createPolarLayout(floatDisplayMode); } @@ -272,7 +223,7 @@ Expression * Complex::CreateDecimal(T f) { if (std::isnan(f) || std::isinf(f)) { return new Undefined(); } - int e = exponent(f); + int e = IEEE754::exponentBase10(f); int64_t mantissaf = f * std::pow((T)10, -e+PrintFloat::k_numberOfStoredSignificantDigits+1); return new Decimal(Integer(mantissaf), e); } @@ -296,15 +247,15 @@ Complex * Complex::templatedApproximate(Context& context, Expression::Angl } template -int Complex::convertComplexToText(char * buffer, int bufferSize, int numberOfSignificantDigits, Expression::FloatDisplayMode displayMode, Expression::ComplexFormat complexFormat, char multiplicationSpecialChar) const { - assert(displayMode != Expression::FloatDisplayMode::Default); +int Complex::convertComplexToText(char * buffer, int bufferSize, int numberOfSignificantDigits, PrintFloat::Mode displayMode, Expression::ComplexFormat complexFormat, char multiplicationSpecialChar) const { + assert(displayMode != PrintFloat::Mode::Default); int numberOfChars = 0; if (std::isnan(m_a) || std::isnan(m_b) || std::isinf(m_a) || std::isinf(m_b)) { - return convertFloatToText(NAN, buffer, bufferSize, numberOfSignificantDigits, displayMode); + return PrintFloat::convertFloatToText(NAN, buffer, bufferSize, numberOfSignificantDigits, displayMode); } if (complexFormat == Expression::ComplexFormat::Polar) { if (r() != 1 || th() == 0) { - numberOfChars = convertFloatToText(r(), buffer, bufferSize, numberOfSignificantDigits, displayMode); + numberOfChars = PrintFloat::convertFloatToText(r(), buffer, bufferSize, numberOfSignificantDigits, displayMode); if (r() != 0 && th() != 0 && bufferSize > numberOfChars+1) { buffer[numberOfChars++] = multiplicationSpecialChar; // Ensure that the string is null terminated even if buffer size is to small @@ -319,7 +270,7 @@ int Complex::convertComplexToText(char * buffer, int bufferSize, int numberOf // Ensure that the string is null terminated even if buffer size is to small buffer[numberOfChars] = 0; } - numberOfChars += convertFloatToText(th(), buffer+numberOfChars, bufferSize-numberOfChars, numberOfSignificantDigits, displayMode); + numberOfChars += PrintFloat::convertFloatToText(th(), buffer+numberOfChars, bufferSize-numberOfChars, numberOfSignificantDigits, displayMode); if (bufferSize > numberOfChars+3) { buffer[numberOfChars++] = multiplicationSpecialChar; buffer[numberOfChars++] = Ion::Charset::IComplex; @@ -331,7 +282,7 @@ int Complex::convertComplexToText(char * buffer, int bufferSize, int numberOf } if (m_a != 0 || m_b == 0) { - numberOfChars = convertFloatToText(m_a, buffer, bufferSize, numberOfSignificantDigits, displayMode); + numberOfChars = PrintFloat::convertFloatToText(m_a, buffer, bufferSize, numberOfSignificantDigits, displayMode); if (m_b > 0 && !std::isnan(m_b) && bufferSize > numberOfChars+1) { buffer[numberOfChars++] = '+'; // Ensure that the string is null terminated even if buffer size is to small @@ -339,7 +290,7 @@ int Complex::convertComplexToText(char * buffer, int bufferSize, int numberOf } } if (m_b != 1 && m_b != -1 && m_b != 0) { - numberOfChars += convertFloatToText(m_b, buffer+numberOfChars, bufferSize-numberOfChars, numberOfSignificantDigits, displayMode); + numberOfChars += PrintFloat::convertFloatToText(m_b, buffer+numberOfChars, bufferSize-numberOfChars, numberOfSignificantDigits, displayMode); buffer[numberOfChars++] = multiplicationSpecialChar; } if (m_b == -1 && bufferSize > numberOfChars+1) { @@ -353,143 +304,18 @@ int Complex::convertComplexToText(char * buffer, int bufferSize, int numberOf } template -int Complex::convertFloatToTextPrivate(T f, char * buffer, int numberOfSignificantDigits, Expression::FloatDisplayMode mode) { - assert(mode != Expression::FloatDisplayMode::Default); - assert(numberOfSignificantDigits > 0); - /*if (std::isinf(f)) { - int currentChar = 0; - if (f < 0) { - buffer[currentChar++] = '-'; - } - buffer[currentChar++] = 'i'; - buffer[currentChar++] = 'n'; - buffer[currentChar++] = 'f'; - buffer[currentChar] = 0; - return currentChar; - }*/ - - if (std::isinf(f) || std::isnan(f)) { - int currentChar = 0; - buffer[currentChar++] = 'u'; - buffer[currentChar++] = 'n'; - buffer[currentChar++] = 'd'; - buffer[currentChar++] = 'e'; - buffer[currentChar++] = 'f'; - buffer[currentChar] = 0; - return currentChar; - } - - int exponentInBase10 = exponent(f); - - Expression::FloatDisplayMode displayMode = mode; - if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == Expression::FloatDisplayMode::Decimal) { - displayMode = Expression::FloatDisplayMode::Scientific; - } - - // Number of char available for the mantissa - int availableCharsForMantissaWithoutSign = numberOfSignificantDigits + 1; - int availableCharsForMantissaWithSign = f >= 0 ? availableCharsForMantissaWithoutSign : availableCharsForMantissaWithoutSign + 1; - - // Compute mantissa - /* The number of digits in an mantissa is capped because the maximal int64_t - * is 2^63 - 1. As our mantissa is an integer built from an int64_t, we assert - * that we stay beyond this threshold during computation. */ - assert(availableCharsForMantissaWithoutSign - 1 < std::log10(std::pow(2.0f, 63.0f))); - - int numberOfDigitBeforeDecimal = exponentInBase10 >= 0 || displayMode == Expression::FloatDisplayMode::Scientific ? - exponentInBase10 + 1 : 1; - - T unroundedMantissa = f * std::pow((T)10.0, (T)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal)); - T mantissa = std::round(unroundedMantissa); - - /* if availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal - * is too big (or too small), mantissa is now inf. We handle this case by - * using logarithm function. */ - if (std::isnan(mantissa) || std::isinf(mantissa)) { - mantissa = std::round(std::pow(10, std::log10(std::fabs(f))+(T)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))); - mantissa = std::copysign(mantissa, f); - } - /* We update the exponent in base 10 (if 0.99999999 was rounded to 1 for - * instance) - * NB: the following if-condition would rather be: - * "exponent(unroundedMantissa) != exponent(mantissa)", - * however, unroundedMantissa can have a different exponent than expected - * (ex: f = 1E13, unroundedMantissa = 99999999.99 and mantissa = 1000000000) */ - if (f != 0 && exponent(mantissa)-exponentInBase10 != availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal) { - exponentInBase10++; - } - - // Update the display mode if the exponent changed - if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == Expression::FloatDisplayMode::Decimal) { - displayMode = Expression::FloatDisplayMode::Scientific; - } - - int decimalMarkerPosition = exponentInBase10 < 0 || displayMode == Expression::FloatDisplayMode::Scientific ? - 1 : exponentInBase10+1; - decimalMarkerPosition = f < 0 ? decimalMarkerPosition+1 : decimalMarkerPosition; - - // Correct the number of digits in mantissa after rounding - int mantissaExponentInBase10 = exponentInBase10 > 0 || displayMode == Expression::FloatDisplayMode::Scientific ? availableCharsForMantissaWithoutSign - 1 : availableCharsForMantissaWithoutSign + exponentInBase10; - if (std::floor(std::fabs((T)mantissa) * std::pow((T)10, - mantissaExponentInBase10)) > 0) { - mantissa = mantissa/10; - } - - int numberOfCharExponent = exponentInBase10 != 0 ? std::log10(std::fabs((T)exponentInBase10)) + 1 : 1; - if (exponentInBase10 < 0){ - // If the exponent is < 0, we need a additional char for the sign - numberOfCharExponent++; - } - - // Supress the 0 on the right side of the mantissa - Integer dividend = Integer((int64_t)std::fabs(mantissa)); - Integer quotient = Integer::Division(dividend, Integer(10)).quotient; - Integer digit = Integer::Subtraction(dividend, Integer::Multiplication(quotient, Integer(10))); - int minimumNumberOfCharsInMantissa = 1; - while (digit.isZero() && availableCharsForMantissaWithoutSign > minimumNumberOfCharsInMantissa && - (availableCharsForMantissaWithoutSign > exponentInBase10+2 || displayMode == Expression::FloatDisplayMode::Scientific)) { - mantissa = mantissa/10; - availableCharsForMantissaWithoutSign--; - availableCharsForMantissaWithSign--; - dividend = quotient; - quotient = Integer::Division(dividend, Integer(10)).quotient; - digit = Integer::Subtraction(dividend, Integer::Multiplication(quotient, Integer(10))); - } - - // Suppress the decimal marker if no fractional part - if ((displayMode == Expression::FloatDisplayMode::Decimal && availableCharsForMantissaWithoutSign == exponentInBase10+2) - || (displayMode == Expression::FloatDisplayMode::Scientific && availableCharsForMantissaWithoutSign == 2)) { - availableCharsForMantissaWithSign--; - } - - // Print mantissa - assert(availableCharsForMantissaWithSign < PrintFloat::k_maxFloatBufferLength); - PrintFloat::printBase10IntegerWithDecimalMarker(buffer, availableCharsForMantissaWithSign, Integer((int64_t)mantissa), decimalMarkerPosition); - if (displayMode == Expression::FloatDisplayMode::Decimal || exponentInBase10 == 0) { - buffer[availableCharsForMantissaWithSign] = 0; - return availableCharsForMantissaWithSign; - } - // Print exponent - assert(availableCharsForMantissaWithSign < PrintFloat::k_maxFloatBufferLength); - buffer[availableCharsForMantissaWithSign] = Ion::Charset::Exponent; - assert(numberOfCharExponent+availableCharsForMantissaWithSign+1 < PrintFloat::k_maxFloatBufferLength); - PrintFloat::printBase10IntegerWithDecimalMarker(buffer+availableCharsForMantissaWithSign+1, numberOfCharExponent, Integer(exponentInBase10), -1); - buffer[availableCharsForMantissaWithSign+1+numberOfCharExponent] = 0; - return (availableCharsForMantissaWithSign+1+numberOfCharExponent); -} - -template -ExpressionLayout * Complex::createPolarLayout(Expression::FloatDisplayMode floatDisplayMode) const { +ExpressionLayout * Complex::createPolarLayout(PrintFloat::Mode floatDisplayMode) const { char bufferBase[PrintFloat::k_maxFloatBufferLength+2]; int numberOfCharInBase = 0; char bufferSuperscript[PrintFloat::k_maxFloatBufferLength+2]; int numberOfCharInSuperscript = 0; if (std::isnan(r()) || (std::isnan(th()) && r() != 0)) { - numberOfCharInBase = convertFloatToText(NAN, bufferBase, PrintFloat::k_maxComplexBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode); + numberOfCharInBase = PrintFloat::convertFloatToText(NAN, bufferBase, PrintFloat::k_maxComplexBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode); return new StringLayout(bufferBase, numberOfCharInBase); } if (r() != 1 || th() == 0) { - numberOfCharInBase = convertFloatToText(r(), bufferBase, PrintFloat::k_maxFloatBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode); + numberOfCharInBase = PrintFloat::convertFloatToText(r(), bufferBase, PrintFloat::k_maxFloatBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode); if (r() != 0 && th() != 0) { bufferBase[numberOfCharInBase++] = Ion::Charset::MiddleDot; } @@ -500,7 +326,7 @@ ExpressionLayout * Complex::createPolarLayout(Expression::FloatDisplayMode fl } if (r() != 0 && th() != 0) { - numberOfCharInSuperscript = convertFloatToText(th(), bufferSuperscript, PrintFloat::k_maxFloatBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode); + numberOfCharInSuperscript = PrintFloat::convertFloatToText(th(), bufferSuperscript, PrintFloat::k_maxFloatBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode); bufferSuperscript[numberOfCharInSuperscript++] = Ion::Charset::MiddleDot; bufferSuperscript[numberOfCharInSuperscript++] = Ion::Charset::IComplex; bufferSuperscript[numberOfCharInSuperscript] = 0; @@ -512,7 +338,7 @@ ExpressionLayout * Complex::createPolarLayout(Expression::FloatDisplayMode fl } template -ExpressionLayout * Complex::createCartesianLayout(Expression::FloatDisplayMode floatDisplayMode) const { +ExpressionLayout * Complex::createCartesianLayout(PrintFloat::Mode floatDisplayMode) const { char buffer[PrintFloat::k_maxComplexBufferLength]; int numberOfChars = convertComplexToText(buffer, PrintFloat::k_maxComplexBufferLength, Preferences::sharedPreferences()->numberOfSignificantDigits(), floatDisplayMode, Expression::ComplexFormat::Cartesian, Ion::Charset::MiddleDot); return new StringLayout(buffer, numberOfChars); diff --git a/poincare/src/conjugate.cpp b/poincare/src/conjugate.cpp index 0944df809..e2d697989 100644 --- a/poincare/src/conjugate.cpp +++ b/poincare/src/conjugate.cpp @@ -19,8 +19,8 @@ Expression * Conjugate::clone() const { return a; } -ExpressionLayout * Conjugate::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Conjugate::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new ConjugateLayout(operand(0)->createLayout(floatDisplayMode, complexFormat)); } diff --git a/poincare/src/decimal.cpp b/poincare/src/decimal.cpp index 0970c2550..efe7820b6 100644 --- a/poincare/src/decimal.cpp +++ b/poincare/src/decimal.cpp @@ -217,7 +217,7 @@ bool Decimal::needParenthesisWithParent(const Expression * e) const { return e->isOfType(types, 7); } -ExpressionLayout * Decimal::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { +ExpressionLayout * Decimal::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { char buffer[255]; int numberOfChars = writeTextInBuffer(buffer, 255); return new StringLayout(buffer, numberOfChars); diff --git a/poincare/src/division.cpp b/poincare/src/division.cpp index bc0ba869f..361409c7e 100644 --- a/poincare/src/division.cpp +++ b/poincare/src/division.cpp @@ -90,8 +90,8 @@ Complex Division::compute(const Complex c, const Complex d) { return Complex::Cartesian((temp*aa + ab) / norm, (temp*bb + ba) / norm); } -ExpressionLayout * Division::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Division::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); const Expression * numerator = operand(0)->type() == Type::Parenthesis ? operand(0)->operand(0) : operand(0); const Expression * denominator = operand(1)->type() == Type::Parenthesis ? operand(1)->operand(0) : operand(1); diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index 4a69cc516..e42073d14 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -213,9 +213,9 @@ int Expression::SimplificationOrder(const Expression * e1, const Expression * e2 /* Layout */ -ExpressionLayout * Expression::createLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { +ExpressionLayout * Expression::createLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { switch (floatDisplayMode) { - case FloatDisplayMode::Default: + case PrintFloat::Mode::Default: switch (complexFormat) { case ComplexFormat::Default: return privateCreateLayout(Preferences::sharedPreferences()->displayMode(), Preferences::sharedPreferences()->complexFormat()); diff --git a/poincare/src/factorial.cpp b/poincare/src/factorial.cpp index 2cbe6ab9a..573ac81f2 100644 --- a/poincare/src/factorial.cpp +++ b/poincare/src/factorial.cpp @@ -81,8 +81,8 @@ Complex Factorial::computeOnComplex(const Complex c, AngleUnit angleUnit) return Complex::Float(std::round(result)); } -ExpressionLayout * Factorial::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Factorial::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout * childrenLayouts[2]; childrenLayouts[0] = operand(0)->createLayout(floatDisplayMode, complexFormat); diff --git a/poincare/src/floor.cpp b/poincare/src/floor.cpp index 48892fe5d..4cfbceafe 100644 --- a/poincare/src/floor.cpp +++ b/poincare/src/floor.cpp @@ -56,8 +56,8 @@ Complex Floor::computeOnComplex(const Complex c, AngleUnit angleUnit) { return Complex::Float(std::floor(c.a())); } -ExpressionLayout * Floor::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Floor::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new FloorLayout(m_operands[0]->createLayout(floatDisplayMode, complexFormat)); } diff --git a/poincare/src/integral.cpp b/poincare/src/integral.cpp index b90d1070d..f9000e9f5 100644 --- a/poincare/src/integral.cpp +++ b/poincare/src/integral.cpp @@ -56,8 +56,8 @@ Complex * Integral::templatedApproximate(Context & context, AngleUnit angleUn return new Complex(Complex::Float(result)); } -ExpressionLayout * Integral::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Integral::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout * childrenLayouts[2]; childrenLayouts[0] = operand(0)->createLayout(floatDisplayMode, complexFormat); diff --git a/poincare/src/layout_engine.cpp b/poincare/src/layout_engine.cpp index e437a9a57..3c4dc5a01 100644 --- a/poincare/src/layout_engine.cpp +++ b/poincare/src/layout_engine.cpp @@ -8,8 +8,8 @@ extern "C" { namespace Poincare { -ExpressionLayout * LayoutEngine::createInfixLayout(const Expression * expression, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName) { - assert(floatDisplayMode != Expression::FloatDisplayMode::Default); +ExpressionLayout * LayoutEngine::createInfixLayout(const Expression * expression, PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName) { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != Expression::ComplexFormat::Default); int numberOfOperands = expression->numberOfOperands(); assert(numberOfOperands > 1); @@ -26,8 +26,8 @@ ExpressionLayout * LayoutEngine::createInfixLayout(const Expression * expression return layout; } -ExpressionLayout * LayoutEngine::createPrefixLayout(const Expression * expression, Expression::FloatDisplayMode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName) { - assert(floatDisplayMode != Expression::FloatDisplayMode::Default); +ExpressionLayout * LayoutEngine::createPrefixLayout(const Expression * expression, PrintFloat::Mode floatDisplayMode, Expression::ComplexFormat complexFormat, const char * operatorName) { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != Expression::ComplexFormat::Default); int numberOfOperands = expression->numberOfOperands(); ExpressionLayout * argumentLayouts = nullptr; diff --git a/poincare/src/logarithm.cpp b/poincare/src/logarithm.cpp index ee5fab2cf..820a27274 100644 --- a/poincare/src/logarithm.cpp +++ b/poincare/src/logarithm.cpp @@ -230,8 +230,8 @@ Expression * Logarithm::templatedApproximate(Context& context, AngleUnit angleUn return new Complex(result); } -ExpressionLayout * Logarithm::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Logarithm::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); if (numberOfOperands() == 1) { return LayoutEngine::createPrefixLayout(this, floatDisplayMode, complexFormat, "log"); diff --git a/poincare/src/matrix.cpp b/poincare/src/matrix.cpp index 2f8783666..1272ec81d 100644 --- a/poincare/src/matrix.cpp +++ b/poincare/src/matrix.cpp @@ -95,8 +95,8 @@ int Matrix::writeTextInBuffer(char * buffer, int bufferSize, int numberOfSignifi return currentChar; } -ExpressionLayout * Matrix::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Matrix::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout ** childrenLayouts = new ExpressionLayout * [numberOfOperands()]; for (int i = 0; i < numberOfOperands(); i++) { diff --git a/poincare/src/multiplication.cpp b/poincare/src/multiplication.cpp index 596b8391b..23eeeed04 100644 --- a/poincare/src/multiplication.cpp +++ b/poincare/src/multiplication.cpp @@ -40,7 +40,7 @@ bool Multiplication::needParenthesisWithParent(const Expression * e) const { return e->isOfType(types, 3); } -ExpressionLayout * Multiplication::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { +ExpressionLayout * Multiplication::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { const char middleDotString[] = {Ion::Charset::MiddleDot, 0}; return LayoutEngine::createInfixLayout(this, floatDisplayMode, complexFormat, middleDotString); } diff --git a/poincare/src/nth_root.cpp b/poincare/src/nth_root.cpp index e648818c0..bafba43e3 100644 --- a/poincare/src/nth_root.cpp +++ b/poincare/src/nth_root.cpp @@ -38,8 +38,8 @@ Expression * NthRoot::shallowReduce(Context& context, AngleUnit angleUnit) { return p->shallowReduce(context, angleUnit); } -ExpressionLayout * NthRoot::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * NthRoot::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new NthRootLayout(operand(0)->createLayout(floatDisplayMode, complexFormat), operand(1)->createLayout(floatDisplayMode, complexFormat)); } diff --git a/poincare/src/opposite.cpp b/poincare/src/opposite.cpp index 6fb75ef0c..babee161b 100644 --- a/poincare/src/opposite.cpp +++ b/poincare/src/opposite.cpp @@ -52,8 +52,8 @@ Expression * Opposite::shallowReduce(Context& context, AngleUnit angleUnit) { return m->shallowReduce(context, angleUnit); } -ExpressionLayout * Opposite::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Opposite::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout * children_layouts[2]; char string[2] = {'-', '\0'}; diff --git a/poincare/src/parenthesis.cpp b/poincare/src/parenthesis.cpp index e8a7985b6..ca66199a2 100644 --- a/poincare/src/parenthesis.cpp +++ b/poincare/src/parenthesis.cpp @@ -17,8 +17,8 @@ Expression * Parenthesis::clone() const { return o; } -ExpressionLayout * Parenthesis::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Parenthesis::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new ParenthesisLayout(operand(0)->createLayout(floatDisplayMode, complexFormat)); } diff --git a/poincare/src/power.cpp b/poincare/src/power.cpp index 0f9752294..cfb388997 100644 --- a/poincare/src/power.cpp +++ b/poincare/src/power.cpp @@ -120,8 +120,8 @@ bool Power::needParenthesisWithParent(const Expression * e) const { return e->isOfType(types, 2); } -ExpressionLayout * Power::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Power::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); const Expression * indiceOperand = m_operands[1]; // Delete eventual parentheses of the indice in the pretty print diff --git a/poincare/src/preferences.cpp b/poincare/src/preferences.cpp index c224419fd..16c635058 100644 --- a/poincare/src/preferences.cpp +++ b/poincare/src/preferences.cpp @@ -7,7 +7,7 @@ static Preferences s_preferences; Preferences::Preferences() : m_angleUnit(Expression::AngleUnit::Degree), - m_displayMode(Expression::FloatDisplayMode::Decimal), + m_displayMode(PrintFloat::Mode::Decimal), m_complexFormat(Expression::ComplexFormat::Cartesian), m_numberOfSignificantDigits(PrintFloat::k_numberOfPrintedSignificantDigits) { @@ -25,12 +25,12 @@ void Preferences::setAngleUnit(Expression::AngleUnit angleUnit) { m_angleUnit = angleUnit; } -Expression::FloatDisplayMode Preferences::displayMode() const { +PrintFloat::Mode Preferences::displayMode() const { return m_displayMode; } -void Preferences::setDisplayMode(Expression::FloatDisplayMode FloatDisplayMode) { - m_displayMode = FloatDisplayMode; +void Preferences::setDisplayMode(PrintFloat::Mode mode) { + m_displayMode = mode; } Expression::ComplexFormat Preferences::complexFormat() const { diff --git a/poincare/src/print_float.cpp b/poincare/src/print_float.cpp index fcc76ed8e..6ba8c240a 100644 --- a/poincare/src/print_float.cpp +++ b/poincare/src/print_float.cpp @@ -1,4 +1,6 @@ #include +#include +#include extern "C" { #include #include @@ -35,5 +37,160 @@ void PrintFloat::printBase10IntegerWithDecimalMarker(char * buffer, int bufferLe } } +template +int PrintFloat::convertFloatToText(T f, char * buffer, int bufferSize, + int numberOfSignificantDigits, Mode mode) { + assert(numberOfSignificantDigits > 0); + if (mode == Mode::Default) { + return convertFloatToText(f, buffer, bufferSize, numberOfSignificantDigits, Preferences::sharedPreferences()->displayMode()); + } + char tempBuffer[PrintFloat::k_maxFloatBufferLength]; + int requiredLength = convertFloatToTextPrivate(f, tempBuffer, numberOfSignificantDigits, mode); + /* if the required buffer size overflows the buffer size, we first force the + * display mode to scientific and decrease the number of significant digits to + * fit the buffer size. If the buffer size is still to small, we only write + * the beginning of the float and truncate it (which can result in a non sense + * text) */ + if (mode == Mode::Decimal && requiredLength >= bufferSize) { + requiredLength = convertFloatToTextPrivate(f, tempBuffer, numberOfSignificantDigits, Mode::Scientific); + } + if (requiredLength >= bufferSize) { + int adjustedNumberOfSignificantDigits = numberOfSignificantDigits - requiredLength + bufferSize - 1; + adjustedNumberOfSignificantDigits = adjustedNumberOfSignificantDigits < 1 ? 1 : adjustedNumberOfSignificantDigits; + requiredLength = convertFloatToTextPrivate(f, tempBuffer, adjustedNumberOfSignificantDigits, Mode::Scientific); + } + requiredLength = requiredLength < bufferSize ? requiredLength : bufferSize; + strlcpy(buffer, tempBuffer, bufferSize); + return requiredLength; +} + +template +int PrintFloat::convertFloatToTextPrivate(T f, char * buffer, int numberOfSignificantDigits, Mode mode) { + assert(mode != Mode::Default); + assert(numberOfSignificantDigits > 0); + /*if (std::isinf(f)) { + int currentChar = 0; + if (f < 0) { + buffer[currentChar++] = '-'; + } + buffer[currentChar++] = 'i'; + buffer[currentChar++] = 'n'; + buffer[currentChar++] = 'f'; + buffer[currentChar] = 0; + return currentChar; + }*/ + + if (std::isinf(f) || std::isnan(f)) { + int currentChar = 0; + buffer[currentChar++] = 'u'; + buffer[currentChar++] = 'n'; + buffer[currentChar++] = 'd'; + buffer[currentChar++] = 'e'; + buffer[currentChar++] = 'f'; + buffer[currentChar] = 0; + return currentChar; + } + + int exponentInBase10 = IEEE754::exponentBase10(f); + + Mode displayMode = mode; + if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == Mode::Decimal) { + displayMode = Mode::Scientific; + } + + // Number of char available for the mantissa + int availableCharsForMantissaWithoutSign = numberOfSignificantDigits + 1; + int availableCharsForMantissaWithSign = f >= 0 ? availableCharsForMantissaWithoutSign : availableCharsForMantissaWithoutSign + 1; + + // Compute mantissa + /* The number of digits in an mantissa is capped because the maximal int64_t + * is 2^63 - 1. As our mantissa is an integer built from an int64_t, we assert + * that we stay beyond this threshold during computation. */ + assert(availableCharsForMantissaWithoutSign - 1 < std::log10(std::pow(2.0f, 63.0f))); + + int numberOfDigitBeforeDecimal = exponentInBase10 >= 0 || displayMode == Mode::Scientific ? + exponentInBase10 + 1 : 1; + + T unroundedMantissa = f * std::pow((T)10.0, (T)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal)); + T mantissa = std::round(unroundedMantissa); + + /* if availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal + * is too big (or too small), mantissa is now inf. We handle this case by + * using logarithm function. */ + if (std::isnan(mantissa) || std::isinf(mantissa)) { + mantissa = std::round(std::pow(10, std::log10(std::fabs(f))+(T)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal))); + mantissa = std::copysign(mantissa, f); + } + /* We update the exponent in base 10 (if 0.99999999 was rounded to 1 for + * instance) + * NB: the following if-condition would rather be: + * "exponentBase10(unroundedMantissa) != exponentBase10(mantissa)", + * however, unroundedMantissa can have a different exponent than expected + * (ex: f = 1E13, unroundedMantissa = 99999999.99 and mantissa = 1000000000) */ + if (f != 0 && IEEE754::exponentBase10(mantissa)-exponentInBase10 != availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal) { + exponentInBase10++; + } + + // Update the display mode if the exponent changed + if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == Mode::Decimal) { + displayMode = Mode::Scientific; + } + + int decimalMarkerPosition = exponentInBase10 < 0 || displayMode == Mode::Scientific ? + 1 : exponentInBase10+1; + decimalMarkerPosition = f < 0 ? decimalMarkerPosition+1 : decimalMarkerPosition; + + // Correct the number of digits in mantissa after rounding + int mantissaExponentInBase10 = exponentInBase10 > 0 || displayMode == Mode::Scientific ? availableCharsForMantissaWithoutSign - 1 : availableCharsForMantissaWithoutSign + exponentInBase10; + if (std::floor(std::fabs((T)mantissa) * std::pow((T)10, - mantissaExponentInBase10)) > 0) { + mantissa = mantissa/10; + } + + int numberOfCharExponent = exponentInBase10 != 0 ? std::log10(std::fabs((T)exponentInBase10)) + 1 : 1; + if (exponentInBase10 < 0){ + // If the exponent is < 0, we need a additional char for the sign + numberOfCharExponent++; + } + + // Supress the 0 on the right side of the mantissa + Integer dividend = Integer((int64_t)std::fabs(mantissa)); + Integer quotient = Integer::Division(dividend, Integer(10)).quotient; + Integer digit = Integer::Subtraction(dividend, Integer::Multiplication(quotient, Integer(10))); + int minimumNumberOfCharsInMantissa = 1; + while (digit.isZero() && availableCharsForMantissaWithoutSign > minimumNumberOfCharsInMantissa && + (availableCharsForMantissaWithoutSign > exponentInBase10+2 || displayMode == Mode::Scientific)) { + mantissa = mantissa/10; + availableCharsForMantissaWithoutSign--; + availableCharsForMantissaWithSign--; + dividend = quotient; + quotient = Integer::Division(dividend, Integer(10)).quotient; + digit = Integer::Subtraction(dividend, Integer::Multiplication(quotient, Integer(10))); + } + + // Suppress the decimal marker if no fractional part + if ((displayMode == Mode::Decimal && availableCharsForMantissaWithoutSign == exponentInBase10+2) + || (displayMode == Mode::Scientific && availableCharsForMantissaWithoutSign == 2)) { + availableCharsForMantissaWithSign--; + } + + // Print mantissa + assert(availableCharsForMantissaWithSign < PrintFloat::k_maxFloatBufferLength); + PrintFloat::printBase10IntegerWithDecimalMarker(buffer, availableCharsForMantissaWithSign, Integer((int64_t)mantissa), decimalMarkerPosition); + if (displayMode == Mode::Decimal || exponentInBase10 == 0) { + buffer[availableCharsForMantissaWithSign] = 0; + return availableCharsForMantissaWithSign; + } + // Print exponent + assert(availableCharsForMantissaWithSign < PrintFloat::k_maxFloatBufferLength); + buffer[availableCharsForMantissaWithSign] = Ion::Charset::Exponent; + assert(numberOfCharExponent+availableCharsForMantissaWithSign+1 < PrintFloat::k_maxFloatBufferLength); + PrintFloat::printBase10IntegerWithDecimalMarker(buffer+availableCharsForMantissaWithSign+1, numberOfCharExponent, Integer(exponentInBase10), -1); + buffer[availableCharsForMantissaWithSign+1+numberOfCharExponent] = 0; + return (availableCharsForMantissaWithSign+1+numberOfCharExponent); +} + +template int PrintFloat::convertFloatToText(float, char*, int, int, PrintFloat::Mode); +template int PrintFloat::convertFloatToText(double, char*, int, int, PrintFloat::Mode); + } diff --git a/poincare/src/rational.cpp b/poincare/src/rational.cpp index 2b263e5f0..a58225f45 100644 --- a/poincare/src/rational.cpp +++ b/poincare/src/rational.cpp @@ -152,7 +152,7 @@ bool Rational::needParenthesisWithParent(const Expression * e) const { return e->isOfType(types, 3); } -ExpressionLayout * Rational::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { +ExpressionLayout * Rational::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { ExpressionLayout * numeratorLayout = m_numerator.createLayout(); if (m_denominator.isOne()) { return numeratorLayout; diff --git a/poincare/src/sequence.cpp b/poincare/src/sequence.cpp index 87386e816..76df88d4c 100644 --- a/poincare/src/sequence.cpp +++ b/poincare/src/sequence.cpp @@ -13,8 +13,8 @@ extern "C" { namespace Poincare { -ExpressionLayout * Sequence::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Sequence::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout * childrenLayouts[2]; childrenLayouts[0] = new StringLayout("n=", 2); diff --git a/poincare/src/square_root.cpp b/poincare/src/square_root.cpp index 4c83f7b24..4c06e70fe 100644 --- a/poincare/src/square_root.cpp +++ b/poincare/src/square_root.cpp @@ -49,8 +49,8 @@ Expression * SquareRoot::shallowReduce(Context& context, AngleUnit angleUnit) { return p->shallowReduce(context, angleUnit); } -ExpressionLayout * SquareRoot::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * SquareRoot::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); return new NthRootLayout(operand(0)->createLayout(floatDisplayMode, complexFormat),nullptr); } diff --git a/poincare/src/store.cpp b/poincare/src/store.cpp index 1ba76e3dc..15ed22406 100644 --- a/poincare/src/store.cpp +++ b/poincare/src/store.cpp @@ -30,8 +30,8 @@ Expression * Store::shallowReduce(Context& context, AngleUnit angleUnit) { return replaceWith(editableOperand(1), true)->shallowReduce(context, angleUnit); } -ExpressionLayout * Store::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Store::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); ExpressionLayout * childrenLayouts[3]; childrenLayouts[0] = value()->createLayout(floatDisplayMode, complexFormat); diff --git a/poincare/src/symbol.cpp b/poincare/src/symbol.cpp index a25feb4db..3b54fc770 100644 --- a/poincare/src/symbol.cpp +++ b/poincare/src/symbol.cpp @@ -172,8 +172,8 @@ char Symbol::name() const { return m_name; } -ExpressionLayout * Symbol::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { - assert(floatDisplayMode != FloatDisplayMode::Default); +ExpressionLayout * Symbol::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { + assert(floatDisplayMode != PrintFloat::Mode::Default); assert(complexFormat != ComplexFormat::Default); if (m_name == SpecialSymbols::Ans) { return new StringLayout("ans", 3); diff --git a/poincare/src/undefined.cpp b/poincare/src/undefined.cpp index a3aba0204..7c609e46c 100644 --- a/poincare/src/undefined.cpp +++ b/poincare/src/undefined.cpp @@ -18,9 +18,9 @@ template Complex * Undefined::templatedApproximate(Context& conte return new Complex(Complex::Float(NAN)); } -ExpressionLayout * Undefined::privateCreateLayout(FloatDisplayMode floatDisplayMode, ComplexFormat complexFormat) const { +ExpressionLayout * Undefined::privateCreateLayout(PrintFloat::Mode floatDisplayMode, ComplexFormat complexFormat) const { char buffer[16]; - int numberOfChars = Complex::convertFloatToText(NAN, buffer, 16, 1, floatDisplayMode); + int numberOfChars = PrintFloat::convertFloatToText(NAN, buffer, 16, 1, floatDisplayMode); return new StringLayout(buffer, numberOfChars); } diff --git a/poincare/test/convert_expression_to_text.cpp b/poincare/test/convert_expression_to_text.cpp index ab4e483d1..cde9a4ee2 100644 --- a/poincare/test/convert_expression_to_text.cpp +++ b/poincare/test/convert_expression_to_text.cpp @@ -8,13 +8,13 @@ #include "helper.h" using namespace Poincare; -constexpr Expression::FloatDisplayMode DecimalDisplay = Expression::FloatDisplayMode::Decimal; -constexpr Expression::FloatDisplayMode ScientificDisplay = Expression::FloatDisplayMode::Scientific; +constexpr PrintFloat::Mode DecimalDisplay = PrintFloat::Mode::Decimal; +constexpr PrintFloat::Mode ScientificDisplay = PrintFloat::Mode::Scientific; constexpr Expression::ComplexFormat Cartesian = Expression::ComplexFormat::Cartesian; constexpr Expression::ComplexFormat Polar = Expression::ComplexFormat::Polar; template -void assert_float_prints_to(T a, const char * result, Expression::FloatDisplayMode mode = ScientificDisplay, int significantDigits = 7, int bufferSize = 250) { +void assert_float_prints_to(T a, const char * result, PrintFloat::Mode mode = ScientificDisplay, int significantDigits = 7, int bufferSize = 250) { quiz_print(result); int tagSize = 8; @@ -23,7 +23,7 @@ void assert_float_prints_to(T a, const char * result, Expression::FloatDisplayMo memset(taggedBuffer, tag, bufferSize+2*tagSize); char * buffer = taggedBuffer + tagSize; - Complex::convertFloatToText(a, buffer, bufferSize, significantDigits, mode); + PrintFloat::convertFloatToText(a, buffer, bufferSize, significantDigits, mode); for (int i=0; i