Engineering functions

BESSELI

Matches all 1,462 recorded answers

Recorded: 1,365 in the answer bank and 97 workbook cells. How we measure this · See the Rust code

Local names in 40 languages
LanguageName in Excel
ArabicBESSELI
BulgarianBESSELI
CzechBESSELI
DanishBESSELI
GermanBESSELI
GreekBESSELI
English (Australia)BESSELI
English (United Kingdom)BESSELI
English (United States)BESSELI
SpanishBESSELI
EstonianBESSELI
FinnishBESSELI
FrenchBESSELI
HebrewBESSELI
CroatianBESSELI
HungarianBESSELI
IndonesianBESSELI
ItalianBESSELI
JapaneseBESSELI
KoreanBESSELI
LithuanianBESSELI
LatvianBESSELI
NorwegianBESSELI
DutchBESSELI
PolishBESSEL.I
Portuguese (Brazil)BESSELI
Portuguese (Portugal)BESSELI
RomanianBESSELI
RussianБЕССЕЛЬ.I
SlovakBESSELI
SlovenianBESSELI
Serbian (Latin)BESSELI
SwedishBESSELI
ThaiBESSELI
TurkishBESSELI Denklemi
UkrainianBESSELI
VietnameseBESSELI
Chinese (Simplified)BESSELI
Chinese (Hong Kong)BESSELI
Chinese (Traditional)BESSELI

Names from Microsoft's support site.

What it does

BESSELI(x, n)

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:

I_n(x)  =  Σ_{k≥0}  (x/2)^(2k+n) / ( k! · (k+n)! )
I_n(x)  =  (1/π) ∫₀^π  e^(x cos θ) cos(nθ) dθ

Three facts about its shape matter below.

  • 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

ArgumentMeaningDefault
xThe value at which to evaluate the function. Required.—
nThe 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

Input cells (optional)

Example: {"B2": 3, "B3": 4}. A1 holds the formula. Other cells need values before a formula can read them.

Enter a formula, then calculate.

Runs locally in your browser with OneCalc. Its answer may differ from Excel. Use English function names and commas between arguments.

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 example BESSELI(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:

ErrorCondition
#VALUE!x is nonnumeric
#VALUE!n is nonnumeric
#NUM!n < 0

As recorded, in addition to the documented #NUM! for n ≤ −1:

ErrorConditionRecorded on
#NUM!n strictly between −1 and 0, where truncation would give 064 calls, build 20430
#NUM!|x| above 709.7, either sign, at every order read from 0 to 10000build 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).

FormulaExcelMathematical value
BESSELI(12.514410892637624, 3.987394155038235)
Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this capture
Inputs 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 capture
Inputs 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 capture
Inputs 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.

1957.477427686333
0x409e95e8e2cdac05
1957.477488938039
0x409e95e8f2dc3451

Inputs, build details and evidence

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.

FormulaExcelMathematical value
BESSELI(-1, 0)
Excel 16.0 build 20430, Windows 64-bit, CPU not recorded in this capture
Inputs 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 capture
Inputs 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 capture
Inputs 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.

0.1380029049573409
0x3fc1aa1445c5bb34
0.13800289523526038
0x3fc1aa1430e4f602

Inputs, build details and evidence

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.

FormulaExcelMathematical value
BESSELI(709.7, 3)
Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800H
Inputs 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 4800H
Inputs 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 4800H
Inputs 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.

2.4788083687166675e+306
0x7f8c3d51558ee541
2.4788087273156452e+306
0x7f8c3d519a191ac9

Inputs, build details and evidence

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.

FormulaExcelMathematical value
BESSELI(709.7, 0)
Excel 16.0 build 20527, Windows 64-bit, AMD Ryzen 7 4800H
Inputs 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 4800H
Inputs 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 4800H
Inputs and reference value

Number supplied through a cell.

x: 709.7000000000002
0x40862d999999999b

n: 1
0x3ff0000000000000

#NUM!—

Inputs, build details and evidence

How to implement

Numerical notes

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:

  1. 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.
  2. 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.

BESSELI · 1 lines · calc-func/src/catalogue/engineering.rs on GitHub
60 besseli "BESSELI" (2, 2) [V "x", V "n"] |s, a, sv| { bessel(s, a, k::bessel::besseli_kernel, false) }
besseli_kernel · 20 lines · calc-func/src/ported/bessel.rs on GitHub
/// `BESSELI(x, n)`.
pub fn besseli_kernel(x: f64, n: f64) -> Result<f64, WorksheetErrorCode> {
    // Use one admission policy across orders, extending the adjacent-input
    // measurements at orders 0, 1, 2, 3, 10 and 100. Higher orders still need
    // Excel measurements; a representable series value alone cannot settle
    // their admission. EXP itself admits larger x.
    if !x.is_finite() || x.abs() > 709.7 { return Err(WorksheetErrorCode::Num); }
    let n = order(n)?;
    let x = D::new(x);
    finish(Ok(match n {
        0 => D::new(super::bessel_rational::i0(x.0, &I0_SMALL, &I0_LARGE)),
        1 => i1(x),
        _ if x.0 == 0.0 => D(0.0),
        _ => {
            let ax = x.abs();
            let normalizer = super::bessel_rational::i0(ax.0, &I0_SMALL, &I0_LARGE);
            odd_sign(x, n, D::new(super::bessel_rational::in_(n, ax.0, normalizer)))
        },
    }))
}
i0 · 12 lines · calc-func/src/ported/bessel_rational.rs on GitHub
pub(super) fn i0(x: f64, small: &[f64], large: &[f64]) -> f64 {
    let magnitude = x.abs();
    if magnitude < 3.75 {
        let reduced = excel_x87_div(x, 3.75);
        let square = excel_x87_mul(reduced, reduced);
        polynomial_with(square, small, excel_x87_mul, excel_x87_add)
    } else {
        let reduced = excel_x87_div(3.75, magnitude);
        let scale = excel_x87_div(excel_exp(magnitude), excel_sqrt_staged(magnitude));
        excel_x87_mul(scale, polynomial_with(reduced, large, excel_x87_mul, excel_x87_add))
    }
}
in_ · 26 lines · calc-func/src/ported/bessel_rational.rs on GitHub
/// The published higher-order body; its caller owns order admission and parity.
pub(super) fn in_(order: u32, magnitude: f64, normalizer: f64) -> f64 {
    if magnitude == 0.0 {
        return 0.0;
    }
    let twice_over_x = excel_x87_div(2.0, magnitude);
    let mut next = 0.0;
    let mut current = 1.0;
    let mut answer = 0.0;
    let start = 2 * (order + (40.0 * f64::from(order)).sqrt() as u32);
    for j in (1..=start).rev() {
        let coefficient = excel_x87_mul(f64::from(j), twice_over_x);
        let previous = excel_x87_add(next, excel_x87_mul(coefficient, current));
        next = current;
        current = previous;
        if current.abs() > 1e10 {
            answer = excel_x87_mul(answer, 1e-10);
            current = excel_x87_mul(current, 1e-10);
            next = excel_x87_mul(next, 1e-10);
        }
        if j == order {
            answer = next;
        }
    }
    excel_x87_mul(answer, excel_x87_div(normalizer, current))
}

Kernels shared with other functions

Argument and result plumbing

  • fail catalogue/kit
  • num catalogue/kit
  • out catalogue/kit

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 buildPlatform and CPUCaptured inputs
20430Windows, 64-bit, CPU not recorded1,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.

Recorded environments and comparison details.

Excel 16.0 build 20430

Windows 64-bit, CPU not recorded in this capture

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.

Observed formulas and results
  • BESSELI(12.514410892637624, 3.987394155038235) → 21360.000787344507
    0x40d4dc000ce65cba (cell-value2)
  • BESSELI(1.8661547234119729, 7.047660373731416) → 0.0001361367103021099
    0x3f21d7fd6fe380e0 (cell-value2)
  • BESSELI(13.469754413420809, 10.617422640816173) → 1957.477427686333
    0x409e95e8e2cdac05 (cell-value2)
  • BESSELI(-1, 0) → 1.2660658480342601
    0x3ff441ce433e3c05 (cell-value2)
  • BESSELI(12.514410892637624, 3.987394155038235) → 21360.000787344507
    0x40d4dc000ce65cba (cell-value2)

Excel 16.0 build 20527

Windows 64-bit, AMD Ryzen 7 4800H

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.

Observed formulas and results
  • BESSELI(709.7, 3) → 1.1560227990465618e+306
    0x7f7a56f66ecd12a0 (cell-value2)
  • BESSELI(709.7, 2) → 2.4767103124440567e+306
    0x7f8c3732e70ce6f9 (cell-value2)
  • BESSELI(709.7, 0) → 2.4788083687166675e+306
    0x7f8c3d51558ee541 (cell-value2)
  • BESSELI(709.7, 0) → 2.4788083687166675e+306
    0x7f8c3d51558ee541 (cell-value2)
  • BESSELI(709.7000000000002, 0) → #NUM! (cell-value2)
  • BESSELI(709.7000000000002, 1) → #NUM! (cell-value2)

Excel 16.0 build 20430

Windows, 64-bit, CPU not recorded

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.

Named variants

No named variants are recorded yet.

Suggest a correction or contribute an implementation · For agents