source: public/doc/gnu-c/Rounding-Control.html@ 02598c2

Last change on this file since 02598c2 was 02598c2, checked in by Mikhail Kirillov <w96k@…>, on Oct 6, 2022 at 12:36:29 PM

Add gnu-c

  • Property mode set to 100644
File size: 4.8 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- Copyright (C) 2022 Richard Stallman and Free Software Foundation, Inc.
4
5(The work of Trevis Rothwell and Nelson Beebe has been assigned or
6licensed to the FSF.)
7
8Permission is granted to copy, distribute and/or modify this document
9under the terms of the GNU Free Documentation License, Version 1.3 or
10any later version published by the Free Software Foundation; with the
11Invariant Sections being "GNU General Public License," with the
12Front-Cover Texts being "A GNU Manual," and with the Back-Cover
13Texts as in (a) below. A copy of the license is included in the
14section entitled "GNU Free Documentation License."
15
16(a) The FSF's Back-Cover Text is: "You have the freedom to copy and
17modify this GNU manual. Buying copies from the FSF supports it in
18developing GNU and promoting software freedom." -->
19<!-- Created by GNU Texinfo 6.7, http://www.gnu.org/software/texinfo/ -->
20<head>
21<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
22<title>Rounding Control (GNU C Language Manual)</title>
23
24<meta name="description" content="Rounding Control (GNU C Language Manual)">
25<meta name="keywords" content="Rounding Control (GNU C Language Manual)">
26<meta name="resource-type" content="document">
27<meta name="distribution" content="global">
28<meta name="Generator" content="makeinfo">
29<link href="index.html" rel="start" title="Top">
30<link href="Symbol-Index.html" rel="index" title="Symbol Index">
31<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
32<link href="Floating-Point-in-Depth.html" rel="up" title="Floating Point in Depth">
33<link href="Machine-Epsilon.html" rel="next" title="Machine Epsilon">
34<link href="Scaling-by-the-Base.html" rel="prev" title="Scaling by the Base">
35<style type="text/css">
36<!--
37a.summary-letter {text-decoration: none}
38blockquote.indentedblock {margin-right: 0em}
39div.display {margin-left: 3.2em}
40div.example {margin-left: 3.2em}
41div.lisp {margin-left: 3.2em}
42kbd {font-style: oblique}
43pre.display {font-family: inherit}
44pre.format {font-family: inherit}
45pre.menu-comment {font-family: serif}
46pre.menu-preformatted {font-family: serif}
47span.nolinebreak {white-space: nowrap}
48span.roman {font-family: initial; font-weight: normal}
49span.sansserif {font-family: sans-serif; font-weight: normal}
50ul.no-bullet {list-style: none}
51-->
52</style>
53
54
55</head>
56
57<body lang="en">
58<span id="Rounding-Control"></span><div class="header">
59<p>
60Next: <a href="Machine-Epsilon.html" accesskey="n" rel="next">Machine Epsilon</a>, Previous: <a href="Scaling-by-the-Base.html" accesskey="p" rel="prev">Scaling by the Base</a>, Up: <a href="Floating-Point-in-Depth.html" accesskey="u" rel="up">Floating Point in Depth</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Symbol-Index.html" title="Index" rel="index">Index</a>]</p>
61</div>
62<hr>
63<span id="Rounding-Control-1"></span><h3 class="section">28.17 Rounding Control</h3>
64<span id="index-rounding-control-_0028floating-point_0029"></span>
65<span id="index-floating_002dpoint-rounding-control"></span>
66
67<p>Here we describe how to specify the rounding mode at run time. System
68header file <samp>fenv.h</samp> provides the prototypes for these functions.
69See <a href="https://www.gnu.org/software/libc/manual/html_node/Rounding.html#Rounding">Rounding</a> in <cite>The GNU C Library Reference Manual</cite>.
70</p>
71<p>That header file also provides constant names for the four rounding modes:
72<code>FE_DOWNWARD</code>, <code>FE_TONEAREST</code>, <code>FE_TOWARDZERO</code>, and
73<code>FE_UPWARD</code>.
74</p>
75<p>The function <code>fegetround</code> examines and returns the current
76rounding mode. On a platform with IEEE 754 floating point,
77the value will always equal one of those four constants.
78On other platforms, it may return a negative value. The function
79<code>fesetround</code> sets the current rounding mode.
80</p>
81<p>Changing the rounding mode can be slow, so it is useful to minimize
82the number of changes. For interval arithmetic, we seem to need three
83changes for each operation, but we really only need two, because we
84can write code like this example for interval addition of two reals:
85</p>
86<div class="example">
87<pre class="example">{
88 struct interval_double
89 {
90 double hi, lo;
91 } v;
92 volatile double x, y;
93 int rule;
94
95 rule = fegetround ();
96
97 if (fesetround (FE_UPWARD) == 0)
98 {
99 v.hi = x + y;
100 v.lo = -(-x - y);
101 }
102 else
103 fatal (&quot;ERROR: failed to change rounding rule&quot;);
104
105 if (fesetround (rule) != 0)
106 fatal (&quot;ERROR: failed to restore rounding rule&quot;);
107}
108</pre></div>
109
110<p>The <code>volatile</code> qualifier (see <a href="volatile.html">volatile</a>) is essential on x86
111platforms to prevent an optimizing compiler from producing the same
112value for both bounds.
113</p>
114
115
116
117
118
119</body>
120</html>
Note: See TracBrowser for help on using the repository browser.