.\" Copyright 2004 Andries Brouwer <aeb@cwi.nl>.
.\"
.\" %%%LICENSE_START(VERBATIM)
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one.
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.  The author(s) may not
.\" have taken the same level of care in the production of this manual,
.\" which is licensed free of charge, as they might when working
.\" professionally.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\" %%%LICENSE_END
.\"
.TH FINITE 3  2021-03-22 "" "Linux Programmer's Manual"
.SH NAME
finite, finitef, finitel, isinf, isinff, isinfl, isnan, isnanf, isnanl \-
BSD floating-point classification functions
.SH SYNOPSIS
.nf
.B #include <math.h>
.PP
.BI "int finite(double " x );
.BI "int finitef(float " x );
.BI "int finitel(long double " x );
.PP
.BI "int isinf(double " x );
.BI "int isinff(float " x );
.BI "int isinfl(long double " x );
.PP
.BI "int isnan(double " x );
.BI "int isnanf(float " x );
.BI "int isnanl(long double " x );
.fi
.PP
.RS -4
Feature Test Macro Requirements for glibc (see
.BR feature_test_macros (7)):
.RE
.PP
.BR finite (),
.BR finitef (),
.BR finitel ():
.nf
    /* Glibc since 2.19: */ _DEFAULT_SOURCE
        || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
.PP
.BR isinf ():
    _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE
        || /* Glibc since 2.19: */ _DEFAULT_SOURCE
        || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
.fi
.PP
.BR isinff (),
.BR isinfl ():
.nf
    /* Glibc since 2.19: */ _DEFAULT_SOURCE
        || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
.fi
.PP
.BR isnan ():
.nf
    _XOPEN_SOURCE || _ISOC99_SOURCE
        || /* Glibc since 2.19: */ _DEFAULT_SOURCE
        || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
.fi
.PP
.BR isnanf (),
.BR isnanl ():
.nf
    _XOPEN_SOURCE >= 600
        || /* Glibc since 2.19: */ _DEFAULT_SOURCE
        || /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
.fi
.SH DESCRIPTION
The
.BR finite (),
.BR finitef (),
and
.BR finitel ()
functions return a nonzero value if
.I x
is neither infinite
nor a "not-a-number" (NaN) value, and 0 otherwise.
.PP
The
.BR isnan (),
.BR isnanf (),
and
.BR isnanl ()
functions return a nonzero value if
.I x
is a NaN value,
and 0 otherwise.
.PP
The
.BR isinf (),
.BR isinff (),
and
.BR isinfl ()
functions return 1 if
.I x
is positive infinity, \-1 if
.I x
is negative infinity, and 0 otherwise.
.SH ATTRIBUTES
For an explanation of the terms used in this section, see
.BR attributes (7).
.ad l
.nh
.TS
allbox;
lbx lb lb
l l l.
Interface	Attribute	Value
T{
.BR finite (),
.BR finitef (),
.BR finitel (),
.BR isinf (),
.BR isinff (),
.BR isinfl (),
.BR isnan (),
.BR isnanf (),
.BR isnanl ()
T}	Thread safety	MT-Safe
.TE
.hy
.ad
.sp 1
.SH NOTES
Note that these functions are obsolete.
C99 defines macros
.BR isfinite (),
.BR isinf (),
and
.BR isnan ()
(for all types) replacing them.
Further note that the C99
.BR isinf ()
has weaker guarantees on the return value.
See
.BR fpclassify (3).
.\"
.\" finite* not on HP-UX; they exist on Tru64.
.\" .SH HISTORY
.\" The
.\" .BR finite ()
.\" function occurs in 4.3BSD.
.\" see IEEE.3 in the 4.3BSD manual
.SH SEE ALSO
.BR fpclassify (3)
