{
  "category": "Math and trigonometry functions",
  "display_name": "PRODUCT",
  "entry_kind": "built_in_function",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.PRODUCT",
  "implementation_state": {
    "answer_bank": {
      "excel_builds": [
        "20430"
      ],
      "larger_numeric": 0,
      "last_bit": 0,
      "matched": 1211,
      "other_mismatch": 0,
      "refused": 0,
      "rows": 1211,
      "unread": 0,
      "worst_ulp": 0
    },
    "detail": "Recorded: 1,211 in the answer bank and 33 workbook cells.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "matches",
    "state_label": "Matches every recorded Excel answer",
    "summary": "Matches all 1,244 recorded answers",
    "workbook_corpus": {
      "cells": 33,
      "matched": 33
    }
  },
  "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/aggregate.rs#L97-L97"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/aggregate::aggregate",
        "catalogue/aggregate::product",
        "catalogue/aggregate::times",
        "catalogue/aggregate::holds_held_arrays",
        "catalogue/aggregate::number_of",
        "catalogue/aggregate::each_number",
        "catalogue/aggregate::read_values",
        "catalogue/aggregate::reader",
        "catalogue/aggregate::read_reference"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/aggregate.rs#L97-L97",
      "state": "matches",
      "suite": null,
      "summary": "Matches all 1,244 recorded answers"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.PRODUCT.json",
  "name": "PRODUCT",
  "notes": [],
  "schema": "efh.function-reference/v1",
  "section_order": [
    "what-it-does",
    "try-it",
    "quirks",
    "how-to-implement",
    "version-differences",
    "alternatives"
  ],
  "sections": {
    "alternatives": "\n### Relationships\n\n- **`SUMPRODUCT`** — despite the name, not a relative: it multiplies *across* arrays elementwise\n  and then sums, and it applies its own coercion rules.\n- **`FACT`**, **`FACTDOUBLE`**, **`MULTINOMIAL`** — closed forms for products that `PRODUCT` would\n  compute term by term, and better conditioned for it.\n- **`POWER`** — `PRODUCT(x,x,x)` and `POWER(x,3)` are the same mathematics by different\n  algorithms; see [POWER](FUNC.POWER.md) on the integer-exponent path.\n- **`AGGREGATE`** — the route to a product-like reduction that skips errors *by declaration*\n  rather than by an undocumented scan rule. `AGGREGATE` has no product option, which is itself\n  worth knowing before you plan around it.\n- **`EXP(SUM(LN(range)))`** — the classical workaround for overflow, valid only for strictly\n  positive data, and less accurate than a scaled product.\n\n\n",
    "how-to-implement": "\n### Numerical notes\n\n**The error bound is benign; the range is not.** For `k` factors the relative error of a sequential\nproduct is bounded by roughly `(k−1)·u/(1−(k−1)u)` — linear in `k`, with no cancellation term,\nbecause multiplication has no catastrophic cancellation (Higham, *ASNA*, ch. 3). Products are\n*accurate*. What they are not is *safe*: the intermediate can overflow or underflow even when the\nfinal result is perfectly representable. `1e300 · 1e300 · 1e-300` is `1e300` mathematically and\n`+∞` or `#NUM!` by naive evaluation, and the same happens in the underflow direction, where the\nloss is silent — a subnormal intermediate quietly discards bits and the final value comes back\nwrong rather than erroring.\n\n**The standard remedies**, in increasing order of effort:\n\n1. Accumulate the exponent separately: multiply mantissas, track a scale factor, and reassemble\n   once at the end (`frexp`/`ldexp` style). This makes intermediate range failures impossible\n   while keeping the same rounding sequence as the naive fold on the mantissa.\n2. Sort or pair the factors so that large and small alternate — cheap, effective, and it changes\n   the result bits, which for a compatibility-targeting implementation is a reason not to.\n3. Work in logarithms only if the data is strictly positive and accuracy is not critical; the\n   round trip through `ln` and `exp` costs far more accuracy than the fold ever did.\n\nA `natural-best` implementation should take route 1. An implementation targeting Excel\ncompatibility should take none of them until Excel's own intermediate behaviour is pinned, because\neach of them changes which inputs produce an error.\n\n\n",
    "quirks": "\n### Result and edge cases\n\n\nReturns `Number`.\n\n- **No admitted values** → `0`, as above, not the mathematical empty product `1`.\n- **A single admitted zero** → `0`, and it wins over everything, including values that would\n  otherwise overflow.\n- **Arrays.** `PRODUCT` is not a lift kernel; array arguments are consumed by scanning, under the\n  right-hand column of the table above. It never returns an array.\n\n\n\n### Errors\n\n\n| Error | Condition | Source |\n|---|---|---|\n| `#VALUE!` | A **directly typed** argument is text that does not read as a number | Microsoft VBA page |\n| propagated | A **directly typed** argument is an error value | Microsoft VBA page (\"cause errors\") |\n| `#VALUE!` | Fewer than one or more than 255 arguments | arity, refused at entry |\n\n",
    "sources": "- Higham, *Accuracy and Stability of Numerical Algorithms*, 2nd ed., chapter 3 — the sequential\n  product error bound and the scaling remedy.\n- Handbook, [Coercion and lifting](../model/02-coercion-and-lifting.md) — the direct-argument\n  versus range-scan asymmetry and the error-propagation rule.\n- Handbook projections `data/functions/FUNC.PRODUCT.json`\n  (`AggregateDirectAndRangeDualPolicy`, `ReductionFold`, `numerical_reduction_policy=\n  SequentialLeftFold`, `error_algebra=CanonicalExcelLegacy`, `non_finite=allow`) and\n  `data/presence/FUNC.PRODUCT.json` (own module, no shared surfaces, no defect streams).\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| 20430 | Windows, 64-bit, CPU not recorded | 1,211 |\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.PRODUCT.json).",
    "what-it-does": "\n`PRODUCT(number1, [number2], ...)` multiplies its admitted arguments and returns the product.\n\n    PRODUCT(a₁, …, a_k) = a₁ · a₂ · … · a_k\n\n\n### Arguments\n\n> Arguments that are numbers, logical values, or text representations of numbers are counted;\n> arguments that are error values or text that cannot be translated into numbers cause errors.\n\n> If an argument is an array or reference, only numbers in the array or reference are counted.\n> Empty cells, logical values, text, or error values in the array or reference are ignored.\n\nSo the same value multiplies or vanishes depending on how it arrived:\n\n| Value | Typed directly | Reached through a range or array |\n|---|---|---|\n| `2` | multiplies | multiplies |\n| `TRUE` | multiplies as 1 | ignored |\n| `\"3\"` | multiplies as 3 | ignored |\n| `\"abc\"` | causes an error | ignored |\n| empty cell | — | ignored |\n| `#N/A` | causes an error | **documented as ignored** |\n\n"
  },
  "signature": {
    "display": "PRODUCT(number1, [number2], ...)",
    "parameters": [
      {
        "description": null,
        "name": "number1",
        "optional": false,
        "repeats": false
      },
      {
        "description": null,
        "name": "number2",
        "optional": true,
        "repeats": true
      }
    ],
    "trailing_repeats": true
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 255,
        "min": 1
      },
      "category": "Math and trigonometry functions",
      "classification": {
        "arg_preparation_profile": "ValuesOnlyPreAdapter",
        "coercion_lift_profile": "AggregateDirectAndRangeDualPolicy",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "ReductionFold",
        "fec_dependency_profile": "None",
        "host_interaction_class": "None",
        "kernel_signature_class": "NumsToNum",
        "rich_value_usage": "RichBlind",
        "surface_fec_dependency_profile": "RefOnly",
        "thread_safety_class": "SafePure",
        "volatility_class": "NonVolatile"
      },
      "descriptions": {
        "long": null,
        "short": "Product of the numbers",
        "short_source": "dna-calc-own"
      },
      "docs": {
        "english_description": "Multiplies its arguments",
        "microsoft_url": "https://support.microsoft.com/en-us/office/product-function-8e6b5b24-90ee-4650-aeec-80982a0512ce"
      },
      "entry_kind": "built_in_function",
      "localized_family_names": null,
      "localized_names": [
        {
          "locale": "ar-SA",
          "name": "PRODUCT"
        },
        {
          "locale": "bg-BG",
          "name": "PRODUCT"
        },
        {
          "locale": "cs-CZ",
          "name": "PRODUCT"
        },
        {
          "locale": "da-DK",
          "name": "PRODUKT"
        },
        {
          "locale": "de-DE",
          "name": "PRODUKT"
        },
        {
          "locale": "el-GR",
          "name": "PRODUCT"
        },
        {
          "locale": "en-AU",
          "name": "PRODUCT"
        },
        {
          "locale": "en-GB",
          "name": "PRODUCT"
        },
        {
          "locale": "en-US",
          "name": "PRODUCT"
        },
        {
          "locale": "es-ES",
          "name": "PRODUCTO"
        },
        {
          "locale": "et-EE",
          "name": "PRODUCT"
        },
        {
          "locale": "fi-FI",
          "name": "TULO"
        },
        {
          "locale": "fr-FR",
          "name": "PRODUIT"
        },
        {
          "locale": "he-IL",
          "name": "PRODUCT"
        },
        {
          "locale": "hr-HR",
          "name": "PRODUCT"
        },
        {
          "locale": "hu-HU",
          "name": "SZORZAT"
        },
        {
          "locale": "id-ID",
          "name": "PRODUCT"
        },
        {
          "locale": "it-IT",
          "name": "PRODOTTO"
        },
        {
          "locale": "ja-JP",
          "name": "PRODUCT"
        },
        {
          "locale": "ko-KR",
          "name": "PRODUCT"
        },
        {
          "locale": "lt-LT",
          "name": "PRODUCT"
        },
        {
          "locale": "lv-LV",
          "name": "PRODUCT"
        },
        {
          "locale": "nb-NO",
          "name": "PRODUKT"
        },
        {
          "locale": "nl-NL",
          "name": "PRODUCT"
        },
        {
          "locale": "pl-PL",
          "name": "ILOCZYN"
        },
        {
          "locale": "pt-BR",
          "name": "PRODUTO"
        },
        {
          "locale": "pt-PT",
          "name": "PRODUCT"
        },
        {
          "locale": "ro-RO",
          "name": "PRODUCT"
        },
        {
          "locale": "ru-RU",
          "name": "ПРОИЗВЕД"
        },
        {
          "locale": "sk-SK",
          "name": "PRODUCT"
        },
        {
          "locale": "sl-SI",
          "name": "PRODUCT"
        },
        {
          "locale": "sr-Latn-RS",
          "name": "PRODUCT"
        },
        {
          "locale": "sv-SE",
          "name": "PRODUKT"
        },
        {
          "locale": "th-TH",
          "name": "PRODUCT"
        },
        {
          "locale": "tr-TR",
          "name": "ÇARPIM"
        },
        {
          "locale": "uk-UA",
          "name": "PRODUCT"
        },
        {
          "locale": "vi-VN",
          "name": "PRODUCT"
        },
        {
          "locale": "zh-CN",
          "name": "PRODUCT"
        },
        {
          "locale": "zh-HK",
          "name": "PRODUCT"
        },
        {
          "locale": "zh-TW",
          "name": "PRODUCT"
        }
      ],
      "signature": {
        "display": "PRODUCT(number1, [number2], ...)",
        "parameters": [
          {
            "description": null,
            "name": "number1",
            "optional": false,
            "repeats": false
          },
          {
            "description": null,
            "name": "number2",
            "optional": true,
            "repeats": true
          }
        ],
        "trailing_repeats": true
      },
      "surface_name": "PRODUCT",
      "version_marker": null,
      "xlcall": {
        "code": "183",
        "symbol": "xlfProduct"
      }
    },
    "microsoft": "https://support.microsoft.com/en-us/office/product-function-8e6b5b24-90ee-4650-aeec-80982a0512ce"
  },
  "try_it": {
    "formula": "=PRODUCT(2,3,4)"
  },
  "url": "https://handbook.dnacalc.com/functions/PRODUCT.html",
  "variants": [],
  "versions": [
    {
      "behaviour": "1,211 captured inputs are indexed for this environment. Capture dates: 2026-09-29 to 2026-09-29. This is a reading count, not a comparison with another build.",
      "excel_build": "16.0 build 20430",
      "platform": "Windows, 64-bit, CPU not recorded",
      "sources": [
        "https://github.com/DnaCalc/ExcelFunctionsHandbook/blob/5dc75391aa5125ccc5abdb095da85950980d6fd8/content/evidence/environments/FUNC.PRODUCT.json"
      ]
    }
  ]
}