File: RM-G-2-4.html

package info (click to toggle)
ada-reference-manual 20021112web-3
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k, lenny, sarge
  • size: 18,652 kB
  • ctags: 8,921
  • sloc: makefile: 52; sh: 20
file content (190 lines) | stat: -rw-r--r-- 14,861 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>Ada95 - Accuracy Requirements for the Elementary Functions</TITLE>
    <META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
    <META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
    <STYLE type="text/css">
    DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
    TT {font-family: "Courier New", monospace}
    DT {display: compact}
    DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
    DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
    DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
    DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
    DIV.Index {font-family: "Times New Roman", Times, serif}
    DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
    DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
    DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
    DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
    DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
    DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
    DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left:  10.0em; margin-bottom: 0.6em}
    DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
    DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
    DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
    DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
    DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left:  15.0em; margin-bottom: 0.6em}
    UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
    DD.Hanging {margin-left: 6.0em}
    DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.IndentedHanging {margin-left: 2.0em}
    DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.HangingInBulleted {margin-left: 4.0em}
    DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.SmallHanging {margin-left: 7.5em}
    DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
    DD.SmallIndentedHanging {margin-left: 2.0em}
    DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.SmallHangingInBulleted {margin-left: 5.0em}
    DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.Enumerated {margin-left: 2.0em}
    DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
    DD.SmallEnumerated {margin-left: 2.5em}
    DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
    DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
    </STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="RM-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-G-2-3.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-G-2-5.html">Next</A></P>
<HR>
<H1> G.2.4 Accuracy Requirements for the Elementary Functions</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;In the strict mode, the performance of Numerics.Generic_Elementary_Functions
shall be as specified here. </DIV>

<H4 ALIGN=CENTER>Implementation Requirements</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;<A NAME="I6984"></A><A NAME="I6985"></A>When an
exception is not raised, the result of evaluating a function in an instance
<I>EF</I> of Numerics.Generic_Elementary_Functions belongs to a <I>result
interval</I>, defined as the smallest model interval of <I>EF</I>.Float_Type
that contains all the values of the form <I>f</I> &middot; (1.0 + <I>d</I>),
where <I>f</I> is the exact value of the corresponding mathematical function
at the given parameter values, <I>d</I> is a real number, and |<I>d</I>|
is less than or equal to the function's <I>maximum relative error</I>.
<A NAME="I6986"></A><A NAME="I6987"></A>The function delivers a value
that belongs to the result interval when both of its bounds belong to
the safe range of <I>EF</I>.Float_Type; otherwise, </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC><A NAME="I6988"></A>if <I>EF</I>.Float_Type'Machine_Overflows
is True, the function either delivers a value that belongs to the result
interval or raises Constraint_Error, signaling overflow;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<UL Class="Bulleted" Style="margin-bottom: 0.7em"><LI TYPE=DISC>if <I>EF</I>.Float_Type'Machine_Overflows is False, the
result is implementation defined. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;The maximum relative
error exhibited by each function is as follows: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>2.0 &middot; <I>EF</I>.Float_Type'Model_Epsilon, in the
case of the Sqrt, Sin, and Cos functions;</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>4.0 &middot; <I>EF</I>.Float_Type'Model_Epsilon, in the
case of the Log, Exp, Tan, Cot, and inverse trigonometric functions;
and</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>8.0 &middot; <I>EF</I>.Float_Type'Model_Epsilon, in the
case of the forward and inverse hyperbolic functions. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;The maximum relative error exhibited by the exponentiation
operator, which depends on the values of the operands, is (4.0   +  
|Right &middot; log(Left)|   /   32.0) &middot; <I>EF</I>.Float_Type'Model_Epsilon.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;The maximum relative error given above applies
throughout the domain of the forward trigonometric functions when the
Cycle parameter is specified. <A NAME="I6989"></A>When the Cycle parameter
is omitted, the maximum relative error given above applies only when
the absolute value of the angle parameter X is less than or equal to
some implementation-defined <I>angle threshold</I>, which shall be at
least <I>EF</I>.Float_Type'Machine_Radix <SUP><FONT SIZE=+1><FONT SIZE=-2><I>Floor</I>(<I>EF</I>.Float_Type'Machine_Mantissa/2)</FONT></FONT></SUP>.
Beyond the angle threshold, the accuracy of the forward trigonometric
functions is implementation defined. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;The prescribed results specified in <A HREF="RM-A-5-1.html">A.5.1</A>
for certain functions at particular parameter values take precedence
over the maximum relative error bounds; effectively, they narrow to a
single value the result interval allowed by the maximum relative error
bounds. Additional rules with a similar effect are given by the table
below for the inverse trigonometric functions, at particular parameter
values for which the mathematical result is possibly not a model number
of <I>EF</I>.Float_Type (or is, indeed, even transcendental). In each
table entry, the values of the parameters are such that the result lies
on the axis between two quadrants; the corresponding accuracy rule, which
takes precedence over the maximum relative error bounds, is that the
result interval is the model interval of <I>EF</I>.Float_Type associated
with the exact mathematical result given in the table.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12/1</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT SIZE=-1><I>This paragraph was deleted.</I></FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;The last line of the table is meant to apply
when <I>EF</I>.Float_Type'Signed_Zeros is False; the two lines just above
it, when <I>EF</I>.Float_Type'Signed_Zeros is True and the parameter
Y has a zero value with the indicated sign.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;The amount by which the result of an inverse
trigonometric function is allowed to spill over into a quadrant adjacent
to the one corresponding to the principal branch, as given in <A HREF="RM-A-5-1.html">A.5.1</A>,
is limited. The rule is that the result belongs to the smallest model
interval of <I>EF</I>.Float_Type that contains both boundaries of the
quadrant corresponding to the principal branch. This rule also takes
precedence over the maximum relative error bounds, effectively narrowing
the result interval allowed by them.</DIV>
<DIV Class="SyntaxIndented"><TABLE frame="border" rules="all" border="2"><CAPTION><B>Tightly Approximated Elementary Function Results</B></CAPTION>
<TR><TH align="center"><B>Function</B><TH align="center"><B>Value of
X</B><TH align="center"><B>Value of Y</B><TH align="center"><B>Exact
Result <BR>
when Cycle <BR>
Specified</B><TH align="center"><B>Exact Result <BR>
when Cycle <BR>
Omitted</B>
<TR><TD align="center">Arcsin<TD align="center">1.0<TD align="center">n.a.<TD align="center">Cycle/4.0<TD align="center">PI/2.0
<TR><TD align="center">Arcsin<TD align="center">-1.0<TD align="center">n.a.<TD align="center">-Cycle/4.0<TD align="center">-PI/2.0
<TR><TD align="center">Arccos<TD align="center">0.0<TD align="center">n.a.<TD align="center">Cycle/4.0<TD align="center">PI/2.0
<TR><TD align="center">Arccos<TD align="center">-1.0<TD align="center">n.a.<TD align="center">Cycle/2.0<TD align="center">PI
<TR><TD align="center">Arctan and Arccot<TD align="center">0.0<TD align="center">positive<TD align="center">Cycle/4.0<TD align="center">PI/2.0
<TR><TD align="center">Arctan and Arccot<TD align="center">0.0<TD align="center">negative<TD align="center">-Cycle/4.0<TD align="center">-PI/2.0
<TR><TD align="center">Arctan and Arccot<TD align="center">negative<TD align="center">+0.0<TD align="center">Cycle/2.0<TD align="center">PI
<TR><TD align="center">Arctan and Arccot<TD align="center">negative<TD align="center">-0.0<TD align="center">-Cycle/2.0<TD align="center">-PI
<TR><TD align="center">Arctan and Arccot<TD align="center">negative<TD align="center">0.0<TD align="center">Cycle/2.0<TD align="center">PI
</TABLE>
</TABLE></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em">&nbsp;&nbsp;&nbsp;&nbsp;Finally, the following
specifications also take precedence over the maximum relative error bounds:
</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The absolute value of the result of the Sin, Cos, and Tanh
functions never exceeds one.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The absolute value of the result of the Coth function is
never less than one.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The result of the Cosh function is never less than one.
</LI></UL>

<H4 ALIGN=CENTER>Implementation Advice</H4>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Normal">&nbsp;&nbsp;&nbsp;&nbsp;The versions of the forward trigonometric functions
without a Cycle parameter should not be implemented by calling the corresponding
version with a Cycle parameter of 2.0*Numerics.Pi, since this will not
provide the required accuracy in some portions of the domain. For the
same reason, the version of Log without a Base parameter should not be
implemented by calling the corresponding version with a Base parameter
of Numerics.e. </DIV>

<HR>
<P><A HREF="RM-TOC.html">Contents</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-0-29.html">Index</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-G-2-3.html">Previous</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-G-2-5.html">Next</A>&nbsp;&nbsp;&nbsp;<A HREF="RM-TTL.html">Legal</A></P>
</BODY>
</HTML>