Excel 16.0 build 19929
Windows, bitness not recorded, CPU not recorded
41 captured inputs are indexed for this environment. Capture dates are not recorded. This is a reading count, not a comparison with another build.
Statistical functions
Matches all 3 recorded answers
Recorded: 3 workbook cells. How we measure this · See the Rust code
| Language | Name in Excel |
|---|---|
| Arabic | FISHERINV |
| Bulgarian | FISHERINV |
| Czech | FISHERINV |
| Danish | FISHERINV |
| German | FISHERINV |
| Greek | FISHERINV |
| English (Australia) | FISHERINV |
| English (United Kingdom) | FISHERINV |
| English (United States) | FISHERINV |
| Spanish | PRUEBA.FISHER.INV |
| Estonian | FISHERINV |
| Finnish | FISHER.KÄÄNT |
| French | FISHER.INVERSE |
| Hebrew | FISHERINV |
| Croatian | FISHERINV |
| Hungarian | INVERZ.FISHER |
| Indonesian | FISHERINV |
| Italian | FISHERINV |
| Japanese | FISHERINV |
| Korean | FISHERINV |
| Lithuanian | FISHERINV |
| Latvian | FISHERINV |
| Norwegian | FISHERINV |
| Dutch | FISHER.INV |
| Polish | ROZKŁAD.FISHER.ODW |
| Portuguese (Brazil) | FISHERINV |
| Portuguese (Portugal) | FISHERINV |
| Romanian | FISHERINV |
| Russian | ФИШЕРОБР |
| Slovak | FISHERINV |
| Slovenian | FISHERINV |
| Serbian (Latin) | FISHERINV |
| Swedish | FISHERINV |
| Thai | FISHERINV |
| Turkish | FISHERTERS işlevi |
| Ukrainian | FISHERINV |
| Vietnamese | FISHERINV |
| Chinese (Simplified) | FISHERINV |
| Chinese (Hong Kong) | FISHERINV |
| Chinese (Traditional) | FISHERINV |
Names from Microsoft's support site.
FISHERINV(y)
FISHERINV(y) is the hyperbolic tangent:
FISHERINV(y) = tanh(y) = (e^{2y} − 1) / (e^{2y} + 1)
= (e^{y} − e^{−y}) / (e^{y} + e^{−y})
Microsoft states the relationship rather than the formula: "If y = FISHER(x), then FISHERINV(y) = x." That is the defining property, and it is exact as mathematics — tanh and artanh are genuine mutual inverses on (−1, 1) ↔ ℝ. It is not exact as floating point, and the round trip is one of the more useful probes this pair offers; see Numerical notes.
The statistical use is the return leg of the Fisher z-transformation: build a confidence
interval on the transformed scale, where the sampling distribution is approximately normal,
then map the interval endpoints back to correlations with FISHERINV. Because tanh is
monotone, the mapped interval is still an interval, and because it is nonlinear, the mapped
interval is asymmetric about the point estimate — which is the whole point.
| Argument | Meaning | Default |
|---|---|---|
y | The value to transform back. Required. | — |
Returns Number, always in [−1, 1] once floating point is accounted for.
y, including subnormals, returns y to within a rounding, because
tanh(y) = y + O(y³).y saturates at exactly 1, and large negative y at exactly −1. This is
a floating-point fact, not a mathematical one: the true value never reaches the endpoint,
but the nearest double to it is the endpoint once |y| is beyond roughly 19.As documented by Microsoft:
| Error | Condition |
|---|---|
#VALUE! | y is nonnumeric |
That is the entire documented error surface — one row. There is no documented #NUM!
condition, which is unusual for a Statistical-category function and is the clearest
structural contrast with FISHER. Error values arriving in the argument propagate under the
shared coercion discipline.
What the documentation does not say, and this page will not invent: what happens for an argument so large that the intermediate exponential overflows. The documented error table has no row for it, the mathematical answer is a value inside the range, and the observed answer in the upstream record is saturation — but "documented" and "observed once, upstream" are different warrants and the Handbook keeps them apart.
tanh(y) = expm1(2y) / (expm1(2y) + 2)
removes that cancellation entirely, which is why fdlibm's tanh is written that way. The
symmetric form (e^y − e^{−y})/(e^y + e^{−y}) costs two exponentials and still overflows.
The standard treatment — fdlibm, Cephes, Boost — is a three-region split: return y (or the
first series term) below a small threshold; use the expm1 form in the middle; and return
±1 with a token dependence on y beyond the saturation threshold, so the sign and the
rounding mode behave. Argument reduction is not needed; tanh is its own reduction.
The round trip is a good test and a bad guarantee. FISHERINV(FISHER(x)) recovers x
exactly only when the two roundings happen to cancel. Near x = 0 both functions are
approximately the identity and the round trip is faithful; near |x| = 1 the forward map
expands and the backward map contracts, so the round trip is catastrophically unstable there —
a change of one ulp in the transformed value moves the recovered correlation by far more than
one ulp. That instability is a property of the mathematics, not a defect, and it is precisely
why the transformation is useful: it spreads out the region where correlations are hard to
distinguish.
What a careful implementation does. Use expm1; special-case the origin so the signed zero
survives; pick the saturation threshold from the actual double spacing rather than a
hard-coded constant; and never let an intermediate infinity reach a quotient.
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.
FISHERINV · 3 lines · calc-func/src/catalogue/statistics.rs on GitHub52 fisherinv "FISHERINV" (1, 1) [V "y"] |s, a, sv| {
out(s, k::fisherinv_fn::fisherinv_kernel(num(s, a, 0)?))
}
fisherinv_kernel · 13 lines · calc-func/src/ported/fisherinv_fn.rs on GitHubpub fn fisherinv_kernel(y: f64) -> Result<f64, WorksheetErrorCode> {
// Inverse-problem identity, live Excel 16.0 b20228: FISHERINV(y) ==
// (EXP(2*y)-1)/(EXP(2*y)+1) on 27/27 signed rows. FISHERINV is not
// TANH (10/27). The algebraically equal 1-2/(EXP(2*y)+1) misses (9/27).
let e = crate::ported::excel_numeric::excel_exp(2.0 * y);
// BUG-FUNC-027 CLASS-A6: for large positive y, e=e^(2y) overflows to +Inf and
// the direct form gives Inf/Inf = NaN; Excel saturates to +1. The large
// negative side already saturates to -1 via e -> 0, so only +Inf needs a guard.
if e.is_infinite() {
return Ok(1.0);
}
Ok((e - 1.0) / (e + 1.0))
}
No 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 |
|---|---|---|
| 19929 | Windows, bitness not recorded, CPU not recorded | 41 |
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, bitness not recorded, CPU not recorded
41 captured inputs are indexed for this environment. Capture dates are not recorded. This is a reading count, not a comparison with another build.
FISHER guards its domain with #NUM!; FISHERINV has no domain
to guard and documents no #NUM! at all.TANH — the Math-category spelling of the same mathematical function. Excel ships both.
They are documented to compute the same thing; whether they are the same computation, and
therefore agree in the last bit, is unestablished and would need evidence. Do not assume it.CORREL / PEARSON — the correlation estimators whose transformed confidence bounds
are mapped back through this function.NORM.S.INV — the quantile that sets those bounds on the transformed scale.EXP, LN — the substrate. Any statement about FISHERINV's last bits is ultimately a
statement about the exponential the platform provides.No named variants are recorded yet.
Suggest a correction or contribute an implementation · For agents