s17ad returns the value of the Bessel function Y1x.


public static double s17ad(
	double x,
	out int ifail
Visual Basic
Public Shared Function s17ad ( _
	x As Double, _
	<OutAttribute> ByRef ifail As Integer _
) As Double
Visual C++
static double s17ad(
	double x, 
	[OutAttribute] int% ifail
static member s17ad : 
        x : float * 
        ifail : int byref -> float 


Type: System..::..Double
On entry: the argument x of the function.
Constraint: x>0.0.
Type: System..::..Int32%
On exit: ifail=0 unless the method detects an error or a warning has been flagged (see [Error Indicators and Warnings]).

Return Value

s17ad returns the value of the Bessel function Y1x.


s17ad evaluates an approximation to the Bessel function of the second kind Y1x.
Note:  Y1x is undefined for x0 and the method will fail for such arguments.
The method is based on four Chebyshev expansions:
For 0<x8,
Y1x=2πlnxx8r=0arTrt-2πx+x8r=0brTrt,   with ​t=2x82-1.
For x>8,
where P1x=r=0crTrt,
and Q1x=8xr=0drTrt, with t=28x2-1.
For x near zero, Y1x-2πx. This approximation is used when x is sufficiently small for the result to be correct to machine precision. For extremely small x, there is a danger of overflow in calculating -2πx and for such arguments the method will fail.
For very large x, it becomes impossible to provide results with any reasonable accuracy (see [Accuracy]), hence the method fails. Such arguments contain insufficient information to determine the phase of oscillation of Y1x; only the amplitude, 2πx, can be determined and this is returned on failure. The range for which this occurs is roughly related to machine precision; the method will fail if x1/machine precision (see the Users' Note for your implementation for details).


Abramowitz M and Stegun I A (1972) Handbook of Mathematical Functions (3rd Edition) Dover Publications
Clenshaw C W (1962) Chebyshev Series for Mathematical Functions Mathematical tables HMSO

Error Indicators and Warnings

Errors or warnings detected by the method:
x is too large. On failure the method returns the amplitude of the Y1 oscillation, 2πx.
x0.0, Y1 is undefined. On failure the method returns zero.
x is too close to zero, there is a danger of overflow. On failure, the method returns the value of Y1x at the smallest valid argument.
An error occured, see message report.


Let δ be the relative error in the argument and E be the absolute error in the result. (Since Y1x oscillates about zero, absolute error and not relative error is significant, except for very small x.)
If δ is somewhat larger than the machine precision (e.g., if δ is due to data errors etc.), then E and δ are approximately related by:
(provided E is also within machine bounds). Figure 1 displays the behaviour of the amplification factor xY0x-Y1x.
However, if δ is of the same order as machine precision, then rounding errors could make E slightly larger than the above relation predicts.
For very small x, absolute error becomes large, but the relative error in the result is of the same order as δ.
For very large x, the above relation ceases to apply. In this region, Y1x2πxsinx-3π4. The amplitude 2πx can be calculated with reasonable accuracy for all x, but sinx-3π4 cannot. If x-3π4 is written as 2Nπ+θ where N is an integer and 0θ<2π, then sinx-3π4 is determined by θ only. If x>δ-1, θ cannot be determined with any accuracy at all. Thus if x is greater than, or of the order of, the inverse of the machine precision, it is impossible to calculate the phase of Y1x and the method must fail.
Figure 1
Figure 1

Parallelism and Performance


Further Comments



This example reads values of the argument x from a file, evaluates the function at each value of x and prints the results.

Example program (C#): s17ade.cs

Example program data: s17ade.d

Example program results: s17ade.r

See Also