{
  "category": "Financial functions",
  "display_name": "EFFECT",
  "entry_kind": "built_in_function",
  "eval_api": {
    "method": "POST",
    "url": "https://handbook.dnacalc.com/api/eval"
  },
  "function_id": "FUNC.EFFECT",
  "implementation_state": {
    "answer_bank": {
      "excel_builds": [
        "20228",
        "20430",
        "?"
      ],
      "larger_numeric": 0,
      "last_bit": 0,
      "matched": 2584,
      "other_mismatch": 0,
      "refused": 0,
      "rows": 2584,
      "unread": 0,
      "worst_ulp": 0
    },
    "detail": "Recorded: 2,584 in the answer bank and 4 workbook cells.",
    "dnacalc_commit": "9e1884369a678158dd82d3d74188daf986995e87",
    "in_catalogue": true,
    "state": "matches",
    "state_label": "Matches every recorded Excel answer",
    "summary": "Matches all 2,588 recorded answers",
    "workbook_corpus": {
      "cells": 4,
      "matched": 4
    }
  },
  "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/financial.rs#L219-L221",
        "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/ported/financial_time_value_family.rs#L1221-L1260"
      ],
      "repository": "https://github.com/DnaCalc/DnaCalc",
      "shared_code": [
        "catalogue/financial::tv_out",
        "ported/excel_numeric::binary_with",
        "ported/excel_numeric::excel_pow_chain",
        "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/excel_numeric/x87_chains::pow2_positive",
        "ported/excel_numeric/x87_chains::pow2",
        "ported/excel_numeric/x87_chains::exp_ext",
        "ported/excel_numeric/x87_chains::exp_with",
        "ported/excel_numeric/x87_chains::excel_exp",
        "ported/excel_numeric/x87_chains::log_with",
        "ported/excel_numeric/x87_chains::excel_log",
        "ported/financial_time_value_family::validate_finite"
      ],
      "source": "https://github.com/DnaCalc/DnaCalc/blob/9e1884369a678158dd82d3d74188daf986995e87/crates/calc-func/src/catalogue/financial.rs#L219-L221",
      "state": "matches",
      "suite": null,
      "summary": "Matches all 2,588 recorded answers"
    }
  ],
  "json_url": "https://handbook.dnacalc.com/api/functions/FUNC.EFFECT.json",
  "name": "EFFECT",
  "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\n- **[NOMINAL](FUNC.NOMINAL.md)** — the exact inverse. `NOMINAL(EFFECT(r, n), n)` should return `r`\n  up to floating-point rounding, and the round trip is the natural self-test for both. The two\n  functions carry identical domain restrictions.\n- **`RRI`** — the compound rate implied by a present value, a future value and a period count.\n  Where `EFFECT` translates a *quoted* rate between conventions, `RRI` extracts a rate from\n  observed values.\n- **`FV` / `FVSCHEDULE`** — the growth these rates describe. `FV(EFFECT(r,n), 1, 0, −P)` and\n  `FV(r/n, n, 0, −P)` agree by construction; that agreement is the definition of the effective\n  rate, and it makes a good check.\n- **`EXP`** — the continuous-compounding limit, `EXP(r) − 1`, which `EFFECT` approaches as `npery`\n  grows and never reaches.\n- **`XIRR` / `IRR`** — internal rates of return, which are already effective rates over their own\n  period; do not pass them through `EFFECT` a second time.\n- **Confused with**: APR versus APY in consumer lending. `EFFECT` maps APR to APY. Which of the two\n  a jurisdiction requires you to disclose is a legal question, not a spreadsheet one.\n\n\n",
    "how-to-implement": "\n### Numerical notes\n\n\nThe formula `(1 + r/n)^n − 1` is the textbook expression and it is the **worst** way to evaluate the\nquantity when `r/n` is small.\n\nTwo error sources compound. First, `1 + r/n` loses the low bits of `r/n` when the ratio is tiny —\nfor a 1% rate compounded daily, `r/n ≈ 2.7×10⁻⁵`, so roughly five significant digits of the input\nare discarded in the addition. Second, the result of the power is close to 1, so the final\nsubtraction of 1 is a cancellation that exposes exactly those damaged bits. The two effects are\nmultiplicative in the relative error, and the damage grows with `n`.\n\nThe standard remedy is the `expm1`/`log1p` pair:\n\n    EFFECT = expm1(npery × log1p(nominal_rate/npery))\n\n`log1p` computes `ln(1 + x)` accurately for small `x` without forming `1 + x`, and `expm1` computes\n`e^x − 1` without forming the intermediate that cancels. Together they hold full relative accuracy\nacross the whole admissible domain. This is the same pairing that appears throughout the annuity\nfunctions in this family, and the standard reference treatment is in the `fdlibm`/Cody-and-Waite\nlineage that every modern libm inherits.\n\nThe Handbook does not claim what Excel does internally for either function.\n\n\n",
    "quirks": "\n### Result and edge cases\n\n\nReturns `Number` — an effective annual rate as a decimal fraction.\n\n- **`npery = 1`** returns `nominal_rate` — up to floating-point rounding. It is not guaranteed to\n  return the input's exact bits, because the computation still forms `(1 + r)^1 − 1`.\n- **`nominal_rate ≤ 0` is an error, not a computation.** This is a *documented restriction*, not a\n  mathematical boundary: `(1 + r/n)^n − 1` is perfectly well defined for `r = 0` (giving 0) and for\n  small negative `r`. Excel refuses both. A model that needs the effective rate of a zero or\n  negative nominal rate cannot use this function and must write the formula out.\n- **Large `npery`** approaches `EXP(nominal_rate) − 1` from below and stays finite; there is no\n  overflow for any realistic rate.\n- **Non-integer `npery`** truncates toward zero, so `0.9` becomes `0` and therefore `#NUM!`.\n- Empty, missing and error arguments follow the shared call model; see\n  [The value universe](../model/01-value-universe.md) and\n  [Coercion and lifting](../model/02-coercion-and-lifting.md).\n\n\n\n### Errors\n\n\nAs documented on Microsoft's `EFFECT` page:\n\n| Error | Condition |\n|---|---|\n| `#VALUE!` | `nominal_rate` or `npery` is non-numeric |\n| `#NUM!` | `nominal_rate ≤ 0` or `npery < 1` |\n\n",
    "sources": "- Microsoft, \"EFFECT function\" —\n  <https://support.microsoft.com/en-us/office/effect-function-910d4e4c-79e2-4009-95e6-507e04f11bc4>\n  (syntax, argument meanings, the truncation of `npery`, the equation, and the documented `#VALUE!`\n  and `#NUM!` conditions).\n- Handbook, [NOMINAL](FUNC.NOMINAL.md) — the inverse conversion and the shared domain restrictions.\n- Handbook, [The value universe](../model/01-value-universe.md) and\n  [Coercion and lifting](../model/02-coercion-and-lifting.md).\n- Handbook projections `data/functions/FUNC.EFFECT.json` and `data/presence/FUNC.EFFECT.json`\n  (arity, classification axes, implementing module and the fifteen-surface family it shares).\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 | 1,030 |\n| 20430 | Windows, 64-bit, CPU not recorded | 1,235 |\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.EFFECT.json).",
    "what-it-does": "\n`EFFECT(nominal_rate, npery)` converts a **nominal annual rate compounded `npery` times a year**\ninto the **effective annual rate** — the single annual rate that produces the same year-end value\nwith one compounding.\n\n    EFFECT = (1 + nominal_rate/npery)^npery − 1\n\nThe identity behind it: growing at `r/n` per period for `n` periods multiplies principal by\n`(1 + r/n)^n`, and the effective rate is that multiplier minus one. A 10% nominal rate compounded\nmonthly is not 10% a year — it is about 10.47%, and the gap is the whole reason the function\nexists. Consumer-credit disclosure regimes worldwide are built on this conversion.\n\nDomain and range: for `nominal_rate > 0` and integer `npery ≥ 1`, `EFFECT` is strictly increasing in\n`npery` and strictly greater than `nominal_rate` for every `npery > 1`. At `npery = 1` it is\nexactly `nominal_rate`.\n\nThe limiting case is the interesting one. As `n → ∞`,\n\n    (1 + r/n)^n → e^r        so        EFFECT → e^r − 1\n\nwhich is continuous compounding. That limit is approached but never reached through this function,\nbecause `npery` is truncated to an integer — there is no \"continuous\" setting. `EXP(r) − 1` is the\nformula for that, and `EFFECT` with a very large `npery` approximates it from below.\n\nThe function is **not** an annualization of a period rate in the simple-interest sense. `EFFECT`\ncompounds; `INTRATE` and `DISC` do not. Feeding a money-market discount quote to `EFFECT` produces\na number with no financial meaning.\n\n\n\n### Arguments\n\n\n| Argument | Meaning | Default |\n|---|---|---|\n| `nominal_rate` | The nominal annual interest rate, as a decimal fraction. Required. | — |\n| `npery` | The number of compounding periods per year. Required. | — |\n\nTwo documented rules:\n\n1. **`npery` is truncated to an integer.** `npery = 12.9` compounds twelve times, not 12.9 times.\n2. **`npery` must be at least 1** and `nominal_rate` must be greater than zero; both violations are\n   `#NUM!`.\n\n`npery` is not restricted to the conventional 1, 2, 4, 12 — 365 (daily) and 52 (weekly) are\naccepted and are exactly what the function is for.\n\n"
  },
  "signature": {
    "display": "EFFECT(nominal_rate, npery)",
    "parameters": [
      {
        "description": null,
        "name": "nominal_rate",
        "optional": false,
        "repeats": false
      },
      {
        "description": null,
        "name": "npery",
        "optional": false,
        "repeats": false
      }
    ],
    "trailing_repeats": false
  },
  "sources": {
    "metadata": {
      "admission": {
        "label": "implemented",
        "reason": null
      },
      "arity": {
        "max": 2,
        "min": 2
      },
      "category": "Financial functions",
      "classification": {
        "arg_preparation_profile": "RefsVisibleInAdapter",
        "coercion_lift_profile": "Custom",
        "determinism_class": "Deterministic",
        "error_collapse_profile": "None",
        "fec_dependency_profile": "None",
        "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": "Effective annual rate from a nominal rate and the compounding periods per year",
        "short_source": "dna-calc-own"
      },
      "docs": {
        "english_description": "Returns the effective annual interest rate",
        "microsoft_url": "https://support.microsoft.com/en-us/office/effect-function-910d4e4c-79e2-4009-95e6-507e04f11bc4"
      },
      "entry_kind": "built_in_function",
      "localized_family_names": null,
      "localized_names": [
        {
          "locale": "ar-SA",
          "name": "الأثر"
        },
        {
          "locale": "bg-BG",
          "name": "EFFECT"
        },
        {
          "locale": "cs-CZ",
          "name": "EFFECT"
        },
        {
          "locale": "da-DK",
          "name": "EFFEKTIV.RENTE"
        },
        {
          "locale": "de-DE",
          "name": "EFFECT"
        },
        {
          "locale": "el-GR",
          "name": "EFFECT"
        },
        {
          "locale": "en-AU",
          "name": "EFFECT"
        },
        {
          "locale": "en-GB",
          "name": "EFFECT"
        },
        {
          "locale": "en-US",
          "name": "EFFECT"
        },
        {
          "locale": "es-ES",
          "name": "INT.EFECTIVO"
        },
        {
          "locale": "et-EE",
          "name": "EFFECT"
        },
        {
          "locale": "fi-FI",
          "name": "VAIKUTUS"
        },
        {
          "locale": "fr-FR",
          "name": "TAUX.EFFECTIF*"
        },
        {
          "locale": "he-IL",
          "name": "EFFECT"
        },
        {
          "locale": "hr-HR",
          "name": "EFFECT"
        },
        {
          "locale": "hu-HU",
          "name": "TÉNYLEGES"
        },
        {
          "locale": "id-ID",
          "name": "EFFECT"
        },
        {
          "locale": "it-IT",
          "name": "EFFECT"
        },
        {
          "locale": "ja-JP",
          "name": "EFFECT"
        },
        {
          "locale": "ko-KR",
          "name": "EFFECT"
        },
        {
          "locale": "lt-LT",
          "name": "EFFECT"
        },
        {
          "locale": "lv-LV",
          "name": "EFFECT"
        },
        {
          "locale": "nb-NO",
          "name": "EFFEKTIV.RENTE"
        },
        {
          "locale": "nl-NL",
          "name": "EFFECT.RENTE"
        },
        {
          "locale": "pl-PL",
          "name": "EFEKTYWNA"
        },
        {
          "locale": "pt-BR",
          "name": "EFFECT"
        },
        {
          "locale": "pt-PT",
          "name": "EFETIVA"
        },
        {
          "locale": "ro-RO",
          "name": "EFECT"
        },
        {
          "locale": "ru-RU",
          "name": "ЭФФЕКТ"
        },
        {
          "locale": "sk-SK",
          "name": "ÚČINOK"
        },
        {
          "locale": "sl-SI",
          "name": "EFFECT"
        },
        {
          "locale": "sr-Latn-RS",
          "name": "EFEKAT"
        },
        {
          "locale": "sv-SE",
          "name": "EFFRÄNTA"
        },
        {
          "locale": "th-TH",
          "name": "EFFECT"
        },
        {
          "locale": "tr-TR",
          "name": "ETKİN işlevi"
        },
        {
          "locale": "uk-UA",
          "name": "EFFECT"
        },
        {
          "locale": "vi-VN",
          "name": "EFFECT"
        },
        {
          "locale": "zh-CN",
          "name": "EFFECT"
        },
        {
          "locale": "zh-HK",
          "name": "EFFECT"
        },
        {
          "locale": "zh-TW",
          "name": "EFFECT"
        }
      ],
      "signature": {
        "display": "EFFECT(nominal_rate, npery)",
        "parameters": [
          {
            "description": null,
            "name": "nominal_rate",
            "optional": false,
            "repeats": false
          },
          {
            "description": null,
            "name": "npery",
            "optional": false,
            "repeats": false
          }
        ],
        "trailing_repeats": false
      },
      "surface_name": "EFFECT",
      "version_marker": null,
      "xlcall": {
        "code": "446",
        "symbol": "xlfEffect"
      }
    },
    "microsoft": "https://support.microsoft.com/en-us/office/effect-function-910d4e4c-79e2-4009-95e6-507e04f11bc4"
  },
  "try_it": {
    "formula": "=EFFECT(0.0001, 365)"
  },
  "url": "https://handbook.dnacalc.com/functions/EFFECT.html",
  "variants": [],
  "versions": [
    {
      "behaviour": "1,030 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.EFFECT.json"
      ]
    },
    {
      "behaviour": "1,235 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.EFFECT.json"
      ]
    }
  ]
}