Statistical functions

NORM.DIST

Close: 244 of 24,252 recorded answers differ in the last bits, worst 6 ULP

Everything else matches (24,246 in the answer bank and 6 workbook cells). Last-bit means a finite number within 16 ULP of Excel's. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicNORM.DIST
BulgarianNORM.DIST
CzechNORM.DIST
DanishNORMAL.FORDELING
GermanNORM.DIST
GreekNORM.DIST
English (Australia)NORM.DIST
English (United Kingdom)NORM.DIST
English (United States)NORM.DIST
SpanishDISTR.NORM.N
EstonianNORM.DIST
FinnishNORMAALI.JAKAUMA
FrenchLOI.NORMALE.N
HebrewNORM.DIST
CroatianNORM.DIST
HungarianNORM.ELOSZLÁS
IndonesianNORM.DIST
ItalianNORM.DIST
JapaneseNORM.DIST
KoreanNORM.DIST
LithuanianNORM.DIST
LatvianNORM.DIST
NorwegianNORM.DIST
DutchNORM.DIST
PolishROZKŁ.NORMALNY
Portuguese (Brazil)NORM.DIST
Portuguese (Portugal)DIST.NORMAL
RomanianNORM.DIST
RussianНОРМ.РАСП
SlovakNORM.DIST
SlovenianNORM.DIST
Serbian (Latin)NORM.DIST
SwedishNORM.FÖRD
ThaiNORM.DIST
TurkishNORM.DAĞ
UkrainianNORM.DIST
VietnameseNORM.DIST
Chinese (Simplified)NORM.DIST
Chinese (Hong Kong)NORM.DIST
Chinese (Traditional)NORM.DIST

Names from Microsoft's support site.

What it does

NORM.DIST(x, mean, standard_dev, cumulative)

NORM.DIST(x, mean, standard_dev, cumulative) evaluates the normal distribution with mean μ and standard deviation σ at x, returning either its density or its cumulative distribution function according to the fourth argument.

Density (cumulative = FALSE) — Microsoft's page carries this equation as an image; it is the standard one:

f(x; μ, σ) = 1 / (σ √(2π)) · exp( −(x − μ)² / (2σ²) )

Cumulative (cumulative = TRUE) — Microsoft's page states that this is the integral from negative infinity to x of the density:

F(x; μ, σ) = ∫₋∞ˣ f(t; μ, σ) dt
           = Φ( (x − μ) / σ )
           = ½ · [ 1 + erf( (x − μ) / (σ √2) ) ]
           = ½ · erfc( −(x − μ) / (σ √2) )

The three closed forms for F are algebraically identical and numerically are not: the erfc form is the one that survives in the left tail, and the choice among them is the whole subject of the Numerical notes below.

Domain and range. x and μ range over the reals; σ > 0 is required — σ ≤ 0 is a documented #NUM!. The density is strictly positive with range (0, 1/(σ√(2π))], attaining its maximum at x = μ. The cumulative is strictly increasing with range (0, 1), never reaching either endpoint mathematically. Stored worksheet results can nevertheless be zero or one. The current DnaCalc implementation flushes final subnormal CDF and density values to zero; that policy must be distinguished from ordinary IEEE binary64 rounding. Both mathematical forms are entire in x.

Standardization is the whole structure of this family. Writing z = (x − μ)/σ:

F(x; μ, σ) = Φ(z)                and    f(x; μ, σ) = φ(z) / σ

so the two-parameter surface is a one-parameter surface composed with an affine map. Every member of the normal group is Φ or φ wearing a change of variable — which is why Microsoft's page states the identity directly: with mean = 0, standard_dev = 1 and cumulative = TRUE, NORM.DIST "returns the standard normal distribution, NORM.S.DIST".

That sentence is a documented mathematical identity. It is not, and must not be read as, a statement that the two Excel surfaces return the same bits. See Relationships.

Limiting cases and special values.

F(μ; μ, σ) = 1/2                        exactly, for every σ > 0
F(x; μ, σ) + F(2μ − x; μ, σ) = 1        the reflection identity
f(μ; μ, σ) = 1 / (σ √(2π))
1 − F(z) ~ φ(z)/z · (1 − 1/z² + 3/z⁴ − …)   as z → ∞   (A&S 26.2.12)

The last of these is the asymptotic expansion that governs the right tail and explains why the tail is where implementations diverge. The value at the mean is the cheapest exactness probe this function has: F(μ; μ, σ) must be 0.5 with no rounding at all.

Arguments

Microsoft's page gives four required arguments:

ArgumentMeaningRequired
xThe value for which you want the distributionyes
meanThe arithmetic mean of the distributionyes
standard_devThe standard deviation of the distributionyes
cumulativeA logical: TRUE gives the cumulative distribution function, FALSE the probability density functionyes

cumulative has no default. This is a real difference from the shape readers expect: many distribution functions in other systems default to the CDF, and here the switch must be written. Its argument descriptions above are Microsoft's own wording.

The pinned catalogue supplies NORM.DIST(x, mean, standard_dev, cumulative) with four required arguments. The table above explains the documented roles of those arguments.

Try it

Input cells (optional)

Example: {"B2": 3, "B3": 4}. A1 holds the formula. Other cells need values before a formula can read them.

Enter a formula, then calculate.

Runs locally in your browser with OneCalc. Its answer may differ from Excel. Use English function names and commas between arguments.

Quirks

Result and edge cases

Returns Number.

  • σ ≤ 0 is a documented #NUM!, including σ = 0. The degenerate "distribution" that puts all its mass at μ is therefore not reachable, and neither the step-function CDF nor the unbounded density has to be represented.
  • cumulative coerced from a number. Excel's logical slots accept numbers, with zero reading as FALSE. That means NORM.DIST(x, μ, σ, 0) is the density and NORM.DIST(x, μ, σ, 1) is the CDF, and any nonzero value selects the CDF. The reference engine's battery renders the all-TRUE and all-zero rows, and their outcomes show beside this page.
  • Far left tail. The current CDF wrapper flushes a final value below 2^-1022 to zero, including its z=-37.52 source control. IEEE binary64 itself can represent smaller positive values; the worksheet publication policy is a separate stage.
  • Far right tail. Once the stored CDF is one, subtracting it from one loses the upper-tail probability. For symmetric mathematical tails, evaluate a reflected lower-tail argument instead. Building that reflected argument introduces its own rounding, so the identity alone does not establish identical worksheet results.
  • Density at large |z|. The current density route flushes its final result after scaling by sigma and the normal constant. It checks the staged square for overflow first. Calling worksheet PHI and then dividing by sigma can flush an intermediate too early.
  • Arrays. The recorded profile is Custom; whether NORM.DIST lifts elementwise over array arguments is not settled here.

Empty, missing and error arguments follow the shared call model; see Coercion and lifting.

Errors

As documented by Microsoft on the NORM.DIST page (retrieved for this page):

ErrorDocumented condition
#VALUE!mean or standard_dev is nonnumeric
#NUM!standard_dev ≤ 0

Two observations about what that table does not say, both worth recording rather than papering over:

  1. The #VALUE! row names only mean and standard_dev. It does not name x. Read literally, the documentation says nothing about a nonnumeric x — which surely also produces #VALUE! under the ordinary coercion rules, but is not documented as such on this page. This is a documentation gap, not a behavioural claim.
  2. No #NUM! for extreme x. The documentation states no domain restriction on x at all, consistent with the mathematics.

Error values in any argument propagate under the ordinary coercion rules.

How to implement

Numerical notes

The normal CDF is the most-studied function in applied statistics and the place where Excel's statistical lane has historically been assessed hardest. Four things are worth stating.

1. The tail is the function. The naive route — compute the density, integrate a series — is fine near the centre and useless in the tails. Every serious implementation reduces to erf/erfc and switches representation by region:

|z| small          series or rational approximation for erf(z/√2)
|z| moderate       rational approximation for erfc
|z| large          erfc via the asymptotic expansion or a continued fraction,
                   scaled by e^(−z²/2) to avoid underflow

Cody's rational Chebyshev approximations (1969, and the CALERF/ANORM routines in SPECFUN) are the canonical accurate double-precision route and are what most modern libraries descend from. Cephes's ndtr is a widely used independent implementation. A&S 26.2.17 gives the Hastings-style rational approximation that older code used, and its accuracy — around seven decimal digits — is exactly the kind of legacy standard that shows up as a visible defect when double precision is expected.

2. Cancellation is where the naive form dies. Two distinct failures:

  • 1 − Φ(z) for large positive z is catastrophic subtraction: the answer is tiny, the operands are both near 1, and the result has no significant digits left once 1 − Φ(z) < 2^−53. The remedy is not a better Φ — it is to compute Φ(−z) instead, using the exact symmetry, or to expose a complementary surface. Excel's normal family has no complementary surface (there is no NORM.DIST.RT beside CHISQ.DIST.RT and F.DIST.RT), so the reflection is the user's responsibility.
  • ½[1 + erf(u)] for u very negative is the same failure in the other direction: erf(u) approaches −1 and the sum loses digits. Writing it as ½ erfc(−u) avoids the subtraction entirely. This is why the erfc form is the one to implement.

3. Argument reduction has its own error. z = (x − μ)/σ is computed in floating point before the special function ever runs. When x and μ are close and large, x − μ loses digits; the resulting relative error in z is amplified into the result by a factor of about z for the CDF (since Φ'(z)/Φ(z) → z in the left tail) and by about z² for the density (the squaring bottleneck described on PHI). A two-parameter normal function therefore has an accuracy ceiling set by the subtraction, before any special-function code runs. This is invisible in any test that uses μ = 0.

4. The published assessment record. Excel's statistical functions have been examined in print for two decades — McCullough and Wilson's series in Computational Statistics & Data Analysis, and Knüsel's assessments of the distribution functions specifically, both report accuracy shortfalls in Excel's statistical lane across several versions, with revisions in Excel 2003 and again around Excel 2010 when the dotted names were introduced. Morten Welinder's work on Gnumeric's statistical functions is the standard practical account of what it takes to get these functions right in a spreadsheet and of where Excel's answers came from. The Handbook names these as literature; it has not re-run their tests and does not restate their figures.

What a careful independent implementation does: standardize with care (compensated subtraction if the arguments warrant it), route the CDF through erfc with a region-switched rational approximation, evaluate the density through a double-double z²/2 as described on PHI, and state a bound. See About implementation options.

Rust code

Show the CalcFunc source of this function

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.

NORM.DIST · 4 lines · calc-func/src/catalogue/distributions.rs on GitHub
1 norm_dist "NORM.DIST" (4, 4) [V "x", V "mean", V "standard_dev", V "cumulative"] |s, a, sv| {
    let [x, m, sd_] = nums::<3>(s, a)?;
    out(s, nl::norm_dist_kernel(x, m, sd_, flag(s, a, 3)?))
}

Kernels shared with other functions

Argument and result plumbing

  • flag catalogue/kit
  • num catalogue/kit
  • out catalogue/kit

No implementation has been published with a Handbook test suite for this function.

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.

Excel 16.0 buildPlatform and CPUCaptured inputs
20430Windows, 64-bit, CPU not recorded24,246

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.

Excel 16.0 build 20430

Windows, 64-bit, CPU not recorded

24,246 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.

Alternatives

Relationships

  • NORM.S.DIST is the standardized case. Microsoft's page states the identity NORM.DIST(x, 0, 1, TRUE) = NORM.S.DIST(x, TRUE) as documented behaviour. The Handbook publishes that as a documented identity, and separately notes that no evidence in its record demonstrates the two surfaces agree in their last bits.
  • NORM.INV is the functional inverse in the first argument: NORM.INV(NORM.DIST(x, μ, σ, TRUE), μ, σ) = x mathematically. Microsoft's NORM.INV page states that NORM.INV searches for the x at which NORM.DIST equals the given probability, and that "precision of NORM.INV depends on precision of NORM.DIST" — a documented dependency between the two surfaces, and an unusually explicit one.
  • PHI is NORM.DIST(x, 0, 1, FALSE) under a shorter name.
  • GAUSS is NORM.DIST(z, 0, 1, TRUE) − 0.5.
  • ERF / ERFC are the underlying special functions: Φ(z) = ½ erfc(−z/√2).
  • CONFIDENCE.NORM and Z.TEST are consumers: both are NORM.S.INV or NORM.S.DIST applied to a standardized statistic.
  • Confused with: NORM.DIST(x, μ, σ) written without the fourth argument, which is not a legal call — the argument is required, and omitting it is refused at entry rather than defaulting.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents