Statistical functions

NORM.S.DIST

Close: 11,076 of 27,503 recorded answers differ in the last bits, worst 11 ULP

Everything else matches (27,497 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.S.DIST
BulgarianNORM.S.DIST
CzechNORM.S.DIST
DanishSTANDARD.NORM.FORDELING
GermanNORM.S.DIST
GreekNORM.S.DIST
English (Australia)NORM.S.DIST
English (United Kingdom)NORM.S.DIST
English (United States)NORM.S.DIST
SpanishDISTR.NORM.ESTAND.N
EstonianNORM.S.DIST
FinnishNORM_JAKAUMA.NORMIT
FrenchLOI.NORMALE.STANDARD.N
HebrewNORM.S.DIST
CroatianNORM.S.DIST
HungarianNORM.S.ELOSZLÁS
IndonesianNORM.S.DIST
ItalianNORM.S.DIST
JapaneseNORM.S.DIST
KoreanNORM.S.DIST
LithuanianNORM.S.DIST
LatvianNORM.S.DIST
NorwegianNORM.S.FORDELING
DutchNORM.S.VERD
PolishROZKŁ.NORMALNY.S
Portuguese (Brazil)NORM.S.DIST
Portuguese (Portugal)DIST.S.NORM
RomanianNORM.S.DIST
RussianНОРМ.СТ.РАСП
SlovakNORM.S.DIST
SlovenianNORM.S.DIST
Serbian (Latin)NORM.S.DIST
SwedishNORM.S.FÖRD
ThaiNORM.S.DIST
TurkishNORM.S.DAĞ
UkrainianNORM.S.DIST
VietnameseNORM.S.DIST
Chinese (Simplified)NORM.S.DIST
Chinese (Hong Kong)NORM.S.DIST
Chinese (Traditional)NORM.S.DIST

Names from Microsoft's support site.

What it does

NORM.S.DIST(z, cumulative)

NORM.S.DIST(z, cumulative) evaluates the standard normal distribution — mean 0, standard deviation 1 — at z, returning either its density or its cumulative distribution function according to the second argument.

cumulative = FALSE :   φ(z) = (1 / √(2π)) · e^(−z²/2)
cumulative = TRUE  :   Φ(z) = ∫₋∞ᶻ φ(t) dt
                            = ½ · [ 1 + erf(z/√2) ]
                            = ½ · erfc(−z/√2)

In Abramowitz & Stegun's notation these are Z(x) and P(x) respectively (chapter 26 §26.2).

Domain and range. Defined for every real z; no poles, no branch cuts, both forms entire.

φ:  strictly positive, even, range (0, 1/√(2π)],  maximum φ(0) = 1/√(2π)
Φ:  strictly increasing, range (0, 1),  Φ(−∞) = 0,  Φ(+∞) = 1

The identities that carry the function.

Φ(0) = 1/2                          exactly
Φ(z) + Φ(−z) = 1                    the reflection identity
Φ'(z) = φ(z)
φ'(z) = −z φ(z)
1 − Φ(z) ~ φ(z)/z · (1 − 1/z² + 3/z⁴ − …)     as z → +∞    (A&S 26.2.12)

Φ(0) = 1/2 is exactly representable and is the single most useful test input this function has: it removes the special function from the picture entirely and tests only whether the implementation knows where the centre is. φ(0) = 1/√(2π) plays the same role for the density, testing only the stored constant.

Tail probabilities and worksheet publication. A stored CDF can round to one, losing the upper-tail probability in a later 1-CDF subtraction. Evaluating the reflected lower tail avoids that subtraction. At the left end, the current DnaCalc wrapper flushes a result below 2^-1022 to zero; its source includes a z=-37.52 control. That is a worksheet publication rule, not the point where IEEE binary64 runs out of representable positive values. The ERFC body inside the wrapper remains an open approximation.

Arguments

Microsoft's page gives two required arguments:

ArgumentMeaningRequired
z"the value for which you want the distribution"yes
cumulative"can be either TRUE or FALSE… If cumulative is TRUE then NORM.S.DIST returns the cumulative distribution function. If it is FALSE, it returns the probability mass function."yes

cumulative has no default: the switch must be written.

The pinned catalogue supplies NORM.S.DIST(z, cumulative) with two required arguments. Keep the cumulative switch explicit.

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

Density wording in the documentation

Microsoft's NORM.S.DIST syntax description calls the FALSE result a “probability mass function”, while its remarks call the equation a density. The NORM.DIST syntax uses density, although its example table also uses the mass label. Both pages were opened on 7 November 2026.

For a continuous normal distribution, the FALSE branch returns the height of the density curve. A probability over an interval is an integral of that curve; the density at one point is not the probability of that individual outcome. This is a documentation wording issue, not evidence of a change between Excel builds.

Result and edge cases

Returns Number.

  • z = 0. The cumulative branch is exactly 0.5; the density branch is the stored constant 1/√(2π). Both are diagnostic single cells, for different reasons.
  • Tail limits. The CDF and density implementations flush final subnormal results to zero. This differs from preserving every positive IEEE binary64 subnormal. The density branch also rejects a nonfinite staged square; see PHI.
  • Symmetry. Φ(z) + Φ(−z) = 1 and φ(z) = φ(−z) are exact mathematically. Whether the implementation reproduces them in the last bit is a metamorphic property that can be tested without any external oracle, and is on the probe list.
  • Arrays. The recorded profile is Custom; elementwise lifting is not settled here.

Errors

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

ErrorDocumented condition
#VALUE!z is nonnumeric

That is the complete documented error surface — one row. Note what it omits: nothing is documented about a nonnumeric cumulative, and no #NUM! condition is stated at all, which is consistent with the mathematics since Φ and φ are defined on the whole real line.

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

How to implement

Numerical notes

The two branches are different numerical problems sharing a name. The density branch is a squaring and an exponential — see PHI for why the squaring, not the exponential, sets the accuracy ceiling, and why the error grows quadratically in z. The cumulative branch is a special function requiring region-switched approximation. An implementation that treats them as two branches of one routine is doing the right thing structurally, but it should not be expected that accuracy claims transfer between them.

The cumulative branch, properly. The route that survives is erfc:

Φ(z) = ½ · erfc(−z/√2)

written that way and never as ½[1 + erf(z/√2)], because the latter subtracts nearly equal quantities in the left tail. Then erfc itself is region-switched: a rational approximation near the origin, a different one for moderate argument, and for large argument the scaled form erfc(u) = e^(−u²) · R(u) / u with R from a continued fraction or the asymptotic series (A&S 7.1.13/7.1.14, 26.2.12), which keeps the exponential factored out so nothing underflows prematurely. Cody's rational Chebyshev approximations are the standard source; Cephes's ndtr is a widely used independent implementation; Boost's erfc carries stated bounds.

The √2 in the argument is not free. −z/√2 is computed in floating point, and the rounding of that division is amplified into the result by the local logarithmic derivative, which grows like |z| in the tail. Carrying z/√2 as a double-double — or equivalently multiplying by a two-part representation of 1/√2 — is the standard fix and matters only where it matters, which is exactly the tail where users are least likely to check.

A note on what the identities buy you. Φ(0) = ½ and Φ(z) + Φ(−z) = 1 are exact and oracle-free. An implementation that is region-switched will generally not satisfy the reflection identity in the last bit unless it is written to compute one side and reflect, because the two sides go through different approximations. Whether that is a defect depends on what was promised. Recording it is not optional.

The published assessment record. Excel's statistical lane, and the normal distribution functions in particular, have been examined in print for two decades — McCullough and Wilson in Computational Statistics & Data Analysis, Knüsel on the distribution functions specifically — with revisions reported around Excel 2003 and again when the dotted names arrived. Morten Welinder's Gnumeric work is the standard practical account of getting this family right in a spreadsheet. The Handbook names these as literature and restates no figure from them.

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.S.DIST · 4 lines · calc-func/src/catalogue/distributions.rs on GitHub
5 norm_s_dist "NORM.S.DIST" (2, 2) [V "z", V "cumulative"] |s, a, sv| {
    let z = num(s, a, 0)?;
    out(s, nl::norm_s_dist_kernel(z, flag(s, a, 1)?))
}

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
20131Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics16,495
20430Windows, 64-bit, CPU not recorded10,978

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 20131

Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics

16,495 captured inputs are indexed for this environment. Capture dates: 2026-07-17 to 2026-07-17. This is a reading count, not a comparison with another build.

Excel 16.0 build 20430

Windows, 64-bit, CPU not recorded

10,978 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

  NORMSDIST(z)  corresponds to  NORM.S.DIST(z, TRUE)

and there is no legacy spelling of the density branch at all. This is not a rename. Anyone migrating formulas mechanically by inserting dots will produce calls that do not compile, and anyone reasoning about the pair as "the same function under two names" is reasoning about only half of the modern one.

And even for the branch that does correspond: the correspondence is a signature and mathematical correspondence, not a demonstrated identity of bits. Excel dispatches compatibility functions as their own surfaces. EV-DIST-0018 names both NORM.S.DIST and NORMSDIST among its subjects, but its figures are group totals with a reader warning against per-surface attribution, so nothing in the Handbook's record establishes that the two agree.

  • NORM.DIST is the two-parameter surface. Microsoft's NORM.DIST page states the documented identity NORM.DIST(x, 0, 1, TRUE) = NORM.S.DIST(x, TRUE). Documented identity, unmeasured bit agreement.
  • NORM.S.INV is the functional inverse of the cumulative branch.
  • PHI computes the same value as NORM.S.DIST(z, FALSE). The pointed fact here: EV-DIST-0022 identifies Excel's PHI as a squaring, an exponential and a multiply, with no erf and no CDF in the chain — a route that a cumulative-capable surface cannot be taking for its cumulative branch. Whether Excel's NORM.S.DIST(z, FALSE) shares PHI's chain or has its own is precisely the kind of question two surfaces for one function raise, and it is unanswered.
  • GAUSS is NORM.S.DIST(z, TRUE) − 0.5, i.e. Φ(z) − ½. GAUSS exists because that subtraction loses precision near the origin when done by the user, and it is one of the two surfaces EV-DIST-0018 reports as having drifted at its sweep.
  • ERF / ERFC are the underlying special functions; Φ(z) = ½ erfc(−z/√2).
  • Z.TEST, CONFIDENCE.NORM and STANDARDIZE are the usual consumers.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents