BESSELI(x, n) returns I_n(x), the modified Bessel function of the first kind, of integer
order n at the real point x. Microsoft describes it as the Bessel function evaluated for a purely
imaginary argument, which is the standard relation
I_n(x) = i^(−n) · J_n(i·x)
I_n is the solution that stays finite at the origin of the modified Bessel equation
x² w″ + x w′ − (x² + n²) w = 0
It has an everywhere-convergent power series and, for integer order, a short integral form:
Growth. For large x, I_n(x) ≈ e^x / √(2πx), and at that scale every order looks alike: the
order only appears as a factor close to e^(−n²/(2x)). I_0 is still representable in binary64
up to about x = 713.9.
The origin. I_0(0) = 1 and I_n(0) = 0 for n ≥ 1, with I_n(x) ≈ (x/2)^n / n! for small x.
Parity. I_n(−x) = (−1)^n · I_n(x): even orders are even functions and odd orders odd.
For integer order the function is real on the whole line, positive for x > 0, and has no poles and
no branch points. Everything difficult about BESSELI in Excel comes from how it is approximated.
Arguments
Argument
Meaning
Default
x
The value at which to evaluate the function. Required.
—
n
The order of the function. Required. Truncated if not an integer.
—
Truncation and the negative test. Microsoft states both that a non-integer n is truncated
and that n < 0 is #NUM!, and does not say which comes first. The recorded answers do: the
sign test sees the value before truncation. All 64 recorded calls with n strictly between
−1 and 0 returned #NUM! (Excel 16.0 build 20430, Windows 64-bit, CPU not recorded), although
truncating any of them gives 0. Positive fractions behave as documented: BESSELI(-1, 0.9) and
BESSELI(-1, 0) read the same.
BESSELI is not a function of real order. The notes below compute their "correct value" at the
integer part of n for that reason, and BESSELI(x, 3.99) is order 3.
The slots are numeric. Beyond Microsoft's statement that a nonnumeric argument gives #VALUE!, no
reading of text, a logical, an empty cell or an array in either slot is on record for this
function; see What has not been checked.
Try it
Quirks
Result and edge cases
Returns Number. Unless stated otherwise the behaviour below is read from recorded Excel answers
(builds 20430 and 20527, Windows 64-bit).
x = 0 gives 1 at order 0 and 0 at every higher order read (1, 2 and 10), as the
mathematics requires.
Negative x is admitted. Even orders return the value at |x|, and odd orders return it
negated, which was read at ±1 and at ±709.7.
The documented exampleBESSELI(1.5, 1) is printed by Microsoft as 0.981666428. Nine
digits is about what the function offers: the answers are accurate to roughly seven or eight
significant figures at ordinary arguments, not to fifteen. BESSELI(-1, 0) is the plainest
example in the notes below.
|x| just above 709.7 is #NUM! at every order read, although the true value is far inside
the binary64 range there. The notes below record the boundary to the adjacent double. The
failure is abrupt: BESSELI(709.7, 0) is a number near 2.48E306, and the next double up is an
error.
Orders 2 and above can be badly wrong at large x. At x = 709.7, order 3 is 53% below the
true value. This is a real wrong answer with no error raised, recorded in the notes below and
discussed under Numerical notes.
Very high orders can collapse to 0. At x = ±709.7, orders 1568 to 1572 all read 0 (build
20527), although the true values, from about 1.5E-299 down to 3.1E-302, are ordinary binary64
numbers. Order 10000 also read 0, which there is the right rounded answer: the true value is
near 2.9E-10154.
Errors
As documented on Microsoft's page:
Error
Condition
#VALUE!
x is nonnumeric
#VALUE!
n is nonnumeric
#NUM!
n < 0
As recorded, in addition to the documented #NUM! for n ≤ −1:
Error
Condition
Recorded on
#NUM!
n strictly between −1 and 0, where truncation would give 0
64 calls, build 20430
#NUM!
|x| above 709.7, either sign, at every order read from 0 to 10000
build 20527, AMD Ryzen 7 4800H
BESSELI is ITK's published polynomial and recurrence, on the x87 unit
BESSELI truncates n to an integer and evaluates the body published in ITK with every operation stored from the x87 unit at precision 64: the I0 and I1 polynomials, and for higher orders Miller backward recurrence from j = 2*(n + int(sqrt(40*n))), rescaling by 1E-10 whenever |q| > 1E10, then normalising by I0(x). The same body in plain binary64 misses by 1 to 4 units in the last place. The published ITK body is itkGaussianOperator.hxx at ITK 311b7060ef39e371f3cd209ec135284ff5fde735 (Apache-2.0).
Formula
Excel
Mathematical value
BESSELI(12.514410892637624, 3.987394155038235) Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this captureInputs and reference value
Number supplied through a cell.
x: 12.514410892637624 0x40290760dd512b66
n: 3.987394155038235 0x400fe62ee82134c8
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
21360.000787344507 0x40d4dc000ce65cba
21360.00150112302 0x40d4dc0018982a92
BESSELI(1.8661547234119729, 7.047660373731416) Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this captureInputs and reference value
Number supplied through a cell.
x: 1.8661547234119729 0x3ffddbc50e25491c
n: 7.047660373731416 0x401c30cde189f75e
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
0.0001361367103021099 0x3f21d7fd6fe380e0
0.00013613670961869657 0x3f21d7fd6e62c6a2
BESSELI(13.469754413420809, 10.617422640816173) Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this captureInputs and reference value
Number supplied through a cell.
x: 13.469754413420809 0x402af083a685968c
n: 10.617422640816173 0x40253c1ed2043b18
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
BESSELI and BESSELK are low-order approximations, rarely correctly rounded
BESSELI and BESSELK are low-order polynomial approximations. Over the recorded numeric rows with non-negative order, BESSELI gives the correctly rounded value on 2 of 1163 rows and BESSELK on 0 of 1155, with largest relative errors 5.0e-04 and 1.7e-07. BESSELI(-1,0) is 1.2660658480342601 where I0(1) is 1.2660658777520084, about 2.3E-8 relative.
Formula
Excel
Mathematical value
BESSELI(-1, 0) Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this captureInputs and reference value
Number supplied through a cell.
x: -1 0xbff0000000000000
n: 0 0x0000000000000000
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
1.2660658480342601 0x3ff441ce433e3c05
1.2660658777520084 0x3ff441ce4b386c2d
BESSELI(12.514410892637624, 3.987394155038235) Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this captureInputs and reference value
Number supplied through a cell.
x: 12.514410892637624 0x40290760dd512b66
n: 3.987394155038235 0x400fe62ee82134c8
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
21360.000787344507 0x40d4dc000ce65cba
21360.00150112302 0x40d4dc0018982a92
BESSELK(1.8447401994787955, 0.15119840195885237) Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this captureInputs and reference value
Number supplied through a cell.
x: 1.8447401994787955 0x3ffd840e4ca60c0e
n: 0.15119840195885237 0x3fc35a781fcf7430
mpmath besselk at 800 bits, order the integer part of n, correctly rounded.
At large x the fixed recurrence start makes BESSELI badly wrong
Excel's recurrence for orders above 1 starts at a fixed j = 2*(n + int(sqrt(40*n))), which is far too low at large x. At x = 709.7 BESSELI of order 2 is 0.20% high, and order 3 is 53% low, where I3(709.7) is 2.4631E306. Orders 0 and 1, which use the polynomial and not the recurrence, are within about 1.6E-7 at the same x.
Explanation (inferred): That the fixed start is the cause is inferred: a binary64 transcription of the published body gives the same bits for orders 0, 2 and 3 at this x.
Formula
Excel
Mathematical value
BESSELI(709.7, 3) Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
x: 709.7 0x40862d999999999a
n: 3 0x4008000000000000
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
1.1560227990465618e+306 0x7f7a56f66ecd12a0
2.4631300544524576e+306 0x7f8c0f97bbe572f6
BESSELI(709.7, 2) Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
x: 709.7 0x40862d999999999a
n: 2 0x4000000000000000
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
2.4767103124440567e+306 0x7f8c3732e70ce6f9
2.47182813908566e+306 0x7f8c28f5d197b1dd
BESSELI(709.7, 0) Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
x: 709.7 0x40862d999999999a
n: 0 0x0000000000000000
mpmath besseli at 800 bits, order the integer part of n, correctly rounded.
BESSELI gives #NUM! just above 709.7, where the function is still finite
BESSELI returns a number at |x| = 709.7 and #NUM! at the next binary64 above it, although I0 there is about 2.48E306, well inside the binary64 range. Recorded for orders 0, 1, 2, 3, 10 and 100, and for negative x at orders 0 to 2.
Explanation (inferred): That the same cut-off applies at every other order is inferred.
Formula
Excel
Mathematical value
BESSELI(709.7, 0) Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
x: 709.7 0x40862d999999999a
n: 0 0x0000000000000000
2.4788083687166675e+306 0x7f8c3d51558ee541
—
BESSELI(709.7000000000002, 0) Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
Number supplied through a cell.
x: 709.7000000000002 0x40862d999999999b
n: 0 0x0000000000000000
#NUM!
—
BESSELI(709.7000000000002, 1) Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800HInputs and reference value
These are low-order polynomials, by design. Orders 0 and 1 are the polynomial approximations
printed in Abramowitz & Stegun as 9.8.1 to 9.8.4: one polynomial in (x/3.75)² for |x| < 3.75 and
one in 3.75/|x|, multiplied by e^|x|/√|x|, from 3.75 up. The coefficients carry seven or eight
decimal places, and the printed error bounds reach 1.9E-7 for I_0 and 2.2E-7 for I_1 on each
form's own scale. In the large-x form that scale is a factor near 0.4, so the relative error of
I_0 can reach about 2.5 times the bound; the largest recorded at order 0 is 4.7E-7, at x = 100. The
notes below measure the result: correctly rounded on 2 of 1,163 recorded rows. Treat the answer as a seven-digit figure.
There is a seam at 3.75, and Excel shows it. Two different polynomials meet there and they do
not agree exactly. Build 20527 reads I_0 at adjacent doubles: the double below 3.75 is on the small
polynomial, 3.75 itself is on the large one, and the answer steps up by 2.1E-8 relative between
them. A numerical derivative taken across 3.75 is not to be trusted. The printed coefficients for
I_1 imply a smaller step, about 1.1E-8, which has not been read.
Orders 2 and above come from a backward recurrence. Stepping upward in n from I_0 and I_1 is
unstable for this function, so the standard method, due to Miller, starts high with an arbitrary
value, runs the recurrence downward where it is stable, and rescales the whole sequence at the
end by the known I_0(x). The notes below give Excel's exact staging. Two consequences are worth
knowing:
The error of I_0 is inherited. The normalisation uses the polynomial value of I_0, so a
healthy high-order answer carries order 0's relative error. The recorded rows show it plainly:
at x = 12.51 orders 0, 2 and 7 are all low by 3.34E-8, and at x = 709.7 orders 0 and 100 are
both low by 1.45E-7. The step at the seam reaches orders 2 and 17 by the same route.
The starting point ignores x. The recurrence starts at j = 2(n + ⌊√(40n)⌋), a function of
the order alone. That start is high enough while x is small compared with it. When x is much
larger, the sequence has too few steps to settle, and the answer is simply wrong.
How wrong, and where. The recorded values do not change smoothly with the order. At x near 709,
order 2 is high by 0.20%, order 3 is low by 53%, order 10 is high by 0.08%, and order 100 is as
good as order 0. The 1,236-row recording behind the notes stops at x = 50, apart from six rows at
x = 100. Its worst row at x ≤ 50 is about 9E-6 relative, at order 2, and the 5.0E-4 quoted in the
notes below is BESSELI(100, 2). So order 2 degrades steadily with x over the range read. Order 3
is about 1.6E-6 off near x = 50 and 53% low at 709, and the path between them has not been read.
The large-x failure is the one defect on this page that matters to an ordinary user: it raises
no error, and the wrong answer looks entirely plausible.
The collapse to 0 has a likely cause in the same recurrence. It computes the ratio I_n/I_0 and
only then multiplies by I_0. At x = 709.7 and high order that ratio is below the binary64 range
although the product is not, so the ratio underflows to 0 and the multiplication cannot recover it.
A plain binary64 transcription of the published body does this somewhere between orders 1100 and
1200 at this x. That is a computation on the published body, and the cause is an inference: Excel
itself has been read only at order 100 and then from order 1568.
The cut at 709.7. e^709.7 is about 1.65E308, just inside the binary64 range, and the exponential
itself overflows near 709.78. The polynomial's e^|x| factor is therefore the natural reason for a
guard at about this size, but the guard then gives up about four units of argument over which I_0
is still finite. The reason is an inference; only the boundary is measured.
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
20430
Windows, 64-bit, CPU not recorded
1,236
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.
BESSELI(12.514410892637624, 3.987394155038235) returned 21360.000787344507 (0x40d4dc000ce65cba). BESSELI(1.8661547234119729, 7.047660373731416) returned 0.0001361367103021099 (0x3f21d7fd6fe380e0). 3 further recorded controls are attached. Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.
BESSELI(709.7, 3) returned 1.1560227990465618e+306 (0x7f7a56f66ecd12a0). BESSELI(709.7, 2) returned 2.4767103124440567e+306 (0x7f8c3732e70ce6f9). 4 further recorded controls are attached. Inputs were supplied through cells using Value2. These are controls from this environment, not a same-input comparison with another build.
1,236 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
BESSELK — the other modified Bessel function, decaying where this one
grows. The two are tied by an exact cross-product,
I_n(x)·K_(n+1)(x) + I_(n+1)(x)·K_n(x) = 1/x, which needs no oracle and is a useful sanity test on
any pair of answers. BESSELK shares this page's accuracy note but none of the large-x
trouble below, because it steps upward.
EXP — every answer at |x| ≥ 3.75 carries a factor e^|x|, which is the likely reason for the
cut near 709.7.
The recurrence. I_(n−1)(x) − I_(n+1)(x) = (2n/x)·I_n(x) links neighbouring orders. It gives a
workaround for the large-x defect at low order: BESSELI(x,0) - 2/x*BESSELI(x,1) is I_2(x)
from the two orders that do not use the recurrence. That identity is mathematics; it has not
been read in Excel as a repair.
Where readers meet it. I_0(κ) is the normalising constant of the von Mises distribution, and
I_0 and I_1 appear in the Rician distribution and in radially symmetric diffusion problems.