Excel 16.0 build 20228
Windows, 64-bit, CPU not recorded
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.
Statistical functions
Close: 6 of 1,411 recorded answers differ in the last bits, worst 1 ULP
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. How we measure this · See the Rust code
| Language | Name in Excel |
|---|---|
| Arabic | GROWTH |
| Bulgarian | GROWTH |
| Czech | LOGLINTREND |
| Danish | FORØGELSE |
| German | GROWTH |
| Greek | GROWTH |
| English (Australia) | GROWTH |
| English (United Kingdom) | GROWTH |
| English (United States) | GROWTH |
| Spanish | CRECIMIENTO |
| Estonian | GROWTH |
| Finnish | KASVU |
| French | CROISSANCE |
| Hebrew | GROWTH |
| Croatian | GROWTH |
| Hungarian | NÖV |
| Indonesian | GROWTH |
| Italian | GROWTH |
| Japanese | GROWTH |
| Korean | GROWTH |
| Lithuanian | GROWTH |
| Latvian | GROWTH |
| Norwegian | VEKST |
| Dutch | GROEI |
| Polish | REGEXPW |
| Portuguese (Brazil) | CRESCIMENTO |
| Portuguese (Portugal) | CRESCIMENTO |
| Romanian | GROWTH |
| Russian | РОСТ |
| Slovak | RASTOVÝ |
| Slovenian | GROWTH |
| Serbian (Latin) | RAST |
| Swedish | EXPTREND |
| Thai | GROWTH |
| Turkish | BÜYÜME |
| Ukrainian | GROWTH |
| Vietnamese | GROWTH |
| Chinese (Simplified) | GROWTH |
| Chinese (Hong Kong) | GROWTH |
| Chinese (Traditional) | GROWTH |
Names from Microsoft's support site.
GROWTH(known_ys, [known_xs], [new_xs], [const])
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*....
Omitting 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.
=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.
To 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.
A 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.
Known y values must be positive; zero or a negative observation gives #NUM!. The predictor layout matters when there is more than one independent variable:
| Known y layout | Predictor layout |
|---|---|
| One column of observations | One predictor per column of known/new x data |
| One row of observations | One predictor per row of known/new x data |
With 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.
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.
LN(y) result.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.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.For 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.
The 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.
Quoted from the public repository DnaCalc/DnaCalc, crates calc-func and calc-fml, at commit 9e1884369a67. Comments are the source's own. A kernel shared with other functions appears once, on its module page.
GROWTH · 3 lines · calc-func/src/catalogue/statistics.rs on GitHub56 growth "GROWTH" (1, 4) [R "known_ys", R "known_xs", R "new_xs", V "const"] |s, a, sv| {
regression(s, a, sv, k::regression_forecast_family::eval_growth_surface, RegressionNumbers::Forecast)
}
exponential_prediction · 10 lines · calc-func/src/ported/regression_forecast_family.rs on GitHub/// A GROWTH prediction: the product of `EXP(b_j*x_j)` in predictor order, from 1, then
/// `EXP(intercept)` times it.
fn exponential_prediction(model: &LinearRegressionModel, x: &[f64]) -> f64 {
let product = model
.coefficients
.iter()
.zip(x.iter())
.fold(1.0, |product, (b, x)| product * excel_numeric::excel_exp(b * x));
excel_numeric::excel_exp(model.intercept) * product
}
exponential_model_from_data · 9 lines · calc-func/src/ported/regression_forecast_family.rs on GitHub/// The fit of LOGEST and GROWTH: the least-squares fit of the worksheet LN of each y (#NUM! for
/// a y that is not positive).
fn exponential_model_from_data(
known_y: &NumericVector,
known_x: &PreparedPredictorInput,
use_const: bool,
) -> Result<LinearRegressionModel, WorksheetErrorCode> {
exponential_fit_from_data(known_y, known_x, use_const).map(|fit| fit.model)
}
growth_kernel · 15 lines · calc-func/src/ported/regression_forecast_family.rs on GitHubfn growth_kernel(
known_y: &NumericVector,
known_x: &PreparedPredictorInput,
new_x: &PreparedPredictorInput,
use_const: bool,
) -> Result<CalcValue, WorksheetErrorCode> {
let model = exponential_model_from_data(known_y, known_x, use_const)?;
if new_x.predictors.cols != model.coefficients.len() {
return Err(WorksheetErrorCode::Ref);
}
let predicted = (0..new_x.predictors.rows)
.map(|row_idx| exponential_prediction(&model, new_x.predictors.row_values(row_idx)))
.collect::<Vec<_>>();
eval_value_from_output_shape(&predicted, new_x.output_shape)
}
eval_growth_surface · 20 lines · calc-func/src/ported/regression_forecast_family.rs on GitHubpub(crate) fn eval_growth_surface(
args: &[CalcValue]
) -> Result<CalcValue, WorksheetErrorCode> {
let known_y = collect_numeric_vector_arg(&args[0])?;
let known_x_raw = args
.get(1)
.filter(|arg| !matches!(arg.core_ref(), CoreRef::Missing))
.map(|arg| collect_numeric_matrix_arg(arg))
.transpose()?;
let known_x = predictor_input_from_optional(known_x_raw, &known_y)?;
let new_x_raw = args
.get(2)
.filter(|arg| !matches!(arg.core_ref(), CoreRef::Missing))
.map(|arg| collect_numeric_matrix_arg(arg))
.transpose()?;
let new_x = prediction_input_from_optional(new_x_raw, &known_y, &known_x)?;
let use_const =
bool_flag_from_eval_or_default(optional_arg_value(args.get(3))?, true)?;
growth_kernel(&known_y, &known_x, &new_x, use_const)
}
regression catalogue/statisticsbinary_with ported/excel_numericexcel_x87_add ported/excel_numericexcel_x87_sub ported/excel_numericexcel_x87_mul ported/excel_numericexcel_x87_div ported/excel_numericmul ported/excel_numeric/x87add ported/excel_numeric/x87sub ported/excel_numeric/x87div ported/excel_numeric/x87GramInterval::checked ported/regression_forecast_familyGramInterval::subtract ported/regression_forecast_familyGramInterval::multiply ported/regression_forecast_familyGramInterval::square ported/regression_forecast_familyGramInterval::divide_positive ported/regression_forecast_familymoment ported/regression_forecast_familycolumn ported/regression_forecast_familyentry ported/regression_forecast_familyfactor_column ported/regression_forecast_familyunresolved_inner ported/regression_forecast_familyunresolved ported/regression_forecast_familyresolve_arg_eval ported/regression_forecast_familyoptional_arg_value ported/regression_forecast_familynumeric_from_cell ported/regression_forecast_familynumeric_scalar_from_eval ported/regression_forecast_familybool_flag_from_eval_or_default ported/regression_forecast_familycollect_numeric_vector_from_eval ported/regression_forecast_familycollect_numeric_vector_arg ported/regression_forecast_familyNumericMatrix::cell ported/regression_forecast_familyNumericMatrix::transpose ported/regression_forecast_familyNumericMatrix::row_values ported/regression_forecast_familycollect_numeric_matrix_from_eval ported/regression_forecast_familycollect_numeric_matrix_arg ported/regression_forecast_familysequence_predictors ported/regression_forecast_familydefault_output_shape_for_known_y ported/regression_forecast_familynormalize_known_x_matrix ported/regression_forecast_familyprepare_predictor_input ported/regression_forecast_familypredictor_input_from_optional ported/regression_forecast_familyprediction_input_from_optional ported/regression_forecast_familyleast_squares ported/regression_forecast_familyexact_product ported/regression_forecast_familyexactly_proportional ported/regression_forecast_familylinear_fit_from_data ported/regression_forecast_familyexponential_fit_from_data ported/regression_forecast_familyeval_value_from_output_shape ported/regression_forecast_familygrid catalogue/kitout_with_subnormal catalogue/kitNo implementation has been published with a Handbook test suite for this function.
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.
| Excel 16.0 build | Platform and CPU | Captured inputs |
|---|---|---|
| 20228 | Windows, 64-bit, CPU not recorded | 180 |
The 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.
Recorded environments and comparison details.
Windows, 64-bit, CPU not recorded
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.
LOGEST returns exponential-model coefficients; TREND fits an additive linear model; FORECAST.LINEAR makes a one-predictor linear forecast.
No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents