{
  "category": "Statistical functions",
  "display_name": "GROWTH",
  "entry_kind": "built_in_function",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.GROWTH",
  "implementation_state": {
    "answer_bank": {
      "excel_builds": [
        "20228"
      ],
      "larger_numeric": 0,
      "last_bit": 6,
      "matched": 1254,
      "other_mismatch": 0,
      "refused": 0,
      "rows": 1260,
      "unread": 0,
      "worst_ulp": 1
    },
    "detail": "Everything else matches (1,260 in the answer bank and 151 workbook cells). Last-bit means a finite number within 16 ULP of Excel's.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "close",
    "state_label": "Close: last-bit deviations remain",
    "summary": "Close: 6 of 1,411 recorded answers differ in the last bits, worst 1 ULP",
    "workbook_corpus": {
      "cells": 151,
      "matched": 151
    }
  },
  "implementations": [
    {
      "commit": "9e1884369a678158dd82d3d74188daf986995e87",
      "flavour": "excel-compatibility-candidate",
      "language": "Rust",
      "name": "CalcFunc",
      "own_code": [
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/statistics.rs#L427-L429",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/regression_forecast_family.rs#L825-L834",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/regression_forecast_family.rs#L836-L844",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/regression_forecast_family.rs#L929-L943",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/regression_forecast_family.rs#L1179-L1198"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/statistics::regression",
        "ported/excel_numeric::binary_with",
        "ported/excel_numeric::excel_x87_add",
        "ported/excel_numeric::excel_x87_sub",
        "ported/excel_numeric::excel_x87_mul",
        "ported/excel_numeric::excel_x87_div",
        "ported/excel_numeric/x87::mul",
        "ported/excel_numeric/x87::add",
        "ported/excel_numeric/x87::sub",
        "ported/excel_numeric/x87::div",
        "ported/regression_forecast_family::GramInterval::checked",
        "ported/regression_forecast_family::GramInterval::subtract",
        "ported/regression_forecast_family::GramInterval::multiply",
        "ported/regression_forecast_family::GramInterval::square",
        "ported/regression_forecast_family::GramInterval::divide_positive",
        "ported/regression_forecast_family::moment",
        "ported/regression_forecast_family::column",
        "ported/regression_forecast_family::entry",
        "ported/regression_forecast_family::factor_column",
        "ported/regression_forecast_family::unresolved_inner",
        "ported/regression_forecast_family::unresolved",
        "ported/regression_forecast_family::resolve_arg_eval",
        "ported/regression_forecast_family::optional_arg_value",
        "ported/regression_forecast_family::numeric_from_cell",
        "ported/regression_forecast_family::numeric_scalar_from_eval",
        "ported/regression_forecast_family::bool_flag_from_eval_or_default",
        "ported/regression_forecast_family::collect_numeric_vector_from_eval",
        "ported/regression_forecast_family::collect_numeric_vector_arg",
        "ported/regression_forecast_family::NumericMatrix::cell",
        "ported/regression_forecast_family::NumericMatrix::transpose",
        "ported/regression_forecast_family::NumericMatrix::row_values",
        "ported/regression_forecast_family::collect_numeric_matrix_from_eval",
        "ported/regression_forecast_family::collect_numeric_matrix_arg",
        "ported/regression_forecast_family::sequence_predictors",
        "ported/regression_forecast_family::default_output_shape_for_known_y",
        "ported/regression_forecast_family::normalize_known_x_matrix",
        "ported/regression_forecast_family::prepare_predictor_input",
        "ported/regression_forecast_family::predictor_input_from_optional",
        "ported/regression_forecast_family::prediction_input_from_optional",
        "ported/regression_forecast_family::least_squares",
        "ported/regression_forecast_family::exact_product",
        "ported/regression_forecast_family::exactly_proportional",
        "ported/regression_forecast_family::linear_fit_from_data",
        "ported/regression_forecast_family::exponential_fit_from_data",
        "ported/regression_forecast_family::eval_value_from_output_shape"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/statistics.rs#L427-L429",
      "state": "close",
      "suite": null,
      "summary": "Close: 6 of 1,411 recorded answers differ in the last bits, worst 1 ULP"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.GROWTH.json",
  "name": "GROWTH",
  "notes": [],
  "schema": "efh.function-reference/v1",
  "section_order": [
    "what-it-does",
    "try-it",
    "quirks",
    "how-to-implement",
    "version-differences",
    "alternatives"
  ],
  "sections": {
    "alternatives": "\n[LOGEST](FUNC.LOGEST.md) returns exponential-model coefficients; [TREND](FUNC.TREND.md) fits an additive linear model; [FORECAST.LINEAR](FUNC.FORECAST.LINEAR.md) makes a one-predictor linear forecast.\n\n\n",
    "how-to-implement": "\n1. Prepare the observation vector, predictor columns and requested output layout. Apply omitted-x defaults before fitting.\n2. Validate positive finite y values and obtain each stored public `LN(y)` result.\n3. Fit a linear least-squares model to those logarithms. With a constant, the current code centres predictor columns and the transformed response on their forward-sum means. It uses a pivoted Householder QR fit, selecting the largest remaining predictor-column squared norm first; the constant column keeps its own position. Without a constant, it fits the raw transformed data with zero intercept.\n4. For each new predictor vector, start `P=1`. In predictor order, compute the ordinary binary64 product `u_j=coefficient_j*x_j`, obtain the public `EXP(u_j)`, and multiply it into P with ordinary binary64 multiplication.\n5. Return `EXP(intercept)*P`, in the requested shape. Do not replace this prediction tree by `EXP(intercept+sum(coefficient_j*x_j))`: it stores different intermediates.\n\nFor the two-predictor example, the mathematical log coefficients are `LN(2)`, `LN(3)` and `LN(5)`. At `(2,1)`, the separate exponentials represent factors two, nine and five, whose product is ninety. The calculated coefficients and exponentials can differ in their last bits from those mathematical values.\n\nThe source retains specific reflector stores and structural/numerical rank decisions, with remaining accumulator-layout questions. A generic QR library supplies a mathematical alternative, not the complete measured Excel fit. The outer prediction tree above is distinct from those unresolved fitting details, and no whole-function Handbook suite is published.\n\n\n",
    "quirks": "\nKnown y values must be positive; zero or a negative observation gives `#NUM!`. The predictor layout matters when there is more than one independent variable:\n\n| Known y layout | Predictor layout |\n|---|---|\n| One column of observations | One predictor per column of known/new x data |\n| One row of observations | One predictor per row of known/new x data |\n\nWith multiple predictors, known y must be a vector. New data needs the same number of predictors as training data. For one predictor, Microsoft also allows equally shaped known x and y ranges of other shapes.\n\n`const=FALSE` fits a new model with b fixed at one: it sets the log-space intercept to zero and adjusts the slopes. It does not take a fit with an intercept and simply remove its constant afterward. Duplicate or nearly dependent predictor columns require a rank decision, which can affect coefficients and predictions.\n\n\n",
    "sources": "\n- [Microsoft: GROWTH function](https://support.microsoft.com/en-us/excel/functions/growth-function), opened 6 November 2026; syntax, documented argument rules and errors.\n- [DnaCalc implementation](https://github.com/DnaCalc/DnaCalc/blob/da3ecc4fb19a3a5529708c311d0e8f05688ac165/crates/calc-func/src/ported/regression_forecast_family.rs); implementation steps and the limits identified in the text.\n\n",
    "try-it": "\n`=GROWTH({3,9,27},{1,2,3},{4,5})` returns approximately `{81,243}`. The fitted mathematical model is `3^x`, so each step triples the prediction.\n\nTo see the role of the constant, use `=GROWTH({6,18,54},{1,2,3},{0,4})`. The mathematical model is `2*3^x`, giving approximately `{2,162}`. With the final `const` argument FALSE, the prediction at x=0 is one because the fitted multiplier b is fixed at one.\n\nA two-predictor example is `=GROWTH({2;6;10;30},{0,0;1,0;0,1;1,1},{2,1})`, approximately `90`. The observations fit `2*3^x1*5^x2`; at `(2,1)`, the prediction is `2*9*5`.\n\n\n",
    "version-differences": "The recorded environments below distinguish a reading from a same-input comparison. Counts describe captured inputs in each environment; overlapping captures and comparisons are not totals of unique worksheet calls.\n\n| Excel 16.0 build | Platform and CPU | Captured inputs |\n|---|---|---:|\n| 20228 | Windows, 64-bit, CPU not recorded | 180 |\n\nThe record contains no same-input comparison between these environments. Reading different inputs on different builds does not establish either a version change or cross-build agreement.\n\n[Recorded environments and comparison details](https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.GROWTH.json).",
    "what-it-does": "\n`GROWTH(known_ys,[known_xs],[new_xs],[const])` fits an exponential relationship and returns a prediction for each new observation. With one predictor the model is `y=b*m^x`; with several, it is `y=b*m1^x1*m2^x2*...`.\n\nOmitting known x values substitutes positions one, two and so on. Omitting new x values predicts at the training positions. This second use returns fitted values, which need not equal noisy observed y values.\n\n\n"
  },
  "signature": {
    "display": "GROWTH(known_ys, [known_xs], [new_xs], [const])",
    "parameters": [
      {
        "description": null,
        "name": "known_ys",
        "optional": false,
        "repeats": false
      },
      {
        "description": null,
        "name": "known_xs",
        "optional": true,
        "repeats": false
      },
      {
        "description": null,
        "name": "new_xs",
        "optional": true,
        "repeats": false
      },
      {
        "description": null,
        "name": "const",
        "optional": true,
        "repeats": false
      }
    ],
    "trailing_repeats": false
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 4,
        "min": 1
      },
      "category": "Statistical functions",
      "classification": {
        "arg_preparation_profile": "RefsVisibleInAdapter",
        "coercion_lift_profile": "Custom",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "None",
        "fec_dependency_profile": "RefOnly",
        "host_interaction_class": "None",
        "kernel_signature_class": "Custom",
        "rich_value_usage": "RichBlind",
        "surface_fec_dependency_profile": "RefOnly",
        "thread_safety_class": "SafePure",
        "volatility_class": "NonVolatile"
      },
      "descriptions": {
        "long": null,
        "short": "Values predicted on the exponential curve fitted to known data",
        "short_source": "dna-calc-own"
      },
      "docs": {
        "english_description": "Returns values along an exponential trend",
        "microsoft_url": "https://support.microsoft.com/en-us/office/growth-function-541a91dc-3d5e-437d-b156-21324e68b80d"
      },
      "entry_kind": "built_in_function",
      "localized_family_names": null,
      "localized_names": [
        {
          "locale": "ar-SA",
          "name": "GROWTH"
        },
        {
          "locale": "bg-BG",
          "name": "GROWTH"
        },
        {
          "locale": "cs-CZ",
          "name": "LOGLINTREND"
        },
        {
          "locale": "da-DK",
          "name": "FORØGELSE"
        },
        {
          "locale": "de-DE",
          "name": "GROWTH"
        },
        {
          "locale": "el-GR",
          "name": "GROWTH"
        },
        {
          "locale": "en-AU",
          "name": "GROWTH"
        },
        {
          "locale": "en-GB",
          "name": "GROWTH"
        },
        {
          "locale": "en-US",
          "name": "GROWTH"
        },
        {
          "locale": "es-ES",
          "name": "CRECIMIENTO"
        },
        {
          "locale": "et-EE",
          "name": "GROWTH"
        },
        {
          "locale": "fi-FI",
          "name": "KASVU"
        },
        {
          "locale": "fr-FR",
          "name": "CROISSANCE*"
        },
        {
          "locale": "he-IL",
          "name": "GROWTH"
        },
        {
          "locale": "hr-HR",
          "name": "GROWTH"
        },
        {
          "locale": "hu-HU",
          "name": "NÖV"
        },
        {
          "locale": "id-ID",
          "name": "GROWTH"
        },
        {
          "locale": "it-IT",
          "name": "GROWTH"
        },
        {
          "locale": "ja-JP",
          "name": "GROWTH"
        },
        {
          "locale": "ko-KR",
          "name": "GROWTH"
        },
        {
          "locale": "lt-LT",
          "name": "GROWTH"
        },
        {
          "locale": "lv-LV",
          "name": "GROWTH"
        },
        {
          "locale": "nb-NO",
          "name": "VEKST"
        },
        {
          "locale": "nl-NL",
          "name": "GROEI"
        },
        {
          "locale": "pl-PL",
          "name": "REGEXPW"
        },
        {
          "locale": "pt-BR",
          "name": "CRESCIMENTO"
        },
        {
          "locale": "pt-PT",
          "name": "CRESCIMENTO"
        },
        {
          "locale": "ro-RO",
          "name": "GROWTH"
        },
        {
          "locale": "ru-RU",
          "name": "РОСТ"
        },
        {
          "locale": "sk-SK",
          "name": "RASTOVÝ"
        },
        {
          "locale": "sl-SI",
          "name": "GROWTH"
        },
        {
          "locale": "sr-Latn-RS",
          "name": "RAST"
        },
        {
          "locale": "sv-SE",
          "name": "EXPTREND"
        },
        {
          "locale": "th-TH",
          "name": "GROWTH"
        },
        {
          "locale": "tr-TR",
          "name": "BÜYÜME"
        },
        {
          "locale": "uk-UA",
          "name": "GROWTH"
        },
        {
          "locale": "vi-VN",
          "name": "GROWTH"
        },
        {
          "locale": "zh-CN",
          "name": "GROWTH"
        },
        {
          "locale": "zh-HK",
          "name": "GROWTH"
        },
        {
          "locale": "zh-TW",
          "name": "GROWTH"
        }
      ],
      "signature": {
        "display": "GROWTH(known_ys, [known_xs], [new_xs], [const])",
        "parameters": [
          {
            "description": null,
            "name": "known_ys",
            "optional": false,
            "repeats": false
          },
          {
            "description": null,
            "name": "known_xs",
            "optional": true,
            "repeats": false
          },
          {
            "description": null,
            "name": "new_xs",
            "optional": true,
            "repeats": false
          },
          {
            "description": null,
            "name": "const",
            "optional": true,
            "repeats": false
          }
        ],
        "trailing_repeats": false
      },
      "surface_name": "GROWTH",
      "version_marker": null,
      "xlcall": {
        "code": "52",
        "symbol": "xlfGrowth"
      }
    },
    "microsoft": "https://support.microsoft.com/en-us/office/growth-function-541a91dc-3d5e-437d-b156-21324e68b80d"
  },
  "try_it": {
    "formula": "=GROWTH({3,9,27},{1,2,3},{4,5})"
  },
  "url": "https://handbook.dnacalc.com/functions/GROWTH.html",
  "variants": [],
  "versions": [
    {
      "behaviour": "180 captured inputs are indexed for this environment. Capture dates: 2026-08-09 to 2026-08-09. This is a reading count, not a comparison with another build.",
      "excel_build": "16.0 build 20228",
      "platform": "Windows, 64-bit, CPU not recorded",
      "sources": [
        "https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.GROWTH.json"
      ]
    }
  ]
}