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 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Ada95 - Floating Point Types</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> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-3-5-6.html">Previous</A> <A HREF="RM-3-5-8.html">Next</A></P>
<HR>
<H1> 3.5.7 Floating Point Types</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1670"></A>For floating point types,
the error bound is specified as a relative precision by giving the required
minimum number of significant decimal digits. </DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">floating_point_definition<A NAME="I1671"></A>
::= </FONT><BR>
<B>digits</B> <I>static_</I><A NAME="I1672"></A><FONT FACE="Arial, Helvetica">expression</FONT> [<A NAME="I1673"></A><FONT FACE="Arial, Helvetica">real_range_specification</FONT>]</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">real_range_specification<A NAME="I1674"></A>
::= </FONT><BR>
<B>range</B> <I>static_</I><A NAME="I1675"></A><FONT FACE="Arial, Helvetica">simple_expression</FONT> .. <I>static_</I><A NAME="I1676"></A><FONT FACE="Arial, Helvetica">simple_expression</FONT></DIV>
<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1677"></A>The <I>requested decimal precision</I>,
which is the minimum number of significant decimal digits required for
the floating point type, is specified by the value of the <FONT FACE="Arial, Helvetica">expression</FONT>
given after the reserved word <B>digits</B>. <A NAME="I1678"></A>This
<FONT FACE="Arial, Helvetica">expression</FONT> is expected to be of
any integer type.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1679"></A>Each <FONT FACE="Arial, Helvetica">simple_expression</FONT>
of a <FONT FACE="Arial, Helvetica">real_range_specification</FONT> is
expected to be of any real type; the types need not be the same. </DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1680"></A>The requested decimal precision
shall be specified by a static <FONT FACE="Arial, Helvetica">expression</FONT>
whose value is positive and no greater than System.Max_Base_Digits. Each
<FONT FACE="Arial, Helvetica">simple_expression</FONT> of a <FONT FACE="Arial, Helvetica">real_range_specification</FONT>
shall also be static. <A NAME="I1681"></A>If the <FONT FACE="Arial, Helvetica">real_range_specification</FONT>
is omitted, the requested decimal precision shall be no greater than
System.Max_Digits. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal"> A <FONT FACE="Arial, Helvetica">floating_point_definition</FONT>
is illegal if the implementation does not support a floating point type
that satisfies the requested decimal precision and range. </DIV>
<H4 ALIGN=CENTER>Static Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal"> The set of values for a floating point type is
the (infinite) set of rational numbers. <A NAME="I1682"></A>The <I>machine
numbers</I> of a floating point type are the values of the type that
can be represented exactly in every unconstrained variable of the type.
<A NAME="I1683"></A>The base range (see <A HREF="RM-3-5.html">3.5</A>)
of a floating point type is symmetric around zero, except that it can
include some extra negative values in some implementations.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1684"></A>The <I>base decimal precision</I>
of a floating point type is the number of decimal digits of precision
representable in objects of the type. <A NAME="I1685"></A>The <I>safe
range</I> of a floating point type is that part of its base range for
which the accuracy corresponding to the base decimal precision is preserved
by all predefined operations. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1686"></A>A <FONT FACE="Arial, Helvetica">floating_point_definition</FONT>
defines a floating point type whose base decimal precision is no less
than the requested decimal precision. <A NAME="I1687"></A><A NAME="I1688"></A>If
a <FONT FACE="Arial, Helvetica">real_range_specification</FONT> is given,
the safe range of the floating point type (and hence, also its base range)
includes at least the values of the simple expressions given in the <FONT FACE="Arial, Helvetica">real_range_specification</FONT>.
If a <FONT FACE="Arial, Helvetica">real_range_specification</FONT> is
not given, the safe (and base) range of the type includes at least the
values of the range -10.0**(4*D) .. +10.0**(4*D) where D is the requested
decimal precision. The safe range might include other values as well.
The attributes Safe_First and Safe_Last give the actual bounds of the
safe range.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal"> A <FONT FACE="Arial, Helvetica">floating_point_definition</FONT>
also defines a first subtype of the type. <A NAME="I1689"></A><A NAME="I1690"></A>If
a <FONT FACE="Arial, Helvetica">real_range_specification</FONT> is given,
then the subtype is constrained to a range whose bounds are given by
a conversion of the values of the <FONT FACE="Arial, Helvetica">simple_expression</FONT>s
of the <FONT FACE="Arial, Helvetica">real_range_specification</FONT>
to the type being defined. Otherwise, the subtype is unconstrained.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1691"></A>There is a predefined, unconstrained,
floating point subtype named Float, declared in the visible part of package
Standard. </DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1692"></A>The elaboration of a <FONT FACE="Arial, Helvetica">floating_point_definition</FONT>
creates the floating point type and its first subtype. </DIV>
<H4 ALIGN=CENTER>Implementation Requirements</H4>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1693"></A>In an implementation that
supports floating point types with 6 or more digits of precision, the
requested decimal precision for Float shall be at least 6.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1694"></A>If Long_Float is predefined
for an implementation, then its requested decimal precision shall be
at least 11. </DIV>
<H4 ALIGN=CENTER>Implementation Permissions</H4>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1695"></A><A NAME="I1696"></A>An implementation
is allowed to provide additional predefined floating point types, declared
in the visible part of Standard, whose (unconstrained) first subtypes
have names of the form Short_Float, Long_Float, Short_Short_Float, Long_Long_Float,
etc. Different predefined floating point types are allowed to have the
same base decimal precision. However, the precision of Float should be
no greater than that of Long_Float. Similarly, the precision of Short_Float
(if provided) should be no greater than Float. Corresponding recommendations
apply to any other predefined floating point types. There need not be
a named floating point type corresponding to each distinct base decimal
precision supported by an implementation. </DIV>
<H4 ALIGN=CENTER>Implementation Advice</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal"> <A NAME="I1697"></A>An implementation should
support Long_Float in addition to Float if the target machine supports
11 or more digits of precision. No other named floating point subtypes
are recommended for package Standard. Instead, appropriate named floating
point subtypes should be provided in the library package Interfaces (see
<A HREF="RM-B-2.html">B.2</A>). </DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>33 If a floating point subtype
is unconstrained, then assignments to variables of the subtype involve
only Overflow_Checks, never Range_Checks. </FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Examples of
floating point types and subtypes:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Examples"><TT><B>type</B> Coefficient <B>is</B> <B>digits</B> 10 <B>range</B> -1.0 .. 1.0;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>21</FONT></DIV>
<DIV Class="Examples"><TT><B>type</B> Real <B>is</B> <B>digits</B> 8;<BR>
<B>type</B> Mass <B>is</B> <B>digits</B> 7 <B>range</B> 0.0 .. 1.0E35;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>22</FONT></DIV>
<DIV Class="Examples"><TT><B>subtype</B> Probability <B>is</B> Real <B>range</B> 0.0 .. 1.0; <I>-- a subtype with a smaller range</I></TT></DIV>
<HR>
<P><A HREF="RM-TOC.html">Contents</A> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-3-5-6.html">Previous</A> <A HREF="RM-3-5-8.html">Next</A> <A HREF="RM-TTL.html">Legal</A></P>
</BODY>
</HTML>
|