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
Language
Name in Excel
Arabic
NORM.S.DIST
Bulgarian
NORM.S.DIST
Czech
NORM.S.DIST
Danish
STANDARD.NORM.FORDELING
German
NORM.S.DIST
Greek
NORM.S.DIST
English (Australia)
NORM.S.DIST
English (United Kingdom)
NORM.S.DIST
English (United States)
NORM.S.DIST
Spanish
DISTR.NORM.ESTAND.N
Estonian
NORM.S.DIST
Finnish
NORM_JAKAUMA.NORMIT
French
LOI.NORMALE.STANDARD.N
Hebrew
NORM.S.DIST
Croatian
NORM.S.DIST
Hungarian
NORM.S.ELOSZLÁS
Indonesian
NORM.S.DIST
Italian
NORM.S.DIST
Japanese
NORM.S.DIST
Korean
NORM.S.DIST
Lithuanian
NORM.S.DIST
Latvian
NORM.S.DIST
Norwegian
NORM.S.FORDELING
Dutch
NORM.S.VERD
Polish
ROZKŁ.NORMALNY.S
Portuguese (Brazil)
NORM.S.DIST
Portuguese (Portugal)
DIST.S.NORM
Romanian
NORM.S.DIST
Russian
НОРМ.СТ.РАСП
Slovak
NORM.S.DIST
Slovenian
NORM.S.DIST
Serbian (Latin)
NORM.S.DIST
Swedish
NORM.S.FÖRD
Thai
NORM.S.DIST
Turkish
NORM.S.DAĞ
Ukrainian
NORM.S.DIST
Vietnamese
NORM.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.
Φ(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:
Argument
Meaning
Required
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
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):
Error
Documented 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.
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 build
Platform and CPU
Captured inputs
20131
Windows, bitness not recorded, AMD Ryzen 7 4800H with Radeon Graphics
16,495
20430
Windows, 64-bit, CPU not recorded
10,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.
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.