blob: 9bd884baf1d03d78f881d1d55ae2a6b5a2f7cb10 [file] [log] [blame]
<html lang="en">
<head>
<title>Floating Point Classes - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Arithmetic.html#Arithmetic" title="Arithmetic">
<link rel="prev" href="Floating-Point-Numbers.html#Floating-Point-Numbers" title="Floating Point Numbers">
<link rel="next" href="Floating-Point-Errors.html#Floating-Point-Errors" title="Floating Point Errors">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Floating-Point-Classes"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Floating-Point-Errors.html#Floating-Point-Errors">Floating Point Errors</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Floating-Point-Numbers.html#Floating-Point-Numbers">Floating Point Numbers</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Arithmetic.html#Arithmetic">Arithmetic</a>
<hr>
</div>
<h3 class="section">20.4 Floating-Point Number Classification Functions</h3>
<p><a name="index-floating_002dpoint-classes-2338"></a><a name="index-classes_002c-floating_002dpoint-2339"></a><a name="index-math_002eh-2340"></a>
ISO&nbsp;C99<!-- /@w --> defines macros that let you determine what sort of
floating-point number a variable holds.
<!-- math.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>fpclassify</b> (<em>float-type</em><var> x</var>)<var><a name="index-fpclassify-2341"></a></var><br>
<blockquote><p>This is a generic macro which works on all floating-point types and
which returns a value of type <code>int</code>. The possible values are:
<dl>
<dt><code>FP_NAN</code><a name="index-FP_005fNAN-2342"></a><dd>The floating-point number <var>x</var> is &ldquo;Not a Number&rdquo; (see <a href="Infinity-and-NaN.html#Infinity-and-NaN">Infinity and NaN</a>)
<br><dt><code>FP_INFINITE</code><a name="index-FP_005fINFINITE-2343"></a><dd>The value of <var>x</var> is either plus or minus infinity (see <a href="Infinity-and-NaN.html#Infinity-and-NaN">Infinity and NaN</a>)
<br><dt><code>FP_ZERO</code><a name="index-FP_005fZERO-2344"></a><dd>The value of <var>x</var> is zero. In floating-point formats like IEEE&nbsp;754<!-- /@w -->, where zero can be signed, this value is also returned if
<var>x</var> is negative zero.
<br><dt><code>FP_SUBNORMAL</code><a name="index-FP_005fSUBNORMAL-2345"></a><dd>Numbers whose absolute value is too small to be represented in the
normal format are represented in an alternate, <dfn>denormalized</dfn> format
(see <a href="Floating-Point-Concepts.html#Floating-Point-Concepts">Floating Point Concepts</a>). This format is less precise but can
represent values closer to zero. <code>fpclassify</code> returns this value
for values of <var>x</var> in this alternate format.
<br><dt><code>FP_NORMAL</code><a name="index-FP_005fNORMAL-2346"></a><dd>This value is returned for all other values of <var>x</var>. It indicates
that there is nothing special about the number.
</dl>
</blockquote></div>
<p><code>fpclassify</code> is most useful if more than one property of a number
must be tested. There are more specific macros which only test one
property at a time. Generally these macros execute faster than
<code>fpclassify</code>, since there is special hardware support for them.
You should therefore use the specific macros whenever possible.
<!-- math.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>isfinite</b> (<em>float-type</em><var> x</var>)<var><a name="index-isfinite-2347"></a></var><br>
<blockquote><p>This macro returns a nonzero value if <var>x</var> is finite: not plus or
minus infinity, and not NaN. It is equivalent to
<pre class="smallexample"> (fpclassify (x) != FP_NAN &amp;&amp; fpclassify (x) != FP_INFINITE)
</pre>
<p><code>isfinite</code> is implemented as a macro which accepts any
floating-point type.
</p></blockquote></div>
<!-- math.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>isnormal</b> (<em>float-type</em><var> x</var>)<var><a name="index-isnormal-2348"></a></var><br>
<blockquote><p>This macro returns a nonzero value if <var>x</var> is finite and normalized.
It is equivalent to
<pre class="smallexample"> (fpclassify (x) == FP_NORMAL)
</pre>
</blockquote></div>
<!-- math.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>isnan</b> (<em>float-type</em><var> x</var>)<var><a name="index-isnan-2349"></a></var><br>
<blockquote><p>This macro returns a nonzero value if <var>x</var> is NaN. It is equivalent
to
<pre class="smallexample"> (fpclassify (x) == FP_NAN)
</pre>
</blockquote></div>
<p>Another set of floating-point classification functions was provided by
BSD. The GNU C library also supports these functions; however, we
recommend that you use the ISO C99 macros in new code. Those are standard
and will be available more widely. Also, since they are macros, you do
not have to worry about the type of their argument.
<!-- math.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: int <b>isinf</b> (<var>double x</var>)<var><a name="index-isinf-2350"></a></var><br>
<blockquote><!-- math.h -->
<!-- BSD -->
&mdash; Function: int <b>isinff</b> (<var>float x</var>)<var><a name="index-isinff-2351"></a></var><br>
<blockquote><!-- math.h -->
<!-- BSD -->
&mdash; Function: int <b>isinfl</b> (<var>long double x</var>)<var><a name="index-isinfl-2352"></a></var><br>
<blockquote><p>This function returns <code>-1</code> if <var>x</var> represents negative infinity,
<code>1</code> if <var>x</var> represents positive infinity, and <code>0</code> otherwise.
</p></blockquote></div>
<!-- math.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: int <b>isnan</b> (<var>double x</var>)<var><a name="index-isnan-2353"></a></var><br>
<blockquote><!-- math.h -->
<!-- BSD -->
&mdash; Function: int <b>isnanf</b> (<var>float x</var>)<var><a name="index-isnanf-2354"></a></var><br>
<blockquote><!-- math.h -->
<!-- BSD -->
&mdash; Function: int <b>isnanl</b> (<var>long double x</var>)<var><a name="index-isnanl-2355"></a></var><br>
<blockquote><p>This function returns a nonzero value if <var>x</var> is a &ldquo;not a number&rdquo;
value, and zero otherwise.
<p><strong>NB:</strong> The <code>isnan</code> macro defined by ISO&nbsp;C99<!-- /@w --> overrides
the BSD function. This is normally not a problem, because the two
routines behave identically. However, if you really need to get the BSD
function for some reason, you can write
<pre class="smallexample"> (isnan) (x)
</pre>
</blockquote></div>
<!-- math.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: int <b>finite</b> (<var>double x</var>)<var><a name="index-finite-2356"></a></var><br>
<blockquote><!-- math.h -->
<!-- BSD -->
&mdash; Function: int <b>finitef</b> (<var>float x</var>)<var><a name="index-finitef-2357"></a></var><br>
<blockquote><!-- math.h -->
<!-- BSD -->
&mdash; Function: int <b>finitel</b> (<var>long double x</var>)<var><a name="index-finitel-2358"></a></var><br>
<blockquote><p>This function returns a nonzero value if <var>x</var> is finite or a &ldquo;not a
number&rdquo; value, and zero otherwise.
</p></blockquote></div>
<p><strong>Portability Note:</strong> The functions listed in this section are BSD
extensions.
</body></html>