Written and maintained by CASRAI Editorial Board
Last updated
The inverse normal distribution answers one question: given a probability, which value of a normally distributed variable has that much probability at or below it? Software computes it with NORM.INV and NORM.S.INV in Excel, qnorm in R and norm.ppf in Python. Calculators call it “inverse norm”. All of them are the same operation: the inverse of the normal cumulative distribution function.
What the inverse normal distribution is
The normal cumulative distribution function (CDF) takes a value x and returns the probability of observing a value at or below x. The inverse normal runs that map backwards: you supply the probability p and get back the value x. In R’s documentation, qnorm is “the quantile function of the normal distribution”; SciPy calls the same thing the percent point function (ppf), “the inverse of cdf – percentiles”. Microsoft describes NORM.INV as returning “the inverse of the normal cumulative distribution for the specified mean and standard deviation”.
It is the machinery behind percentiles and quantiles of a normal variable: the 90th percentile is simply the inverse normal at p = 0.90. Printed tables for critical values are a lookup of the same function (see how to find a critical value); this page covers the function itself and how to run it in software. For the specific zα values used in hypothesis tests, see z-alpha.
Formula and symbols
If X follows a normal distribution with mean μ and standard deviation σ, and Φ is the CDF of the standard normal distribution (mean 0, standard deviation 1), then:
- CDF: p = P(X ≤ x) = Φ((x − μ) / σ)
- Inverse: x = μ + σ × Φ−1(p)
- p: the cumulative probability, strictly between 0 and 1.
- Φ−1(p): the standard normal quantile (the z value) for p, often written zp.
- μ: the mean of the variable.
- σ: the standard deviation of the variable, which must be greater than zero.
- x: the value you are solving for.
The NIST/SEMATECH e-Handbook notes that “the formula for the percent point function of the normal distribution does not exist in a simple closed formula” and that it “is computed numerically”. Excel’s NORM.S.INV likewise “uses an iterative search technique”, and R’s qnorm is based on Wichura’s (1988) algorithm AS 241, giving “precise results up to about 16 digits”. In practice you never evaluate Φ−1 by hand; you call a function or read a z table backwards.
Worked example with the arithmetic shown
Exam scores are approximately normal with mean μ = 70 and standard deviation σ = 8. What score marks the 90th percentile?
- The cumulative probability is p = 0.90.
- The standard normal quantile is Φ−1(0.90) = 1.2816 (rounded to four decimals).
- Convert to the score scale: x = μ + σ × z = 70 + 8 × 1.2816 = 70 + 10.2528 = 80.25.
Check by going forward: the standardized value is (80.25 − 70) / 8 = 1.28, and the normal CDF at 1.28 is about 0.90, so 90% of scores fall at or below 80.25. The lower tail works the same way: p = 0.10 gives z = −1.2816 and x = 70 − 10.2528 = 59.75.
Microsoft’s own example for NORM.INV uses probability 0.908789, mean 40 and standard deviation 1.5, and returns 42.000002, which the page treats as 42. Check: z = (42 − 40) / 1.5 = 1.3333, and NORM.S.INV(0.908789) returns 1.3333347 on the standard scale.
Reading the result
The table gives standard normal quantiles for common lower-tail probabilities (computed values, rounded to four decimals). To use them for any normal variable, apply x = μ + σ × z.
| Lower-tail probability p | z = Φ−1(p) | What it means |
|---|---|---|
| 0.025 | −1.9600 | 2.5% of values lie below this point |
| 0.05 | −1.6449 | 5% lie below |
| 0.10 | −1.2816 | 10% lie below |
| 0.50 | 0.0000 | the median, equal to the mean for a normal distribution |
| 0.90 | 1.2816 | 90% lie below |
| 0.95 | 1.6449 | 95% lie below |
| 0.975 | 1.9600 | 97.5% lie below |
Because the normal curve is symmetric, Φ−1(1 − p) = −Φ−1(p). The result is a value on the variable’s own scale (a score, a height, a concentration), or on the z scale when the mean is 0 and the standard deviation is 1. A negative z lies below the mean, a positive z above it; see z-scores for the forward direction.
Lower tail versus upper tail
The default in every tool below is the lower tail: probability to the left of x. If you know the area to the right (a p-value or an exceedance probability), convert it first.
| Tool | Lower tail (default) | Upper tail |
|---|---|---|
| Excel | =NORM.INV(p, mean, sd) |
=NORM.INV(1-p, mean, sd) |
| R | qnorm(p, mean, sd) |
qnorm(p, mean, sd, lower.tail = FALSE) |
| Python (SciPy) | norm.ppf(p, loc, scale) |
norm.isf(p, loc, scale) |
In R, lower.tail TRUE (the default) means probabilities are P[X ≤ x], otherwise P[X > x]. SciPy’s isf is the “inverse survival function”, the upper-tail counterpart of ppf.
Assumptions and common mistakes
- The variable must be approximately normal. The inverse normal tells you about a normal model, not about your data. Check the fit first, for example with a Q-Q plot.
- p cannot be 0 or 1. Excel returns #NUM! when probability is less than or equal to 0 or greater than or equal to 1, and also when the standard deviation is less than or equal to 0. Nonnumeric input returns #VALUE!.
- Mixing up tails. Feeding a right-tail probability into a lower-tail function gives a value on the wrong side of the mean. Use
1 − p,lower.tail = FALSEorisf. - Confusing p with a percentage. Enter 0.95, not 95.
- Using the standard function with a non-standard variable.
NORM.S.INVreturns z; you must still apply x = μ + σz.NORM.INVwith mean 0 and standard deviation 1 uses the standard normal distribution and gives the same z. - Expecting exact arithmetic. Microsoft notes that the precision of
NORM.INVdepends on the precision ofNORM.DIST, which is why its documented example returns 42.000002 rather than exactly 42.
How to report it (APA example)
State the model, its parameters, the probability and the result, rounded consistently. For the worked example:
Assuming normally distributed exam scores (M = 70, SD = 8), the 90th percentile was 80.25, obtained as the inverse of the normal cumulative distribution at p = .90 (z = 1.28).
Name the software and version you used if the number feeds into a reported analysis, and say which tail you used when the probability is not a lower-tail one.
How to calculate it in Excel, R or Python
Excel
=NORM.INV(0.9, 70, 8) // 80.25
=NORM.S.INV(0.9) // 1.2816 (standard normal z)
Syntax: NORM.INV(probability, mean, standard_dev), all three required. NORM.S.INV(probability) takes only the probability.
R
qnorm(0.9, mean = 70, sd = 8) # 80.25241
qnorm(0.9) # 1.281552
Python
from scipy.stats import norm
norm.ppf(0.9, loc=70, scale=8) # 80.25241
norm.ppf(0.9) # 1.2815515655446004
In SciPy, loc and scale are the mean and standard deviation; passing them is equivalent to standardizing with y = (x − loc) / scale. Graphing calculators offer the same function, usually labelled “invNorm”; check the manual for the order of its arguments.
Frequently asked questions
What is the difference between NORM.INV and NORM.S.INV?
NORM.INV takes a mean and standard deviation and returns a value on the variable’s own scale. NORM.S.INV assumes mean 0 and standard deviation 1 and returns a z value.
Is the inverse normal the same as the percent point function or quantile function?
Yes. R calls it the quantile function (qnorm) and SciPy calls it the percent point function (ppf); both invert the normal CDF.
Why is there no simple formula for the inverse normal?
The NIST/SEMATECH e-Handbook states that the percent point function of the normal distribution has no simple closed formula, so software computes it numerically.
What happens if I enter a probability of 0 or 1?
In Excel the result is #NUM!, because the function requires a probability strictly between 0 and 1.
How do I get a value from an upper-tail probability?
Use 1 − p with the default function, or set lower.tail = FALSE in R, or use isf in SciPy.
For the full normal model, including the forward direction, see the normal and standard normal distribution.
Sources
- Microsoft Support, NORM.INV function: https://support.microsoft.com/en-us/office/norm-inv-function-54b30935-fee7-493c-bedb-2278a9db7e13 (checked 2026-10-29).
- Microsoft Support, NORM.S.INV function: https://support.microsoft.com/en-us/office/norm-s-inv-function-d6d556b4-ab7f-49cd-b526-5a20918452b1 (checked 2026-10-29).
- R Documentation, The Normal Distribution (stats package): https://stat.ethz.ch/R-manual/R-devel/library/stats/html/Normal.html (checked 2026-10-29).
- SciPy documentation, scipy.stats.norm: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html (checked 2026-10-29).
- NIST/SEMATECH e-Handbook of Statistical Methods, Normal Distribution: https://www.itl.nist.gov/div898/handbook/eda/section3/eda3661.htm (checked 2026-10-29).








