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.
Statistical functions
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
| Language | Name in Excel |
|---|---|
| Arabic | NORM.DIST |
| Bulgarian | NORM.DIST |
| Czech | NORM.DIST |
| Danish | NORMAL.FORDELING |
| German | NORM.DIST |
| Greek | NORM.DIST |
| English (Australia) | NORM.DIST |
| English (United Kingdom) | NORM.DIST |
| English (United States) | NORM.DIST |
| Spanish | DISTR.NORM.N |
| Estonian | NORM.DIST |
| Finnish | NORMAALI.JAKAUMA |
| French | LOI.NORMALE.N |
| Hebrew | NORM.DIST |
| Croatian | NORM.DIST |
| Hungarian | NORM.ELOSZLÁS |
| Indonesian | NORM.DIST |
| Italian | NORM.DIST |
| Japanese | NORM.DIST |
| Korean | NORM.DIST |
| Lithuanian | NORM.DIST |
| Latvian | NORM.DIST |
| Norwegian | NORM.DIST |
| Dutch | NORM.DIST |
| Polish | ROZKŁ.NORMALNY |
| Portuguese (Brazil) | NORM.DIST |
| Portuguese (Portugal) | DIST.NORMAL |
| Romanian | NORM.DIST |
| Russian | НОРМ.РАСП |
| Slovak | NORM.DIST |
| Slovenian | NORM.DIST |
| Serbian (Latin) | NORM.DIST |
| Swedish | NORM.FÖRD |
| Thai | NORM.DIST |
| Turkish | NORM.DAĞ |
| Ukrainian | NORM.DIST |
| Vietnamese | NORM.DIST |
| Chinese (Simplified) | NORM.DIST |
| Chinese (Hong Kong) | NORM.DIST |
| Chinese (Traditional) | NORM.DIST |
Names from Microsoft's support site.
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.
Microsoft's page gives four required arguments:
| Argument | Meaning | Required |
|---|---|---|
x | The value for which you want the distribution | yes |
mean | The arithmetic mean of the distribution | yes |
standard_dev | The standard deviation of the distribution | yes |
cumulative | A logical: TRUE gives the cumulative distribution function, FALSE the probability density function | yes |
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.
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.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.|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.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.
As documented by Microsoft on the NORM.DIST page (retrieved for this page):
| Error | Documented 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:
#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.#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.
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.
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 GitHub1 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)?))
}
nums catalogue/distributionsbinary_with ported/excel_numericexcel_x87_add ported/excel_numericexcel_x87_sub ported/excel_numericexcel_x87_mul ported/excel_numericexcel_x87_div ported/excel_numericmul ported/excel_numeric/x87add ported/excel_numeric/x87sub ported/excel_numeric/x87div ported/excel_numeric/x87stored_horner ported/normal_dist_commonerf_approx ported/normal_dist_commonerfc_upper ported/normal_dist_commonflush_subnormal ported/normal_log_familyidentified_std_normal_cdf ported/normal_log_familynorm_cdf ported/normal_log_familyvalidate_positive_sigma ported/normal_log_familynorm_dist_kernel ported/normal_log_familyerfc_kernel ported/special_dist_familyerfc_precise_kernel ported/special_dist_familyNo implementation has been published with a Handbook test suite for this function.
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 |
|---|---|---|
| 20430 | Windows, 64-bit, CPU not recorded | 24,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.
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.
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(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.NORM.DIST(x, 0, 1, FALSE) under a shorter name.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.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.No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents