annotate gcc/ada/urealp.adb @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- U R E A L P --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
9 -- Copyright (C) 1992-2018, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Alloc;
kono
parents:
diff changeset
33 with Output; use Output;
kono
parents:
diff changeset
34 with Table;
kono
parents:
diff changeset
35 with Tree_IO; use Tree_IO;
kono
parents:
diff changeset
36
kono
parents:
diff changeset
37 package body Urealp is
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 Ureal_First_Entry : constant Ureal := Ureal'Succ (No_Ureal);
kono
parents:
diff changeset
40 -- First subscript allocated in Ureal table (note that we can't just
kono
parents:
diff changeset
41 -- add 1 to No_Ureal, since "+" means something different for Ureals).
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 type Ureal_Entry is record
kono
parents:
diff changeset
44 Num : Uint;
kono
parents:
diff changeset
45 -- Numerator (always non-negative)
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 Den : Uint;
kono
parents:
diff changeset
48 -- Denominator (always non-zero, always positive if base is zero)
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 Rbase : Nat;
kono
parents:
diff changeset
51 -- Base value. If Rbase is zero, then the value is simply Num / Den.
kono
parents:
diff changeset
52 -- If Rbase is non-zero, then the value is Num / (Rbase ** Den)
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 Negative : Boolean;
kono
parents:
diff changeset
55 -- Flag set if value is negative
kono
parents:
diff changeset
56 end record;
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 -- The following representation clause ensures that the above record
kono
parents:
diff changeset
59 -- has no holes. We do this so that when instances of this record are
kono
parents:
diff changeset
60 -- written by Tree_Gen, we do not write uninitialized values to the file.
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 for Ureal_Entry use record
kono
parents:
diff changeset
63 Num at 0 range 0 .. 31;
kono
parents:
diff changeset
64 Den at 4 range 0 .. 31;
kono
parents:
diff changeset
65 Rbase at 8 range 0 .. 31;
kono
parents:
diff changeset
66 Negative at 12 range 0 .. 31;
kono
parents:
diff changeset
67 end record;
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 for Ureal_Entry'Size use 16 * 8;
kono
parents:
diff changeset
70 -- This ensures that we did not leave out any fields
kono
parents:
diff changeset
71
kono
parents:
diff changeset
72 package Ureals is new Table.Table (
kono
parents:
diff changeset
73 Table_Component_Type => Ureal_Entry,
kono
parents:
diff changeset
74 Table_Index_Type => Ureal'Base,
kono
parents:
diff changeset
75 Table_Low_Bound => Ureal_First_Entry,
kono
parents:
diff changeset
76 Table_Initial => Alloc.Ureals_Initial,
kono
parents:
diff changeset
77 Table_Increment => Alloc.Ureals_Increment,
kono
parents:
diff changeset
78 Table_Name => "Ureals");
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 -- The following universal reals are the values returned by the constant
kono
parents:
diff changeset
81 -- functions. They are initialized by the initialization procedure.
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 UR_0 : Ureal;
kono
parents:
diff changeset
84 UR_M_0 : Ureal;
kono
parents:
diff changeset
85 UR_Tenth : Ureal;
kono
parents:
diff changeset
86 UR_Half : Ureal;
kono
parents:
diff changeset
87 UR_1 : Ureal;
kono
parents:
diff changeset
88 UR_2 : Ureal;
kono
parents:
diff changeset
89 UR_10 : Ureal;
kono
parents:
diff changeset
90 UR_10_36 : Ureal;
kono
parents:
diff changeset
91 UR_M_10_36 : Ureal;
kono
parents:
diff changeset
92 UR_100 : Ureal;
kono
parents:
diff changeset
93 UR_2_128 : Ureal;
kono
parents:
diff changeset
94 UR_2_80 : Ureal;
kono
parents:
diff changeset
95 UR_2_M_128 : Ureal;
kono
parents:
diff changeset
96 UR_2_M_80 : Ureal;
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 Num_Ureal_Constants : constant := 10;
kono
parents:
diff changeset
99 -- This is used for an assertion check in Tree_Read and Tree_Write to
kono
parents:
diff changeset
100 -- help remember to add values to these routines when we add to the list.
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 Normalized_Real : Ureal := No_Ureal;
kono
parents:
diff changeset
103 -- Used to memoize Norm_Num and Norm_Den, if either of these functions
kono
parents:
diff changeset
104 -- is called, this value is set and Normalized_Entry contains the result
kono
parents:
diff changeset
105 -- of the normalization. On subsequent calls, this is used to avoid the
kono
parents:
diff changeset
106 -- call to Normalize if it has already been made.
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 Normalized_Entry : Ureal_Entry;
kono
parents:
diff changeset
109 -- Entry built by most recent call to Normalize
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 -----------------------
kono
parents:
diff changeset
112 -- Local Subprograms --
kono
parents:
diff changeset
113 -----------------------
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 function Decimal_Exponent_Hi (V : Ureal) return Int;
kono
parents:
diff changeset
116 -- Returns an estimate of the exponent of Val represented as a normalized
kono
parents:
diff changeset
117 -- decimal number (non-zero digit before decimal point), The estimate is
kono
parents:
diff changeset
118 -- either correct, or high, but never low. The accuracy of the estimate
kono
parents:
diff changeset
119 -- affects only the efficiency of the comparison routines.
kono
parents:
diff changeset
120
kono
parents:
diff changeset
121 function Decimal_Exponent_Lo (V : Ureal) return Int;
kono
parents:
diff changeset
122 -- Returns an estimate of the exponent of Val represented as a normalized
kono
parents:
diff changeset
123 -- decimal number (non-zero digit before decimal point), The estimate is
kono
parents:
diff changeset
124 -- either correct, or low, but never high. The accuracy of the estimate
kono
parents:
diff changeset
125 -- affects only the efficiency of the comparison routines.
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 function Equivalent_Decimal_Exponent (U : Ureal_Entry) return Int;
kono
parents:
diff changeset
128 -- U is a Ureal entry for which the base value is non-zero, the value
kono
parents:
diff changeset
129 -- returned is the equivalent decimal exponent value, i.e. the value of
kono
parents:
diff changeset
130 -- Den, adjusted as though the base were base 10. The value is rounded
kono
parents:
diff changeset
131 -- toward zero (truncated), and so its value can be off by one.
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 function Is_Integer (Num, Den : Uint) return Boolean;
kono
parents:
diff changeset
134 -- Return true if the real quotient of Num / Den is an integer value
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 function Normalize (Val : Ureal_Entry) return Ureal_Entry;
kono
parents:
diff changeset
137 -- Normalizes the Ureal_Entry by reducing it to lowest terms (with a base
kono
parents:
diff changeset
138 -- value of 0).
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 function Same (U1, U2 : Ureal) return Boolean;
kono
parents:
diff changeset
141 pragma Inline (Same);
kono
parents:
diff changeset
142 -- Determines if U1 and U2 are the same Ureal. Note that we cannot use
kono
parents:
diff changeset
143 -- the equals operator for this test, since that tests for equality, not
kono
parents:
diff changeset
144 -- identity.
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 function Store_Ureal (Val : Ureal_Entry) return Ureal;
kono
parents:
diff changeset
147 -- This store a new entry in the universal reals table and return its index
kono
parents:
diff changeset
148 -- in the table.
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 function Store_Ureal_Normalized (Val : Ureal_Entry) return Ureal;
kono
parents:
diff changeset
151 pragma Inline (Store_Ureal_Normalized);
kono
parents:
diff changeset
152 -- Like Store_Ureal, but normalizes its operand first
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 -------------------------
kono
parents:
diff changeset
155 -- Decimal_Exponent_Hi --
kono
parents:
diff changeset
156 -------------------------
kono
parents:
diff changeset
157
kono
parents:
diff changeset
158 function Decimal_Exponent_Hi (V : Ureal) return Int is
kono
parents:
diff changeset
159 Val : constant Ureal_Entry := Ureals.Table (V);
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 begin
kono
parents:
diff changeset
162 -- Zero always returns zero
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 if UR_Is_Zero (V) then
kono
parents:
diff changeset
165 return 0;
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 -- For numbers in rational form, get the maximum number of digits in the
kono
parents:
diff changeset
168 -- numerator and the minimum number of digits in the denominator, and
kono
parents:
diff changeset
169 -- subtract. For example:
kono
parents:
diff changeset
170
kono
parents:
diff changeset
171 -- 1000 / 99 = 1.010E+1
kono
parents:
diff changeset
172 -- 9999 / 10 = 9.999E+2
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 -- This estimate may of course be high, but that is acceptable
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 elsif Val.Rbase = 0 then
kono
parents:
diff changeset
177 return UI_Decimal_Digits_Hi (Val.Num) -
kono
parents:
diff changeset
178 UI_Decimal_Digits_Lo (Val.Den);
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 -- For based numbers, just subtract the decimal exponent from the
kono
parents:
diff changeset
181 -- high estimate of the number of digits in the numerator and add
kono
parents:
diff changeset
182 -- one to accommodate possible round off errors for non-decimal
kono
parents:
diff changeset
183 -- bases. For example:
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 -- 1_500_000 / 10**4 = 1.50E-2
kono
parents:
diff changeset
186
kono
parents:
diff changeset
187 else -- Val.Rbase /= 0
kono
parents:
diff changeset
188 return UI_Decimal_Digits_Hi (Val.Num) -
kono
parents:
diff changeset
189 Equivalent_Decimal_Exponent (Val) + 1;
kono
parents:
diff changeset
190 end if;
kono
parents:
diff changeset
191 end Decimal_Exponent_Hi;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 -------------------------
kono
parents:
diff changeset
194 -- Decimal_Exponent_Lo --
kono
parents:
diff changeset
195 -------------------------
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 function Decimal_Exponent_Lo (V : Ureal) return Int is
kono
parents:
diff changeset
198 Val : constant Ureal_Entry := Ureals.Table (V);
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 begin
kono
parents:
diff changeset
201 -- Zero always returns zero
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 if UR_Is_Zero (V) then
kono
parents:
diff changeset
204 return 0;
kono
parents:
diff changeset
205
kono
parents:
diff changeset
206 -- For numbers in rational form, get min digits in numerator, max digits
kono
parents:
diff changeset
207 -- in denominator, and subtract and subtract one more for possible loss
kono
parents:
diff changeset
208 -- during the division. For example:
kono
parents:
diff changeset
209
kono
parents:
diff changeset
210 -- 1000 / 99 = 1.010E+1
kono
parents:
diff changeset
211 -- 9999 / 10 = 9.999E+2
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 -- This estimate may of course be low, but that is acceptable
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 elsif Val.Rbase = 0 then
kono
parents:
diff changeset
216 return UI_Decimal_Digits_Lo (Val.Num) -
kono
parents:
diff changeset
217 UI_Decimal_Digits_Hi (Val.Den) - 1;
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 -- For based numbers, just subtract the decimal exponent from the
kono
parents:
diff changeset
220 -- low estimate of the number of digits in the numerator and subtract
kono
parents:
diff changeset
221 -- one to accommodate possible round off errors for non-decimal
kono
parents:
diff changeset
222 -- bases. For example:
kono
parents:
diff changeset
223
kono
parents:
diff changeset
224 -- 1_500_000 / 10**4 = 1.50E-2
kono
parents:
diff changeset
225
kono
parents:
diff changeset
226 else -- Val.Rbase /= 0
kono
parents:
diff changeset
227 return UI_Decimal_Digits_Lo (Val.Num) -
kono
parents:
diff changeset
228 Equivalent_Decimal_Exponent (Val) - 1;
kono
parents:
diff changeset
229 end if;
kono
parents:
diff changeset
230 end Decimal_Exponent_Lo;
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 -----------------
kono
parents:
diff changeset
233 -- Denominator --
kono
parents:
diff changeset
234 -----------------
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 function Denominator (Real : Ureal) return Uint is
kono
parents:
diff changeset
237 begin
kono
parents:
diff changeset
238 return Ureals.Table (Real).Den;
kono
parents:
diff changeset
239 end Denominator;
kono
parents:
diff changeset
240
kono
parents:
diff changeset
241 ---------------------------------
kono
parents:
diff changeset
242 -- Equivalent_Decimal_Exponent --
kono
parents:
diff changeset
243 ---------------------------------
kono
parents:
diff changeset
244
kono
parents:
diff changeset
245 function Equivalent_Decimal_Exponent (U : Ureal_Entry) return Int is
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 type Ratio is record
kono
parents:
diff changeset
248 Num : Nat;
kono
parents:
diff changeset
249 Den : Nat;
kono
parents:
diff changeset
250 end record;
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 -- The following table is a table of logs to the base 10. All values
kono
parents:
diff changeset
253 -- have at least 15 digits of precision, and do not exceed the true
kono
parents:
diff changeset
254 -- value. To avoid the use of floating point, and as a result potential
kono
parents:
diff changeset
255 -- target dependency, each entry is represented as a fraction of two
kono
parents:
diff changeset
256 -- integers.
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 Logs : constant array (Nat range 1 .. 16) of Ratio :=
kono
parents:
diff changeset
259 (1 => (Num => 0, Den => 1), -- 0
kono
parents:
diff changeset
260 2 => (Num => 15_392_313, Den => 51_132_157), -- 0.301029995663981
kono
parents:
diff changeset
261 3 => (Num => 731_111_920, Den => 1532_339_867), -- 0.477121254719662
kono
parents:
diff changeset
262 4 => (Num => 30_784_626, Den => 51_132_157), -- 0.602059991327962
kono
parents:
diff changeset
263 5 => (Num => 111_488_153, Den => 159_503_487), -- 0.698970004336018
kono
parents:
diff changeset
264 6 => (Num => 84_253_929, Den => 108_274_489), -- 0.778151250383643
kono
parents:
diff changeset
265 7 => (Num => 35_275_468, Den => 41_741_273), -- 0.845098040014256
kono
parents:
diff changeset
266 8 => (Num => 46_176_939, Den => 51_132_157), -- 0.903089986991943
kono
parents:
diff changeset
267 9 => (Num => 417_620_173, Den => 437_645_744), -- 0.954242509439324
kono
parents:
diff changeset
268 10 => (Num => 1, Den => 1), -- 1.000000000000000
kono
parents:
diff changeset
269 11 => (Num => 136_507_510, Den => 131_081_687), -- 1.041392685158225
kono
parents:
diff changeset
270 12 => (Num => 26_797_783, Den => 24_831_587), -- 1.079181246047624
kono
parents:
diff changeset
271 13 => (Num => 73_333_297, Den => 65_832_160), -- 1.113943352306836
kono
parents:
diff changeset
272 14 => (Num => 102_941_258, Den => 89_816_543), -- 1.146128035678238
kono
parents:
diff changeset
273 15 => (Num => 53_385_559, Den => 45_392_361), -- 1.176091259055681
kono
parents:
diff changeset
274 16 => (Num => 78_897_839, Den => 65_523_237)); -- 1.204119982655924
kono
parents:
diff changeset
275
kono
parents:
diff changeset
276 function Scale (X : Int; R : Ratio) return Int;
kono
parents:
diff changeset
277 -- Compute the value of X scaled by R
kono
parents:
diff changeset
278
kono
parents:
diff changeset
279 -----------
kono
parents:
diff changeset
280 -- Scale --
kono
parents:
diff changeset
281 -----------
kono
parents:
diff changeset
282
kono
parents:
diff changeset
283 function Scale (X : Int; R : Ratio) return Int is
kono
parents:
diff changeset
284 type Wide_Int is range -2**63 .. 2**63 - 1;
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 begin
kono
parents:
diff changeset
287 return Int (Wide_Int (X) * Wide_Int (R.Num) / Wide_Int (R.Den));
kono
parents:
diff changeset
288 end Scale;
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 begin
kono
parents:
diff changeset
291 pragma Assert (U.Rbase /= 0);
kono
parents:
diff changeset
292 return Scale (UI_To_Int (U.Den), Logs (U.Rbase));
kono
parents:
diff changeset
293 end Equivalent_Decimal_Exponent;
kono
parents:
diff changeset
294
kono
parents:
diff changeset
295 ----------------
kono
parents:
diff changeset
296 -- Initialize --
kono
parents:
diff changeset
297 ----------------
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 procedure Initialize is
kono
parents:
diff changeset
300 begin
kono
parents:
diff changeset
301 Ureals.Init;
kono
parents:
diff changeset
302 UR_0 := UR_From_Components (Uint_0, Uint_1, 0, False);
kono
parents:
diff changeset
303 UR_M_0 := UR_From_Components (Uint_0, Uint_1, 0, True);
kono
parents:
diff changeset
304 UR_Half := UR_From_Components (Uint_1, Uint_1, 2, False);
kono
parents:
diff changeset
305 UR_Tenth := UR_From_Components (Uint_1, Uint_1, 10, False);
kono
parents:
diff changeset
306 UR_1 := UR_From_Components (Uint_1, Uint_1, 0, False);
kono
parents:
diff changeset
307 UR_2 := UR_From_Components (Uint_1, Uint_Minus_1, 2, False);
kono
parents:
diff changeset
308 UR_10 := UR_From_Components (Uint_1, Uint_Minus_1, 10, False);
kono
parents:
diff changeset
309 UR_10_36 := UR_From_Components (Uint_1, Uint_Minus_36, 10, False);
kono
parents:
diff changeset
310 UR_M_10_36 := UR_From_Components (Uint_1, Uint_Minus_36, 10, True);
kono
parents:
diff changeset
311 UR_100 := UR_From_Components (Uint_1, Uint_Minus_2, 10, False);
kono
parents:
diff changeset
312 UR_2_128 := UR_From_Components (Uint_1, Uint_Minus_128, 2, False);
kono
parents:
diff changeset
313 UR_2_M_128 := UR_From_Components (Uint_1, Uint_128, 2, False);
kono
parents:
diff changeset
314 UR_2_80 := UR_From_Components (Uint_1, Uint_Minus_80, 2, False);
kono
parents:
diff changeset
315 UR_2_M_80 := UR_From_Components (Uint_1, Uint_80, 2, False);
kono
parents:
diff changeset
316 end Initialize;
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 ----------------
kono
parents:
diff changeset
319 -- Is_Integer --
kono
parents:
diff changeset
320 ----------------
kono
parents:
diff changeset
321
kono
parents:
diff changeset
322 function Is_Integer (Num, Den : Uint) return Boolean is
kono
parents:
diff changeset
323 begin
kono
parents:
diff changeset
324 return (Num / Den) * Den = Num;
kono
parents:
diff changeset
325 end Is_Integer;
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 ----------
kono
parents:
diff changeset
328 -- Mark --
kono
parents:
diff changeset
329 ----------
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 function Mark return Save_Mark is
kono
parents:
diff changeset
332 begin
kono
parents:
diff changeset
333 return Save_Mark (Ureals.Last);
kono
parents:
diff changeset
334 end Mark;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 --------------
kono
parents:
diff changeset
337 -- Norm_Den --
kono
parents:
diff changeset
338 --------------
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 function Norm_Den (Real : Ureal) return Uint is
kono
parents:
diff changeset
341 begin
kono
parents:
diff changeset
342 if not Same (Real, Normalized_Real) then
kono
parents:
diff changeset
343 Normalized_Real := Real;
kono
parents:
diff changeset
344 Normalized_Entry := Normalize (Ureals.Table (Real));
kono
parents:
diff changeset
345 end if;
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 return Normalized_Entry.Den;
kono
parents:
diff changeset
348 end Norm_Den;
kono
parents:
diff changeset
349
kono
parents:
diff changeset
350 --------------
kono
parents:
diff changeset
351 -- Norm_Num --
kono
parents:
diff changeset
352 --------------
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 function Norm_Num (Real : Ureal) return Uint is
kono
parents:
diff changeset
355 begin
kono
parents:
diff changeset
356 if not Same (Real, Normalized_Real) then
kono
parents:
diff changeset
357 Normalized_Real := Real;
kono
parents:
diff changeset
358 Normalized_Entry := Normalize (Ureals.Table (Real));
kono
parents:
diff changeset
359 end if;
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 return Normalized_Entry.Num;
kono
parents:
diff changeset
362 end Norm_Num;
kono
parents:
diff changeset
363
kono
parents:
diff changeset
364 ---------------
kono
parents:
diff changeset
365 -- Normalize --
kono
parents:
diff changeset
366 ---------------
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368 function Normalize (Val : Ureal_Entry) return Ureal_Entry is
kono
parents:
diff changeset
369 J : Uint;
kono
parents:
diff changeset
370 K : Uint;
kono
parents:
diff changeset
371 Tmp : Uint;
kono
parents:
diff changeset
372 Num : Uint;
kono
parents:
diff changeset
373 Den : Uint;
kono
parents:
diff changeset
374 M : constant Uintp.Save_Mark := Uintp.Mark;
kono
parents:
diff changeset
375
kono
parents:
diff changeset
376 begin
kono
parents:
diff changeset
377 -- Start by setting J to the greatest of the absolute values of the
kono
parents:
diff changeset
378 -- numerator and the denominator (taking into account the base value),
kono
parents:
diff changeset
379 -- and K to the lesser of the two absolute values. The gcd of Num and
kono
parents:
diff changeset
380 -- Den is the gcd of J and K.
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 if Val.Rbase = 0 then
kono
parents:
diff changeset
383 J := Val.Num;
kono
parents:
diff changeset
384 K := Val.Den;
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 elsif Val.Den < 0 then
kono
parents:
diff changeset
387 J := Val.Num * Val.Rbase ** (-Val.Den);
kono
parents:
diff changeset
388 K := Uint_1;
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 else
kono
parents:
diff changeset
391 J := Val.Num;
kono
parents:
diff changeset
392 K := Val.Rbase ** Val.Den;
kono
parents:
diff changeset
393 end if;
kono
parents:
diff changeset
394
kono
parents:
diff changeset
395 Num := J;
kono
parents:
diff changeset
396 Den := K;
kono
parents:
diff changeset
397
kono
parents:
diff changeset
398 if K > J then
kono
parents:
diff changeset
399 Tmp := J;
kono
parents:
diff changeset
400 J := K;
kono
parents:
diff changeset
401 K := Tmp;
kono
parents:
diff changeset
402 end if;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 J := UI_GCD (J, K);
kono
parents:
diff changeset
405 Num := Num / J;
kono
parents:
diff changeset
406 Den := Den / J;
kono
parents:
diff changeset
407 Uintp.Release_And_Save (M, Num, Den);
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 -- Divide numerator and denominator by gcd and return result
kono
parents:
diff changeset
410
kono
parents:
diff changeset
411 return (Num => Num,
kono
parents:
diff changeset
412 Den => Den,
kono
parents:
diff changeset
413 Rbase => 0,
kono
parents:
diff changeset
414 Negative => Val.Negative);
kono
parents:
diff changeset
415 end Normalize;
kono
parents:
diff changeset
416
kono
parents:
diff changeset
417 ---------------
kono
parents:
diff changeset
418 -- Numerator --
kono
parents:
diff changeset
419 ---------------
kono
parents:
diff changeset
420
kono
parents:
diff changeset
421 function Numerator (Real : Ureal) return Uint is
kono
parents:
diff changeset
422 begin
kono
parents:
diff changeset
423 return Ureals.Table (Real).Num;
kono
parents:
diff changeset
424 end Numerator;
kono
parents:
diff changeset
425
kono
parents:
diff changeset
426 --------
kono
parents:
diff changeset
427 -- pr --
kono
parents:
diff changeset
428 --------
kono
parents:
diff changeset
429
kono
parents:
diff changeset
430 procedure pr (Real : Ureal) is
kono
parents:
diff changeset
431 begin
kono
parents:
diff changeset
432 UR_Write (Real);
kono
parents:
diff changeset
433 Write_Eol;
kono
parents:
diff changeset
434 end pr;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 -----------
kono
parents:
diff changeset
437 -- Rbase --
kono
parents:
diff changeset
438 -----------
kono
parents:
diff changeset
439
kono
parents:
diff changeset
440 function Rbase (Real : Ureal) return Nat is
kono
parents:
diff changeset
441 begin
kono
parents:
diff changeset
442 return Ureals.Table (Real).Rbase;
kono
parents:
diff changeset
443 end Rbase;
kono
parents:
diff changeset
444
kono
parents:
diff changeset
445 -------------
kono
parents:
diff changeset
446 -- Release --
kono
parents:
diff changeset
447 -------------
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 procedure Release (M : Save_Mark) is
kono
parents:
diff changeset
450 begin
kono
parents:
diff changeset
451 Ureals.Set_Last (Ureal (M));
kono
parents:
diff changeset
452 end Release;
kono
parents:
diff changeset
453
kono
parents:
diff changeset
454 ----------
kono
parents:
diff changeset
455 -- Same --
kono
parents:
diff changeset
456 ----------
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 function Same (U1, U2 : Ureal) return Boolean is
kono
parents:
diff changeset
459 begin
kono
parents:
diff changeset
460 return Int (U1) = Int (U2);
kono
parents:
diff changeset
461 end Same;
kono
parents:
diff changeset
462
kono
parents:
diff changeset
463 -----------------
kono
parents:
diff changeset
464 -- Store_Ureal --
kono
parents:
diff changeset
465 -----------------
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 function Store_Ureal (Val : Ureal_Entry) return Ureal is
kono
parents:
diff changeset
468 begin
kono
parents:
diff changeset
469 Ureals.Append (Val);
kono
parents:
diff changeset
470
kono
parents:
diff changeset
471 -- Normalize representation of signed values
kono
parents:
diff changeset
472
kono
parents:
diff changeset
473 if Val.Num < 0 then
kono
parents:
diff changeset
474 Ureals.Table (Ureals.Last).Negative := True;
kono
parents:
diff changeset
475 Ureals.Table (Ureals.Last).Num := -Val.Num;
kono
parents:
diff changeset
476 end if;
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 return Ureals.Last;
kono
parents:
diff changeset
479 end Store_Ureal;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 ----------------------------
kono
parents:
diff changeset
482 -- Store_Ureal_Normalized --
kono
parents:
diff changeset
483 ----------------------------
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 function Store_Ureal_Normalized (Val : Ureal_Entry) return Ureal is
kono
parents:
diff changeset
486 begin
kono
parents:
diff changeset
487 return Store_Ureal (Normalize (Val));
kono
parents:
diff changeset
488 end Store_Ureal_Normalized;
kono
parents:
diff changeset
489
kono
parents:
diff changeset
490 ---------------
kono
parents:
diff changeset
491 -- Tree_Read --
kono
parents:
diff changeset
492 ---------------
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 procedure Tree_Read is
kono
parents:
diff changeset
495 begin
kono
parents:
diff changeset
496 pragma Assert (Num_Ureal_Constants = 10);
kono
parents:
diff changeset
497
kono
parents:
diff changeset
498 Ureals.Tree_Read;
kono
parents:
diff changeset
499 Tree_Read_Int (Int (UR_0));
kono
parents:
diff changeset
500 Tree_Read_Int (Int (UR_M_0));
kono
parents:
diff changeset
501 Tree_Read_Int (Int (UR_Tenth));
kono
parents:
diff changeset
502 Tree_Read_Int (Int (UR_Half));
kono
parents:
diff changeset
503 Tree_Read_Int (Int (UR_1));
kono
parents:
diff changeset
504 Tree_Read_Int (Int (UR_2));
kono
parents:
diff changeset
505 Tree_Read_Int (Int (UR_10));
kono
parents:
diff changeset
506 Tree_Read_Int (Int (UR_100));
kono
parents:
diff changeset
507 Tree_Read_Int (Int (UR_2_128));
kono
parents:
diff changeset
508 Tree_Read_Int (Int (UR_2_M_128));
kono
parents:
diff changeset
509
kono
parents:
diff changeset
510 -- Clear the normalization cache
kono
parents:
diff changeset
511
kono
parents:
diff changeset
512 Normalized_Real := No_Ureal;
kono
parents:
diff changeset
513 end Tree_Read;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 ----------------
kono
parents:
diff changeset
516 -- Tree_Write --
kono
parents:
diff changeset
517 ----------------
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 procedure Tree_Write is
kono
parents:
diff changeset
520 begin
kono
parents:
diff changeset
521 pragma Assert (Num_Ureal_Constants = 10);
kono
parents:
diff changeset
522
kono
parents:
diff changeset
523 Ureals.Tree_Write;
kono
parents:
diff changeset
524 Tree_Write_Int (Int (UR_0));
kono
parents:
diff changeset
525 Tree_Write_Int (Int (UR_M_0));
kono
parents:
diff changeset
526 Tree_Write_Int (Int (UR_Tenth));
kono
parents:
diff changeset
527 Tree_Write_Int (Int (UR_Half));
kono
parents:
diff changeset
528 Tree_Write_Int (Int (UR_1));
kono
parents:
diff changeset
529 Tree_Write_Int (Int (UR_2));
kono
parents:
diff changeset
530 Tree_Write_Int (Int (UR_10));
kono
parents:
diff changeset
531 Tree_Write_Int (Int (UR_100));
kono
parents:
diff changeset
532 Tree_Write_Int (Int (UR_2_128));
kono
parents:
diff changeset
533 Tree_Write_Int (Int (UR_2_M_128));
kono
parents:
diff changeset
534 end Tree_Write;
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 ------------
kono
parents:
diff changeset
537 -- UR_Abs --
kono
parents:
diff changeset
538 ------------
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 function UR_Abs (Real : Ureal) return Ureal is
kono
parents:
diff changeset
541 Val : constant Ureal_Entry := Ureals.Table (Real);
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 begin
kono
parents:
diff changeset
544 return Store_Ureal
kono
parents:
diff changeset
545 ((Num => Val.Num,
kono
parents:
diff changeset
546 Den => Val.Den,
kono
parents:
diff changeset
547 Rbase => Val.Rbase,
kono
parents:
diff changeset
548 Negative => False));
kono
parents:
diff changeset
549 end UR_Abs;
kono
parents:
diff changeset
550
kono
parents:
diff changeset
551 ------------
kono
parents:
diff changeset
552 -- UR_Add --
kono
parents:
diff changeset
553 ------------
kono
parents:
diff changeset
554
kono
parents:
diff changeset
555 function UR_Add (Left : Uint; Right : Ureal) return Ureal is
kono
parents:
diff changeset
556 begin
kono
parents:
diff changeset
557 return UR_From_Uint (Left) + Right;
kono
parents:
diff changeset
558 end UR_Add;
kono
parents:
diff changeset
559
kono
parents:
diff changeset
560 function UR_Add (Left : Ureal; Right : Uint) return Ureal is
kono
parents:
diff changeset
561 begin
kono
parents:
diff changeset
562 return Left + UR_From_Uint (Right);
kono
parents:
diff changeset
563 end UR_Add;
kono
parents:
diff changeset
564
kono
parents:
diff changeset
565 function UR_Add (Left : Ureal; Right : Ureal) return Ureal is
kono
parents:
diff changeset
566 Lval : Ureal_Entry := Ureals.Table (Left);
kono
parents:
diff changeset
567 Rval : Ureal_Entry := Ureals.Table (Right);
kono
parents:
diff changeset
568 Num : Uint;
kono
parents:
diff changeset
569
kono
parents:
diff changeset
570 begin
kono
parents:
diff changeset
571 -- Note, in the temporary Ureal_Entry values used in this procedure,
kono
parents:
diff changeset
572 -- we store the sign as the sign of the numerator (i.e. xxx.Num may
kono
parents:
diff changeset
573 -- be negative, even though in stored entries this can never be so)
kono
parents:
diff changeset
574
kono
parents:
diff changeset
575 if Lval.Rbase /= 0 and then Lval.Rbase = Rval.Rbase then
kono
parents:
diff changeset
576 declare
kono
parents:
diff changeset
577 Opd_Min, Opd_Max : Ureal_Entry;
kono
parents:
diff changeset
578 Exp_Min, Exp_Max : Uint;
kono
parents:
diff changeset
579
kono
parents:
diff changeset
580 begin
kono
parents:
diff changeset
581 if Lval.Negative then
kono
parents:
diff changeset
582 Lval.Num := (-Lval.Num);
kono
parents:
diff changeset
583 end if;
kono
parents:
diff changeset
584
kono
parents:
diff changeset
585 if Rval.Negative then
kono
parents:
diff changeset
586 Rval.Num := (-Rval.Num);
kono
parents:
diff changeset
587 end if;
kono
parents:
diff changeset
588
kono
parents:
diff changeset
589 if Lval.Den < Rval.Den then
kono
parents:
diff changeset
590 Exp_Min := Lval.Den;
kono
parents:
diff changeset
591 Exp_Max := Rval.Den;
kono
parents:
diff changeset
592 Opd_Min := Lval;
kono
parents:
diff changeset
593 Opd_Max := Rval;
kono
parents:
diff changeset
594 else
kono
parents:
diff changeset
595 Exp_Min := Rval.Den;
kono
parents:
diff changeset
596 Exp_Max := Lval.Den;
kono
parents:
diff changeset
597 Opd_Min := Rval;
kono
parents:
diff changeset
598 Opd_Max := Lval;
kono
parents:
diff changeset
599 end if;
kono
parents:
diff changeset
600
kono
parents:
diff changeset
601 Num :=
kono
parents:
diff changeset
602 Opd_Min.Num * Lval.Rbase ** (Exp_Max - Exp_Min) + Opd_Max.Num;
kono
parents:
diff changeset
603
kono
parents:
diff changeset
604 if Num = 0 then
kono
parents:
diff changeset
605 return Store_Ureal
kono
parents:
diff changeset
606 ((Num => Uint_0,
kono
parents:
diff changeset
607 Den => Uint_1,
kono
parents:
diff changeset
608 Rbase => 0,
kono
parents:
diff changeset
609 Negative => Lval.Negative));
kono
parents:
diff changeset
610
kono
parents:
diff changeset
611 else
kono
parents:
diff changeset
612 return Store_Ureal
kono
parents:
diff changeset
613 ((Num => abs Num,
kono
parents:
diff changeset
614 Den => Exp_Max,
kono
parents:
diff changeset
615 Rbase => Lval.Rbase,
kono
parents:
diff changeset
616 Negative => (Num < 0)));
kono
parents:
diff changeset
617 end if;
kono
parents:
diff changeset
618 end;
kono
parents:
diff changeset
619
kono
parents:
diff changeset
620 else
kono
parents:
diff changeset
621 declare
kono
parents:
diff changeset
622 Ln : Ureal_Entry := Normalize (Lval);
kono
parents:
diff changeset
623 Rn : Ureal_Entry := Normalize (Rval);
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 begin
kono
parents:
diff changeset
626 if Ln.Negative then
kono
parents:
diff changeset
627 Ln.Num := (-Ln.Num);
kono
parents:
diff changeset
628 end if;
kono
parents:
diff changeset
629
kono
parents:
diff changeset
630 if Rn.Negative then
kono
parents:
diff changeset
631 Rn.Num := (-Rn.Num);
kono
parents:
diff changeset
632 end if;
kono
parents:
diff changeset
633
kono
parents:
diff changeset
634 Num := (Ln.Num * Rn.Den) + (Rn.Num * Ln.Den);
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 if Num = 0 then
kono
parents:
diff changeset
637 return Store_Ureal
kono
parents:
diff changeset
638 ((Num => Uint_0,
kono
parents:
diff changeset
639 Den => Uint_1,
kono
parents:
diff changeset
640 Rbase => 0,
kono
parents:
diff changeset
641 Negative => Lval.Negative));
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 else
kono
parents:
diff changeset
644 return Store_Ureal_Normalized
kono
parents:
diff changeset
645 ((Num => abs Num,
kono
parents:
diff changeset
646 Den => Ln.Den * Rn.Den,
kono
parents:
diff changeset
647 Rbase => 0,
kono
parents:
diff changeset
648 Negative => (Num < 0)));
kono
parents:
diff changeset
649 end if;
kono
parents:
diff changeset
650 end;
kono
parents:
diff changeset
651 end if;
kono
parents:
diff changeset
652 end UR_Add;
kono
parents:
diff changeset
653
kono
parents:
diff changeset
654 ----------------
kono
parents:
diff changeset
655 -- UR_Ceiling --
kono
parents:
diff changeset
656 ----------------
kono
parents:
diff changeset
657
kono
parents:
diff changeset
658 function UR_Ceiling (Real : Ureal) return Uint is
kono
parents:
diff changeset
659 Val : constant Ureal_Entry := Normalize (Ureals.Table (Real));
kono
parents:
diff changeset
660 begin
kono
parents:
diff changeset
661 if Val.Negative then
kono
parents:
diff changeset
662 return UI_Negate (Val.Num / Val.Den);
kono
parents:
diff changeset
663 else
kono
parents:
diff changeset
664 return (Val.Num + Val.Den - 1) / Val.Den;
kono
parents:
diff changeset
665 end if;
kono
parents:
diff changeset
666 end UR_Ceiling;
kono
parents:
diff changeset
667
kono
parents:
diff changeset
668 ------------
kono
parents:
diff changeset
669 -- UR_Div --
kono
parents:
diff changeset
670 ------------
kono
parents:
diff changeset
671
kono
parents:
diff changeset
672 function UR_Div (Left : Uint; Right : Ureal) return Ureal is
kono
parents:
diff changeset
673 begin
kono
parents:
diff changeset
674 return UR_From_Uint (Left) / Right;
kono
parents:
diff changeset
675 end UR_Div;
kono
parents:
diff changeset
676
kono
parents:
diff changeset
677 function UR_Div (Left : Ureal; Right : Uint) return Ureal is
kono
parents:
diff changeset
678 begin
kono
parents:
diff changeset
679 return Left / UR_From_Uint (Right);
kono
parents:
diff changeset
680 end UR_Div;
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 function UR_Div (Left, Right : Ureal) return Ureal is
kono
parents:
diff changeset
683 Lval : constant Ureal_Entry := Ureals.Table (Left);
kono
parents:
diff changeset
684 Rval : constant Ureal_Entry := Ureals.Table (Right);
kono
parents:
diff changeset
685 Rneg : constant Boolean := Rval.Negative xor Lval.Negative;
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 begin
kono
parents:
diff changeset
688 pragma Assert (Rval.Num /= Uint_0);
kono
parents:
diff changeset
689
kono
parents:
diff changeset
690 if Lval.Rbase = 0 then
kono
parents:
diff changeset
691 if Rval.Rbase = 0 then
kono
parents:
diff changeset
692 return Store_Ureal_Normalized
kono
parents:
diff changeset
693 ((Num => Lval.Num * Rval.Den,
kono
parents:
diff changeset
694 Den => Lval.Den * Rval.Num,
kono
parents:
diff changeset
695 Rbase => 0,
kono
parents:
diff changeset
696 Negative => Rneg));
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 elsif Is_Integer (Lval.Num, Rval.Num * Lval.Den) then
kono
parents:
diff changeset
699 return Store_Ureal
kono
parents:
diff changeset
700 ((Num => Lval.Num / (Rval.Num * Lval.Den),
kono
parents:
diff changeset
701 Den => (-Rval.Den),
kono
parents:
diff changeset
702 Rbase => Rval.Rbase,
kono
parents:
diff changeset
703 Negative => Rneg));
kono
parents:
diff changeset
704
kono
parents:
diff changeset
705 elsif Rval.Den < 0 then
kono
parents:
diff changeset
706 return Store_Ureal_Normalized
kono
parents:
diff changeset
707 ((Num => Lval.Num,
kono
parents:
diff changeset
708 Den => Rval.Rbase ** (-Rval.Den) *
kono
parents:
diff changeset
709 Rval.Num *
kono
parents:
diff changeset
710 Lval.Den,
kono
parents:
diff changeset
711 Rbase => 0,
kono
parents:
diff changeset
712 Negative => Rneg));
kono
parents:
diff changeset
713
kono
parents:
diff changeset
714 else
kono
parents:
diff changeset
715 return Store_Ureal_Normalized
kono
parents:
diff changeset
716 ((Num => Lval.Num * Rval.Rbase ** Rval.Den,
kono
parents:
diff changeset
717 Den => Rval.Num * Lval.Den,
kono
parents:
diff changeset
718 Rbase => 0,
kono
parents:
diff changeset
719 Negative => Rneg));
kono
parents:
diff changeset
720 end if;
kono
parents:
diff changeset
721
kono
parents:
diff changeset
722 elsif Is_Integer (Lval.Num, Rval.Num) then
kono
parents:
diff changeset
723 if Rval.Rbase = Lval.Rbase then
kono
parents:
diff changeset
724 return Store_Ureal
kono
parents:
diff changeset
725 ((Num => Lval.Num / Rval.Num,
kono
parents:
diff changeset
726 Den => Lval.Den - Rval.Den,
kono
parents:
diff changeset
727 Rbase => Lval.Rbase,
kono
parents:
diff changeset
728 Negative => Rneg));
kono
parents:
diff changeset
729
kono
parents:
diff changeset
730 elsif Rval.Rbase = 0 then
kono
parents:
diff changeset
731 return Store_Ureal
kono
parents:
diff changeset
732 ((Num => (Lval.Num / Rval.Num) * Rval.Den,
kono
parents:
diff changeset
733 Den => Lval.Den,
kono
parents:
diff changeset
734 Rbase => Lval.Rbase,
kono
parents:
diff changeset
735 Negative => Rneg));
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 elsif Rval.Den < 0 then
kono
parents:
diff changeset
738 declare
kono
parents:
diff changeset
739 Num, Den : Uint;
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 begin
kono
parents:
diff changeset
742 if Lval.Den < 0 then
kono
parents:
diff changeset
743 Num := (Lval.Num / Rval.Num) * (Lval.Rbase ** (-Lval.Den));
kono
parents:
diff changeset
744 Den := Rval.Rbase ** (-Rval.Den);
kono
parents:
diff changeset
745 else
kono
parents:
diff changeset
746 Num := Lval.Num / Rval.Num;
kono
parents:
diff changeset
747 Den := (Lval.Rbase ** Lval.Den) *
kono
parents:
diff changeset
748 (Rval.Rbase ** (-Rval.Den));
kono
parents:
diff changeset
749 end if;
kono
parents:
diff changeset
750
kono
parents:
diff changeset
751 return Store_Ureal
kono
parents:
diff changeset
752 ((Num => Num,
kono
parents:
diff changeset
753 Den => Den,
kono
parents:
diff changeset
754 Rbase => 0,
kono
parents:
diff changeset
755 Negative => Rneg));
kono
parents:
diff changeset
756 end;
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 else
kono
parents:
diff changeset
759 return Store_Ureal
kono
parents:
diff changeset
760 ((Num => (Lval.Num / Rval.Num) *
kono
parents:
diff changeset
761 (Rval.Rbase ** Rval.Den),
kono
parents:
diff changeset
762 Den => Lval.Den,
kono
parents:
diff changeset
763 Rbase => Lval.Rbase,
kono
parents:
diff changeset
764 Negative => Rneg));
kono
parents:
diff changeset
765 end if;
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 else
kono
parents:
diff changeset
768 declare
kono
parents:
diff changeset
769 Num, Den : Uint;
kono
parents:
diff changeset
770
kono
parents:
diff changeset
771 begin
kono
parents:
diff changeset
772 if Lval.Den < 0 then
kono
parents:
diff changeset
773 Num := Lval.Num * (Lval.Rbase ** (-Lval.Den));
kono
parents:
diff changeset
774 Den := Rval.Num;
kono
parents:
diff changeset
775 else
kono
parents:
diff changeset
776 Num := Lval.Num;
kono
parents:
diff changeset
777 Den := Rval.Num * (Lval.Rbase ** Lval.Den);
kono
parents:
diff changeset
778 end if;
kono
parents:
diff changeset
779
kono
parents:
diff changeset
780 if Rval.Rbase /= 0 then
kono
parents:
diff changeset
781 if Rval.Den < 0 then
kono
parents:
diff changeset
782 Den := Den * (Rval.Rbase ** (-Rval.Den));
kono
parents:
diff changeset
783 else
kono
parents:
diff changeset
784 Num := Num * (Rval.Rbase ** Rval.Den);
kono
parents:
diff changeset
785 end if;
kono
parents:
diff changeset
786
kono
parents:
diff changeset
787 else
kono
parents:
diff changeset
788 Num := Num * Rval.Den;
kono
parents:
diff changeset
789 end if;
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 return Store_Ureal_Normalized
kono
parents:
diff changeset
792 ((Num => Num,
kono
parents:
diff changeset
793 Den => Den,
kono
parents:
diff changeset
794 Rbase => 0,
kono
parents:
diff changeset
795 Negative => Rneg));
kono
parents:
diff changeset
796 end;
kono
parents:
diff changeset
797 end if;
kono
parents:
diff changeset
798 end UR_Div;
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 -----------
kono
parents:
diff changeset
801 -- UR_Eq --
kono
parents:
diff changeset
802 -----------
kono
parents:
diff changeset
803
kono
parents:
diff changeset
804 function UR_Eq (Left, Right : Ureal) return Boolean is
kono
parents:
diff changeset
805 begin
kono
parents:
diff changeset
806 return not UR_Ne (Left, Right);
kono
parents:
diff changeset
807 end UR_Eq;
kono
parents:
diff changeset
808
kono
parents:
diff changeset
809 ---------------------
kono
parents:
diff changeset
810 -- UR_Exponentiate --
kono
parents:
diff changeset
811 ---------------------
kono
parents:
diff changeset
812
kono
parents:
diff changeset
813 function UR_Exponentiate (Real : Ureal; N : Uint) return Ureal is
kono
parents:
diff changeset
814 X : constant Uint := abs N;
kono
parents:
diff changeset
815 Bas : Ureal;
kono
parents:
diff changeset
816 Val : Ureal_Entry;
kono
parents:
diff changeset
817 Neg : Boolean;
kono
parents:
diff changeset
818 IBas : Uint;
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 begin
kono
parents:
diff changeset
821 -- If base is negative, then the resulting sign depends on whether
kono
parents:
diff changeset
822 -- the exponent is even or odd (even => positive, odd = negative)
kono
parents:
diff changeset
823
kono
parents:
diff changeset
824 if UR_Is_Negative (Real) then
kono
parents:
diff changeset
825 Neg := (N mod 2) /= 0;
kono
parents:
diff changeset
826 Bas := UR_Negate (Real);
kono
parents:
diff changeset
827 else
kono
parents:
diff changeset
828 Neg := False;
kono
parents:
diff changeset
829 Bas := Real;
kono
parents:
diff changeset
830 end if;
kono
parents:
diff changeset
831
kono
parents:
diff changeset
832 Val := Ureals.Table (Bas);
kono
parents:
diff changeset
833
kono
parents:
diff changeset
834 -- If the base is a small integer, then we can return the result in
kono
parents:
diff changeset
835 -- exponential form, which can save a lot of time for junk exponents.
kono
parents:
diff changeset
836
kono
parents:
diff changeset
837 IBas := UR_Trunc (Bas);
kono
parents:
diff changeset
838
kono
parents:
diff changeset
839 if IBas <= 16
kono
parents:
diff changeset
840 and then UR_From_Uint (IBas) = Bas
kono
parents:
diff changeset
841 then
kono
parents:
diff changeset
842 return Store_Ureal
kono
parents:
diff changeset
843 ((Num => Uint_1,
kono
parents:
diff changeset
844 Den => -N,
kono
parents:
diff changeset
845 Rbase => UI_To_Int (UR_Trunc (Bas)),
kono
parents:
diff changeset
846 Negative => Neg));
kono
parents:
diff changeset
847
kono
parents:
diff changeset
848 -- If the exponent is negative then we raise the numerator and the
kono
parents:
diff changeset
849 -- denominator (after normalization) to the absolute value of the
kono
parents:
diff changeset
850 -- exponent and we return the reciprocal. An assert error will happen
kono
parents:
diff changeset
851 -- if the numerator is zero.
kono
parents:
diff changeset
852
kono
parents:
diff changeset
853 elsif N < 0 then
kono
parents:
diff changeset
854 pragma Assert (Val.Num /= 0);
kono
parents:
diff changeset
855 Val := Normalize (Val);
kono
parents:
diff changeset
856
kono
parents:
diff changeset
857 return Store_Ureal
kono
parents:
diff changeset
858 ((Num => Val.Den ** X,
kono
parents:
diff changeset
859 Den => Val.Num ** X,
kono
parents:
diff changeset
860 Rbase => 0,
kono
parents:
diff changeset
861 Negative => Neg));
kono
parents:
diff changeset
862
kono
parents:
diff changeset
863 -- If positive, we distinguish the case when the base is not zero, in
kono
parents:
diff changeset
864 -- which case the new denominator is just the product of the old one
kono
parents:
diff changeset
865 -- with the exponent,
kono
parents:
diff changeset
866
kono
parents:
diff changeset
867 else
kono
parents:
diff changeset
868 if Val.Rbase /= 0 then
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 return Store_Ureal
kono
parents:
diff changeset
871 ((Num => Val.Num ** X,
kono
parents:
diff changeset
872 Den => Val.Den * X,
kono
parents:
diff changeset
873 Rbase => Val.Rbase,
kono
parents:
diff changeset
874 Negative => Neg));
kono
parents:
diff changeset
875
kono
parents:
diff changeset
876 -- And when the base is zero, in which case we exponentiate
kono
parents:
diff changeset
877 -- the old denominator.
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 else
kono
parents:
diff changeset
880 return Store_Ureal
kono
parents:
diff changeset
881 ((Num => Val.Num ** X,
kono
parents:
diff changeset
882 Den => Val.Den ** X,
kono
parents:
diff changeset
883 Rbase => 0,
kono
parents:
diff changeset
884 Negative => Neg));
kono
parents:
diff changeset
885 end if;
kono
parents:
diff changeset
886 end if;
kono
parents:
diff changeset
887 end UR_Exponentiate;
kono
parents:
diff changeset
888
kono
parents:
diff changeset
889 --------------
kono
parents:
diff changeset
890 -- UR_Floor --
kono
parents:
diff changeset
891 --------------
kono
parents:
diff changeset
892
kono
parents:
diff changeset
893 function UR_Floor (Real : Ureal) return Uint is
kono
parents:
diff changeset
894 Val : constant Ureal_Entry := Normalize (Ureals.Table (Real));
kono
parents:
diff changeset
895 begin
kono
parents:
diff changeset
896 if Val.Negative then
kono
parents:
diff changeset
897 return UI_Negate ((Val.Num + Val.Den - 1) / Val.Den);
kono
parents:
diff changeset
898 else
kono
parents:
diff changeset
899 return Val.Num / Val.Den;
kono
parents:
diff changeset
900 end if;
kono
parents:
diff changeset
901 end UR_Floor;
kono
parents:
diff changeset
902
kono
parents:
diff changeset
903 ------------------------
kono
parents:
diff changeset
904 -- UR_From_Components --
kono
parents:
diff changeset
905 ------------------------
kono
parents:
diff changeset
906
kono
parents:
diff changeset
907 function UR_From_Components
kono
parents:
diff changeset
908 (Num : Uint;
kono
parents:
diff changeset
909 Den : Uint;
kono
parents:
diff changeset
910 Rbase : Nat := 0;
kono
parents:
diff changeset
911 Negative : Boolean := False)
kono
parents:
diff changeset
912 return Ureal
kono
parents:
diff changeset
913 is
kono
parents:
diff changeset
914 begin
kono
parents:
diff changeset
915 return Store_Ureal
kono
parents:
diff changeset
916 ((Num => Num,
kono
parents:
diff changeset
917 Den => Den,
kono
parents:
diff changeset
918 Rbase => Rbase,
kono
parents:
diff changeset
919 Negative => Negative));
kono
parents:
diff changeset
920 end UR_From_Components;
kono
parents:
diff changeset
921
kono
parents:
diff changeset
922 ------------------
kono
parents:
diff changeset
923 -- UR_From_Uint --
kono
parents:
diff changeset
924 ------------------
kono
parents:
diff changeset
925
kono
parents:
diff changeset
926 function UR_From_Uint (UI : Uint) return Ureal is
kono
parents:
diff changeset
927 begin
kono
parents:
diff changeset
928 return UR_From_Components
kono
parents:
diff changeset
929 (abs UI, Uint_1, Negative => (UI < 0));
kono
parents:
diff changeset
930 end UR_From_Uint;
kono
parents:
diff changeset
931
kono
parents:
diff changeset
932 -----------
kono
parents:
diff changeset
933 -- UR_Ge --
kono
parents:
diff changeset
934 -----------
kono
parents:
diff changeset
935
kono
parents:
diff changeset
936 function UR_Ge (Left, Right : Ureal) return Boolean is
kono
parents:
diff changeset
937 begin
kono
parents:
diff changeset
938 return not (Left < Right);
kono
parents:
diff changeset
939 end UR_Ge;
kono
parents:
diff changeset
940
kono
parents:
diff changeset
941 -----------
kono
parents:
diff changeset
942 -- UR_Gt --
kono
parents:
diff changeset
943 -----------
kono
parents:
diff changeset
944
kono
parents:
diff changeset
945 function UR_Gt (Left, Right : Ureal) return Boolean is
kono
parents:
diff changeset
946 begin
kono
parents:
diff changeset
947 return (Right < Left);
kono
parents:
diff changeset
948 end UR_Gt;
kono
parents:
diff changeset
949
kono
parents:
diff changeset
950 --------------------
kono
parents:
diff changeset
951 -- UR_Is_Negative --
kono
parents:
diff changeset
952 --------------------
kono
parents:
diff changeset
953
kono
parents:
diff changeset
954 function UR_Is_Negative (Real : Ureal) return Boolean is
kono
parents:
diff changeset
955 begin
kono
parents:
diff changeset
956 return Ureals.Table (Real).Negative;
kono
parents:
diff changeset
957 end UR_Is_Negative;
kono
parents:
diff changeset
958
kono
parents:
diff changeset
959 --------------------
kono
parents:
diff changeset
960 -- UR_Is_Positive --
kono
parents:
diff changeset
961 --------------------
kono
parents:
diff changeset
962
kono
parents:
diff changeset
963 function UR_Is_Positive (Real : Ureal) return Boolean is
kono
parents:
diff changeset
964 begin
kono
parents:
diff changeset
965 return not Ureals.Table (Real).Negative
kono
parents:
diff changeset
966 and then Ureals.Table (Real).Num /= 0;
kono
parents:
diff changeset
967 end UR_Is_Positive;
kono
parents:
diff changeset
968
kono
parents:
diff changeset
969 ----------------
kono
parents:
diff changeset
970 -- UR_Is_Zero --
kono
parents:
diff changeset
971 ----------------
kono
parents:
diff changeset
972
kono
parents:
diff changeset
973 function UR_Is_Zero (Real : Ureal) return Boolean is
kono
parents:
diff changeset
974 begin
kono
parents:
diff changeset
975 return Ureals.Table (Real).Num = 0;
kono
parents:
diff changeset
976 end UR_Is_Zero;
kono
parents:
diff changeset
977
kono
parents:
diff changeset
978 -----------
kono
parents:
diff changeset
979 -- UR_Le --
kono
parents:
diff changeset
980 -----------
kono
parents:
diff changeset
981
kono
parents:
diff changeset
982 function UR_Le (Left, Right : Ureal) return Boolean is
kono
parents:
diff changeset
983 begin
kono
parents:
diff changeset
984 return not (Right < Left);
kono
parents:
diff changeset
985 end UR_Le;
kono
parents:
diff changeset
986
kono
parents:
diff changeset
987 -----------
kono
parents:
diff changeset
988 -- UR_Lt --
kono
parents:
diff changeset
989 -----------
kono
parents:
diff changeset
990
kono
parents:
diff changeset
991 function UR_Lt (Left, Right : Ureal) return Boolean is
kono
parents:
diff changeset
992 begin
kono
parents:
diff changeset
993 -- An operand is not less than itself
kono
parents:
diff changeset
994
kono
parents:
diff changeset
995 if Same (Left, Right) then
kono
parents:
diff changeset
996 return False;
kono
parents:
diff changeset
997
kono
parents:
diff changeset
998 -- Deal with zero cases
kono
parents:
diff changeset
999
kono
parents:
diff changeset
1000 elsif UR_Is_Zero (Left) then
kono
parents:
diff changeset
1001 return UR_Is_Positive (Right);
kono
parents:
diff changeset
1002
kono
parents:
diff changeset
1003 elsif UR_Is_Zero (Right) then
kono
parents:
diff changeset
1004 return Ureals.Table (Left).Negative;
kono
parents:
diff changeset
1005
kono
parents:
diff changeset
1006 -- Different signs are decisive (note we dealt with zero cases)
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 elsif Ureals.Table (Left).Negative
kono
parents:
diff changeset
1009 and then not Ureals.Table (Right).Negative
kono
parents:
diff changeset
1010 then
kono
parents:
diff changeset
1011 return True;
kono
parents:
diff changeset
1012
kono
parents:
diff changeset
1013 elsif not Ureals.Table (Left).Negative
kono
parents:
diff changeset
1014 and then Ureals.Table (Right).Negative
kono
parents:
diff changeset
1015 then
kono
parents:
diff changeset
1016 return False;
kono
parents:
diff changeset
1017
kono
parents:
diff changeset
1018 -- Signs are same, do rapid check based on worst case estimates of
kono
parents:
diff changeset
1019 -- decimal exponent, which will often be decisive. Precise test
kono
parents:
diff changeset
1020 -- depends on whether operands are positive or negative.
kono
parents:
diff changeset
1021
kono
parents:
diff changeset
1022 elsif Decimal_Exponent_Hi (Left) < Decimal_Exponent_Lo (Right) then
kono
parents:
diff changeset
1023 return UR_Is_Positive (Left);
kono
parents:
diff changeset
1024
kono
parents:
diff changeset
1025 elsif Decimal_Exponent_Lo (Left) > Decimal_Exponent_Hi (Right) then
kono
parents:
diff changeset
1026 return UR_Is_Negative (Left);
kono
parents:
diff changeset
1027
kono
parents:
diff changeset
1028 -- If we fall through, full gruesome test is required. This happens
kono
parents:
diff changeset
1029 -- if the numbers are close together, or in some weird (/=10) base.
kono
parents:
diff changeset
1030
kono
parents:
diff changeset
1031 else
kono
parents:
diff changeset
1032 declare
kono
parents:
diff changeset
1033 Imrk : constant Uintp.Save_Mark := Mark;
kono
parents:
diff changeset
1034 Rmrk : constant Urealp.Save_Mark := Mark;
kono
parents:
diff changeset
1035 Lval : Ureal_Entry;
kono
parents:
diff changeset
1036 Rval : Ureal_Entry;
kono
parents:
diff changeset
1037 Result : Boolean;
kono
parents:
diff changeset
1038
kono
parents:
diff changeset
1039 begin
kono
parents:
diff changeset
1040 Lval := Ureals.Table (Left);
kono
parents:
diff changeset
1041 Rval := Ureals.Table (Right);
kono
parents:
diff changeset
1042
kono
parents:
diff changeset
1043 -- An optimization. If both numbers are based, then subtract
kono
parents:
diff changeset
1044 -- common value of base to avoid unnecessarily giant numbers
kono
parents:
diff changeset
1045
kono
parents:
diff changeset
1046 if Lval.Rbase = Rval.Rbase and then Lval.Rbase /= 0 then
kono
parents:
diff changeset
1047 if Lval.Den < Rval.Den then
kono
parents:
diff changeset
1048 Rval.Den := Rval.Den - Lval.Den;
kono
parents:
diff changeset
1049 Lval.Den := Uint_0;
kono
parents:
diff changeset
1050 else
kono
parents:
diff changeset
1051 Lval.Den := Lval.Den - Rval.Den;
kono
parents:
diff changeset
1052 Rval.Den := Uint_0;
kono
parents:
diff changeset
1053 end if;
kono
parents:
diff changeset
1054 end if;
kono
parents:
diff changeset
1055
kono
parents:
diff changeset
1056 Lval := Normalize (Lval);
kono
parents:
diff changeset
1057 Rval := Normalize (Rval);
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 if Lval.Negative then
kono
parents:
diff changeset
1060 Result := (Lval.Num * Rval.Den) > (Rval.Num * Lval.Den);
kono
parents:
diff changeset
1061 else
kono
parents:
diff changeset
1062 Result := (Lval.Num * Rval.Den) < (Rval.Num * Lval.Den);
kono
parents:
diff changeset
1063 end if;
kono
parents:
diff changeset
1064
kono
parents:
diff changeset
1065 Release (Imrk);
kono
parents:
diff changeset
1066 Release (Rmrk);
kono
parents:
diff changeset
1067 return Result;
kono
parents:
diff changeset
1068 end;
kono
parents:
diff changeset
1069 end if;
kono
parents:
diff changeset
1070 end UR_Lt;
kono
parents:
diff changeset
1071
kono
parents:
diff changeset
1072 ------------
kono
parents:
diff changeset
1073 -- UR_Max --
kono
parents:
diff changeset
1074 ------------
kono
parents:
diff changeset
1075
kono
parents:
diff changeset
1076 function UR_Max (Left, Right : Ureal) return Ureal is
kono
parents:
diff changeset
1077 begin
kono
parents:
diff changeset
1078 if Left >= Right then
kono
parents:
diff changeset
1079 return Left;
kono
parents:
diff changeset
1080 else
kono
parents:
diff changeset
1081 return Right;
kono
parents:
diff changeset
1082 end if;
kono
parents:
diff changeset
1083 end UR_Max;
kono
parents:
diff changeset
1084
kono
parents:
diff changeset
1085 ------------
kono
parents:
diff changeset
1086 -- UR_Min --
kono
parents:
diff changeset
1087 ------------
kono
parents:
diff changeset
1088
kono
parents:
diff changeset
1089 function UR_Min (Left, Right : Ureal) return Ureal is
kono
parents:
diff changeset
1090 begin
kono
parents:
diff changeset
1091 if Left <= Right then
kono
parents:
diff changeset
1092 return Left;
kono
parents:
diff changeset
1093 else
kono
parents:
diff changeset
1094 return Right;
kono
parents:
diff changeset
1095 end if;
kono
parents:
diff changeset
1096 end UR_Min;
kono
parents:
diff changeset
1097
kono
parents:
diff changeset
1098 ------------
kono
parents:
diff changeset
1099 -- UR_Mul --
kono
parents:
diff changeset
1100 ------------
kono
parents:
diff changeset
1101
kono
parents:
diff changeset
1102 function UR_Mul (Left : Uint; Right : Ureal) return Ureal is
kono
parents:
diff changeset
1103 begin
kono
parents:
diff changeset
1104 return UR_From_Uint (Left) * Right;
kono
parents:
diff changeset
1105 end UR_Mul;
kono
parents:
diff changeset
1106
kono
parents:
diff changeset
1107 function UR_Mul (Left : Ureal; Right : Uint) return Ureal is
kono
parents:
diff changeset
1108 begin
kono
parents:
diff changeset
1109 return Left * UR_From_Uint (Right);
kono
parents:
diff changeset
1110 end UR_Mul;
kono
parents:
diff changeset
1111
kono
parents:
diff changeset
1112 function UR_Mul (Left, Right : Ureal) return Ureal is
kono
parents:
diff changeset
1113 Lval : constant Ureal_Entry := Ureals.Table (Left);
kono
parents:
diff changeset
1114 Rval : constant Ureal_Entry := Ureals.Table (Right);
kono
parents:
diff changeset
1115 Num : Uint := Lval.Num * Rval.Num;
kono
parents:
diff changeset
1116 Den : Uint;
kono
parents:
diff changeset
1117 Rneg : constant Boolean := Lval.Negative xor Rval.Negative;
kono
parents:
diff changeset
1118
kono
parents:
diff changeset
1119 begin
kono
parents:
diff changeset
1120 if Lval.Rbase = 0 then
kono
parents:
diff changeset
1121 if Rval.Rbase = 0 then
kono
parents:
diff changeset
1122 return Store_Ureal_Normalized
kono
parents:
diff changeset
1123 ((Num => Num,
kono
parents:
diff changeset
1124 Den => Lval.Den * Rval.Den,
kono
parents:
diff changeset
1125 Rbase => 0,
kono
parents:
diff changeset
1126 Negative => Rneg));
kono
parents:
diff changeset
1127
kono
parents:
diff changeset
1128 elsif Is_Integer (Num, Lval.Den) then
kono
parents:
diff changeset
1129 return Store_Ureal
kono
parents:
diff changeset
1130 ((Num => Num / Lval.Den,
kono
parents:
diff changeset
1131 Den => Rval.Den,
kono
parents:
diff changeset
1132 Rbase => Rval.Rbase,
kono
parents:
diff changeset
1133 Negative => Rneg));
kono
parents:
diff changeset
1134
kono
parents:
diff changeset
1135 elsif Rval.Den < 0 then
kono
parents:
diff changeset
1136 return Store_Ureal_Normalized
kono
parents:
diff changeset
1137 ((Num => Num * (Rval.Rbase ** (-Rval.Den)),
kono
parents:
diff changeset
1138 Den => Lval.Den,
kono
parents:
diff changeset
1139 Rbase => 0,
kono
parents:
diff changeset
1140 Negative => Rneg));
kono
parents:
diff changeset
1141
kono
parents:
diff changeset
1142 else
kono
parents:
diff changeset
1143 return Store_Ureal_Normalized
kono
parents:
diff changeset
1144 ((Num => Num,
kono
parents:
diff changeset
1145 Den => Lval.Den * (Rval.Rbase ** Rval.Den),
kono
parents:
diff changeset
1146 Rbase => 0,
kono
parents:
diff changeset
1147 Negative => Rneg));
kono
parents:
diff changeset
1148 end if;
kono
parents:
diff changeset
1149
kono
parents:
diff changeset
1150 elsif Lval.Rbase = Rval.Rbase then
kono
parents:
diff changeset
1151 return Store_Ureal
kono
parents:
diff changeset
1152 ((Num => Num,
kono
parents:
diff changeset
1153 Den => Lval.Den + Rval.Den,
kono
parents:
diff changeset
1154 Rbase => Lval.Rbase,
kono
parents:
diff changeset
1155 Negative => Rneg));
kono
parents:
diff changeset
1156
kono
parents:
diff changeset
1157 elsif Rval.Rbase = 0 then
kono
parents:
diff changeset
1158 if Is_Integer (Num, Rval.Den) then
kono
parents:
diff changeset
1159 return Store_Ureal
kono
parents:
diff changeset
1160 ((Num => Num / Rval.Den,
kono
parents:
diff changeset
1161 Den => Lval.Den,
kono
parents:
diff changeset
1162 Rbase => Lval.Rbase,
kono
parents:
diff changeset
1163 Negative => Rneg));
kono
parents:
diff changeset
1164
kono
parents:
diff changeset
1165 elsif Lval.Den < 0 then
kono
parents:
diff changeset
1166 return Store_Ureal_Normalized
kono
parents:
diff changeset
1167 ((Num => Num * (Lval.Rbase ** (-Lval.Den)),
kono
parents:
diff changeset
1168 Den => Rval.Den,
kono
parents:
diff changeset
1169 Rbase => 0,
kono
parents:
diff changeset
1170 Negative => Rneg));
kono
parents:
diff changeset
1171
kono
parents:
diff changeset
1172 else
kono
parents:
diff changeset
1173 return Store_Ureal_Normalized
kono
parents:
diff changeset
1174 ((Num => Num,
kono
parents:
diff changeset
1175 Den => Rval.Den * (Lval.Rbase ** Lval.Den),
kono
parents:
diff changeset
1176 Rbase => 0,
kono
parents:
diff changeset
1177 Negative => Rneg));
kono
parents:
diff changeset
1178 end if;
kono
parents:
diff changeset
1179
kono
parents:
diff changeset
1180 else
kono
parents:
diff changeset
1181 Den := Uint_1;
kono
parents:
diff changeset
1182
kono
parents:
diff changeset
1183 if Lval.Den < 0 then
kono
parents:
diff changeset
1184 Num := Num * (Lval.Rbase ** (-Lval.Den));
kono
parents:
diff changeset
1185 else
kono
parents:
diff changeset
1186 Den := Den * (Lval.Rbase ** Lval.Den);
kono
parents:
diff changeset
1187 end if;
kono
parents:
diff changeset
1188
kono
parents:
diff changeset
1189 if Rval.Den < 0 then
kono
parents:
diff changeset
1190 Num := Num * (Rval.Rbase ** (-Rval.Den));
kono
parents:
diff changeset
1191 else
kono
parents:
diff changeset
1192 Den := Den * (Rval.Rbase ** Rval.Den);
kono
parents:
diff changeset
1193 end if;
kono
parents:
diff changeset
1194
kono
parents:
diff changeset
1195 return Store_Ureal_Normalized
kono
parents:
diff changeset
1196 ((Num => Num,
kono
parents:
diff changeset
1197 Den => Den,
kono
parents:
diff changeset
1198 Rbase => 0,
kono
parents:
diff changeset
1199 Negative => Rneg));
kono
parents:
diff changeset
1200 end if;
kono
parents:
diff changeset
1201 end UR_Mul;
kono
parents:
diff changeset
1202
kono
parents:
diff changeset
1203 -----------
kono
parents:
diff changeset
1204 -- UR_Ne --
kono
parents:
diff changeset
1205 -----------
kono
parents:
diff changeset
1206
kono
parents:
diff changeset
1207 function UR_Ne (Left, Right : Ureal) return Boolean is
kono
parents:
diff changeset
1208 begin
kono
parents:
diff changeset
1209 -- Quick processing for case of identical Ureal values (note that
kono
parents:
diff changeset
1210 -- this also deals with comparing two No_Ureal values).
kono
parents:
diff changeset
1211
kono
parents:
diff changeset
1212 if Same (Left, Right) then
kono
parents:
diff changeset
1213 return False;
kono
parents:
diff changeset
1214
kono
parents:
diff changeset
1215 -- Deal with case of one or other operand is No_Ureal, but not both
kono
parents:
diff changeset
1216
kono
parents:
diff changeset
1217 elsif Same (Left, No_Ureal) or else Same (Right, No_Ureal) then
kono
parents:
diff changeset
1218 return True;
kono
parents:
diff changeset
1219
kono
parents:
diff changeset
1220 -- Do quick check based on number of decimal digits
kono
parents:
diff changeset
1221
kono
parents:
diff changeset
1222 elsif Decimal_Exponent_Hi (Left) < Decimal_Exponent_Lo (Right) or else
kono
parents:
diff changeset
1223 Decimal_Exponent_Lo (Left) > Decimal_Exponent_Hi (Right)
kono
parents:
diff changeset
1224 then
kono
parents:
diff changeset
1225 return True;
kono
parents:
diff changeset
1226
kono
parents:
diff changeset
1227 -- Otherwise full comparison is required
kono
parents:
diff changeset
1228
kono
parents:
diff changeset
1229 else
kono
parents:
diff changeset
1230 declare
kono
parents:
diff changeset
1231 Imrk : constant Uintp.Save_Mark := Mark;
kono
parents:
diff changeset
1232 Rmrk : constant Urealp.Save_Mark := Mark;
kono
parents:
diff changeset
1233 Lval : constant Ureal_Entry := Normalize (Ureals.Table (Left));
kono
parents:
diff changeset
1234 Rval : constant Ureal_Entry := Normalize (Ureals.Table (Right));
kono
parents:
diff changeset
1235 Result : Boolean;
kono
parents:
diff changeset
1236
kono
parents:
diff changeset
1237 begin
kono
parents:
diff changeset
1238 if UR_Is_Zero (Left) then
kono
parents:
diff changeset
1239 return not UR_Is_Zero (Right);
kono
parents:
diff changeset
1240
kono
parents:
diff changeset
1241 elsif UR_Is_Zero (Right) then
kono
parents:
diff changeset
1242 return not UR_Is_Zero (Left);
kono
parents:
diff changeset
1243
kono
parents:
diff changeset
1244 -- Both operands are non-zero
kono
parents:
diff changeset
1245
kono
parents:
diff changeset
1246 else
kono
parents:
diff changeset
1247 Result :=
kono
parents:
diff changeset
1248 Rval.Negative /= Lval.Negative
kono
parents:
diff changeset
1249 or else Rval.Num /= Lval.Num
kono
parents:
diff changeset
1250 or else Rval.Den /= Lval.Den;
kono
parents:
diff changeset
1251 Release (Imrk);
kono
parents:
diff changeset
1252 Release (Rmrk);
kono
parents:
diff changeset
1253 return Result;
kono
parents:
diff changeset
1254 end if;
kono
parents:
diff changeset
1255 end;
kono
parents:
diff changeset
1256 end if;
kono
parents:
diff changeset
1257 end UR_Ne;
kono
parents:
diff changeset
1258
kono
parents:
diff changeset
1259 ---------------
kono
parents:
diff changeset
1260 -- UR_Negate --
kono
parents:
diff changeset
1261 ---------------
kono
parents:
diff changeset
1262
kono
parents:
diff changeset
1263 function UR_Negate (Real : Ureal) return Ureal is
kono
parents:
diff changeset
1264 begin
kono
parents:
diff changeset
1265 return Store_Ureal
kono
parents:
diff changeset
1266 ((Num => Ureals.Table (Real).Num,
kono
parents:
diff changeset
1267 Den => Ureals.Table (Real).Den,
kono
parents:
diff changeset
1268 Rbase => Ureals.Table (Real).Rbase,
kono
parents:
diff changeset
1269 Negative => not Ureals.Table (Real).Negative));
kono
parents:
diff changeset
1270 end UR_Negate;
kono
parents:
diff changeset
1271
kono
parents:
diff changeset
1272 ------------
kono
parents:
diff changeset
1273 -- UR_Sub --
kono
parents:
diff changeset
1274 ------------
kono
parents:
diff changeset
1275
kono
parents:
diff changeset
1276 function UR_Sub (Left : Uint; Right : Ureal) return Ureal is
kono
parents:
diff changeset
1277 begin
kono
parents:
diff changeset
1278 return UR_From_Uint (Left) + UR_Negate (Right);
kono
parents:
diff changeset
1279 end UR_Sub;
kono
parents:
diff changeset
1280
kono
parents:
diff changeset
1281 function UR_Sub (Left : Ureal; Right : Uint) return Ureal is
kono
parents:
diff changeset
1282 begin
kono
parents:
diff changeset
1283 return Left + UR_From_Uint (-Right);
kono
parents:
diff changeset
1284 end UR_Sub;
kono
parents:
diff changeset
1285
kono
parents:
diff changeset
1286 function UR_Sub (Left, Right : Ureal) return Ureal is
kono
parents:
diff changeset
1287 begin
kono
parents:
diff changeset
1288 return Left + UR_Negate (Right);
kono
parents:
diff changeset
1289 end UR_Sub;
kono
parents:
diff changeset
1290
kono
parents:
diff changeset
1291 ----------------
kono
parents:
diff changeset
1292 -- UR_To_Uint --
kono
parents:
diff changeset
1293 ----------------
kono
parents:
diff changeset
1294
kono
parents:
diff changeset
1295 function UR_To_Uint (Real : Ureal) return Uint is
kono
parents:
diff changeset
1296 Val : constant Ureal_Entry := Normalize (Ureals.Table (Real));
kono
parents:
diff changeset
1297 Res : Uint;
kono
parents:
diff changeset
1298
kono
parents:
diff changeset
1299 begin
kono
parents:
diff changeset
1300 Res := (Val.Num + (Val.Den / 2)) / Val.Den;
kono
parents:
diff changeset
1301
kono
parents:
diff changeset
1302 if Val.Negative then
kono
parents:
diff changeset
1303 return UI_Negate (Res);
kono
parents:
diff changeset
1304 else
kono
parents:
diff changeset
1305 return Res;
kono
parents:
diff changeset
1306 end if;
kono
parents:
diff changeset
1307 end UR_To_Uint;
kono
parents:
diff changeset
1308
kono
parents:
diff changeset
1309 --------------
kono
parents:
diff changeset
1310 -- UR_Trunc --
kono
parents:
diff changeset
1311 --------------
kono
parents:
diff changeset
1312
kono
parents:
diff changeset
1313 function UR_Trunc (Real : Ureal) return Uint is
kono
parents:
diff changeset
1314 Val : constant Ureal_Entry := Normalize (Ureals.Table (Real));
kono
parents:
diff changeset
1315 begin
kono
parents:
diff changeset
1316 if Val.Negative then
kono
parents:
diff changeset
1317 return -(Val.Num / Val.Den);
kono
parents:
diff changeset
1318 else
kono
parents:
diff changeset
1319 return Val.Num / Val.Den;
kono
parents:
diff changeset
1320 end if;
kono
parents:
diff changeset
1321 end UR_Trunc;
kono
parents:
diff changeset
1322
kono
parents:
diff changeset
1323 --------------
kono
parents:
diff changeset
1324 -- UR_Write --
kono
parents:
diff changeset
1325 --------------
kono
parents:
diff changeset
1326
kono
parents:
diff changeset
1327 procedure UR_Write (Real : Ureal; Brackets : Boolean := False) is
kono
parents:
diff changeset
1328 Val : constant Ureal_Entry := Ureals.Table (Real);
kono
parents:
diff changeset
1329 T : Uint;
kono
parents:
diff changeset
1330
kono
parents:
diff changeset
1331 begin
kono
parents:
diff changeset
1332 -- If value is negative, we precede the constant by a minus sign
kono
parents:
diff changeset
1333
kono
parents:
diff changeset
1334 if Val.Negative then
kono
parents:
diff changeset
1335 Write_Char ('-');
kono
parents:
diff changeset
1336 end if;
kono
parents:
diff changeset
1337
kono
parents:
diff changeset
1338 -- Zero is zero
kono
parents:
diff changeset
1339
kono
parents:
diff changeset
1340 if Val.Num = 0 then
kono
parents:
diff changeset
1341 Write_Str ("0.0");
kono
parents:
diff changeset
1342
kono
parents:
diff changeset
1343 -- For constants with a denominator of zero, the value is simply the
kono
parents:
diff changeset
1344 -- numerator value, since we are dividing by base**0, which is 1.
kono
parents:
diff changeset
1345
kono
parents:
diff changeset
1346 elsif Val.Den = 0 then
kono
parents:
diff changeset
1347 UI_Write (Val.Num, Decimal);
kono
parents:
diff changeset
1348 Write_Str (".0");
kono
parents:
diff changeset
1349
kono
parents:
diff changeset
1350 -- Small powers of 2 get written in decimal fixed-point format
kono
parents:
diff changeset
1351
kono
parents:
diff changeset
1352 elsif Val.Rbase = 2
kono
parents:
diff changeset
1353 and then Val.Den <= 3
kono
parents:
diff changeset
1354 and then Val.Den >= -16
kono
parents:
diff changeset
1355 then
kono
parents:
diff changeset
1356 if Val.Den = 1 then
kono
parents:
diff changeset
1357 T := Val.Num * (10 / 2);
kono
parents:
diff changeset
1358 UI_Write (T / 10, Decimal);
kono
parents:
diff changeset
1359 Write_Char ('.');
kono
parents:
diff changeset
1360 UI_Write (T mod 10, Decimal);
kono
parents:
diff changeset
1361
kono
parents:
diff changeset
1362 elsif Val.Den = 2 then
kono
parents:
diff changeset
1363 T := Val.Num * (100 / 4);
kono
parents:
diff changeset
1364 UI_Write (T / 100, Decimal);
kono
parents:
diff changeset
1365 Write_Char ('.');
kono
parents:
diff changeset
1366 UI_Write (T mod 100 / 10, Decimal);
kono
parents:
diff changeset
1367
kono
parents:
diff changeset
1368 if T mod 10 /= 0 then
kono
parents:
diff changeset
1369 UI_Write (T mod 10, Decimal);
kono
parents:
diff changeset
1370 end if;
kono
parents:
diff changeset
1371
kono
parents:
diff changeset
1372 elsif Val.Den = 3 then
kono
parents:
diff changeset
1373 T := Val.Num * (1000 / 8);
kono
parents:
diff changeset
1374 UI_Write (T / 1000, Decimal);
kono
parents:
diff changeset
1375 Write_Char ('.');
kono
parents:
diff changeset
1376 UI_Write (T mod 1000 / 100, Decimal);
kono
parents:
diff changeset
1377
kono
parents:
diff changeset
1378 if T mod 100 /= 0 then
kono
parents:
diff changeset
1379 UI_Write (T mod 100 / 10, Decimal);
kono
parents:
diff changeset
1380
kono
parents:
diff changeset
1381 if T mod 10 /= 0 then
kono
parents:
diff changeset
1382 UI_Write (T mod 10, Decimal);
kono
parents:
diff changeset
1383 end if;
kono
parents:
diff changeset
1384 end if;
kono
parents:
diff changeset
1385
kono
parents:
diff changeset
1386 else
kono
parents:
diff changeset
1387 UI_Write (Val.Num * (Uint_2 ** (-Val.Den)), Decimal);
kono
parents:
diff changeset
1388 Write_Str (".0");
kono
parents:
diff changeset
1389 end if;
kono
parents:
diff changeset
1390
kono
parents:
diff changeset
1391 -- Constants in base 10 or 16 can be written in normal Ada literal
kono
parents:
diff changeset
1392 -- style, as long as they fit in the UI_Image_Buffer. Using hexadecimal
kono
parents:
diff changeset
1393 -- notation, 4 bytes are required for the 16# # part, and every fifth
kono
parents:
diff changeset
1394 -- character is an underscore. So, a buffer of size N has room for
kono
parents:
diff changeset
1395 -- ((N - 4) - (N - 4) / 5) * 4 bits,
kono
parents:
diff changeset
1396 -- or at least
kono
parents:
diff changeset
1397 -- N * 16 / 5 - 12 bits.
kono
parents:
diff changeset
1398
kono
parents:
diff changeset
1399 elsif (Val.Rbase = 10 or else Val.Rbase = 16)
kono
parents:
diff changeset
1400 and then Num_Bits (Val.Num) < UI_Image_Buffer'Length * 16 / 5 - 12
kono
parents:
diff changeset
1401 then
kono
parents:
diff changeset
1402 pragma Assert (Val.Den /= 0);
kono
parents:
diff changeset
1403
kono
parents:
diff changeset
1404 -- Use fixed-point format for small scaling values
kono
parents:
diff changeset
1405
kono
parents:
diff changeset
1406 if (Val.Rbase = 10 and then Val.Den < 0 and then Val.Den > -3)
kono
parents:
diff changeset
1407 or else (Val.Rbase = 16 and then Val.Den = -1)
kono
parents:
diff changeset
1408 then
kono
parents:
diff changeset
1409 UI_Write (Val.Num * Val.Rbase**(-Val.Den), Decimal);
kono
parents:
diff changeset
1410 Write_Str (".0");
kono
parents:
diff changeset
1411
kono
parents:
diff changeset
1412 -- Write hexadecimal constants in exponential notation with a zero
kono
parents:
diff changeset
1413 -- unit digit. This matches the Ada canonical form for floating point
kono
parents:
diff changeset
1414 -- numbers, and also ensures that the underscores end up in the
kono
parents:
diff changeset
1415 -- correct place.
kono
parents:
diff changeset
1416
kono
parents:
diff changeset
1417 elsif Val.Rbase = 16 then
kono
parents:
diff changeset
1418 UI_Image (Val.Num, Hex);
kono
parents:
diff changeset
1419 pragma Assert (Val.Rbase = 16);
kono
parents:
diff changeset
1420
kono
parents:
diff changeset
1421 Write_Str ("16#0.");
kono
parents:
diff changeset
1422 Write_Str (UI_Image_Buffer (4 .. UI_Image_Length));
kono
parents:
diff changeset
1423
kono
parents:
diff changeset
1424 -- For exponent, exclude 16# # and underscores from length
kono
parents:
diff changeset
1425
kono
parents:
diff changeset
1426 UI_Image_Length := UI_Image_Length - 4;
kono
parents:
diff changeset
1427 UI_Image_Length := UI_Image_Length - UI_Image_Length / 5;
kono
parents:
diff changeset
1428
kono
parents:
diff changeset
1429 Write_Char ('E');
kono
parents:
diff changeset
1430 UI_Write (Int (UI_Image_Length) - Val.Den, Decimal);
kono
parents:
diff changeset
1431
kono
parents:
diff changeset
1432 elsif Val.Den = 1 then
kono
parents:
diff changeset
1433 UI_Write (Val.Num / 10, Decimal);
kono
parents:
diff changeset
1434 Write_Char ('.');
kono
parents:
diff changeset
1435 UI_Write (Val.Num mod 10, Decimal);
kono
parents:
diff changeset
1436
kono
parents:
diff changeset
1437 elsif Val.Den = 2 then
kono
parents:
diff changeset
1438 UI_Write (Val.Num / 100, Decimal);
kono
parents:
diff changeset
1439 Write_Char ('.');
kono
parents:
diff changeset
1440 UI_Write (Val.Num / 10 mod 10, Decimal);
kono
parents:
diff changeset
1441 UI_Write (Val.Num mod 10, Decimal);
kono
parents:
diff changeset
1442
kono
parents:
diff changeset
1443 -- Else use decimal exponential format
kono
parents:
diff changeset
1444
kono
parents:
diff changeset
1445 else
kono
parents:
diff changeset
1446 -- Write decimal constants with a non-zero unit digit. This
kono
parents:
diff changeset
1447 -- matches usual scientific notation.
kono
parents:
diff changeset
1448
kono
parents:
diff changeset
1449 UI_Image (Val.Num, Decimal);
kono
parents:
diff changeset
1450 Write_Char (UI_Image_Buffer (1));
kono
parents:
diff changeset
1451 Write_Char ('.');
kono
parents:
diff changeset
1452
kono
parents:
diff changeset
1453 if UI_Image_Length = 1 then
kono
parents:
diff changeset
1454 Write_Char ('0');
kono
parents:
diff changeset
1455 else
kono
parents:
diff changeset
1456 Write_Str (UI_Image_Buffer (2 .. UI_Image_Length));
kono
parents:
diff changeset
1457 end if;
kono
parents:
diff changeset
1458
kono
parents:
diff changeset
1459 Write_Char ('E');
kono
parents:
diff changeset
1460 UI_Write (Int (UI_Image_Length - 1) - Val.Den, Decimal);
kono
parents:
diff changeset
1461 end if;
kono
parents:
diff changeset
1462
kono
parents:
diff changeset
1463 -- Constants in a base other than 10 can still be easily written in
kono
parents:
diff changeset
1464 -- normal Ada literal style if the numerator is one.
kono
parents:
diff changeset
1465
kono
parents:
diff changeset
1466 elsif Val.Rbase /= 0 and then Val.Num = 1 then
kono
parents:
diff changeset
1467 Write_Int (Val.Rbase);
kono
parents:
diff changeset
1468 Write_Str ("#1.0#E");
kono
parents:
diff changeset
1469 UI_Write (-Val.Den);
kono
parents:
diff changeset
1470
kono
parents:
diff changeset
1471 -- Other constants with a base other than 10 are written using one of
kono
parents:
diff changeset
1472 -- the following forms, depending on the sign of the number and the
kono
parents:
diff changeset
1473 -- sign of the exponent (= minus denominator value). See that we are
kono
parents:
diff changeset
1474 -- replacing the division by a multiplication (updating accordingly the
kono
parents:
diff changeset
1475 -- sign of the exponent) to generate an expression whose computation
kono
parents:
diff changeset
1476 -- does not cause a division by 0 when base**exponent is very small.
kono
parents:
diff changeset
1477
kono
parents:
diff changeset
1478 -- numerator.0*base**exponent
kono
parents:
diff changeset
1479 -- numerator.0*base**-exponent
kono
parents:
diff changeset
1480
kono
parents:
diff changeset
1481 -- And of course an exponent of 0 can be omitted.
kono
parents:
diff changeset
1482
kono
parents:
diff changeset
1483 elsif Val.Rbase /= 0 then
kono
parents:
diff changeset
1484 if Brackets then
kono
parents:
diff changeset
1485 Write_Char ('[');
kono
parents:
diff changeset
1486 end if;
kono
parents:
diff changeset
1487
kono
parents:
diff changeset
1488 UI_Write (Val.Num, Decimal);
kono
parents:
diff changeset
1489 Write_Str (".0");
kono
parents:
diff changeset
1490
kono
parents:
diff changeset
1491 if Val.Den /= 0 then
kono
parents:
diff changeset
1492 Write_Char ('*');
kono
parents:
diff changeset
1493 Write_Int (Val.Rbase);
kono
parents:
diff changeset
1494 Write_Str ("**");
kono
parents:
diff changeset
1495
kono
parents:
diff changeset
1496 if Val.Den <= 0 then
kono
parents:
diff changeset
1497 UI_Write (-Val.Den, Decimal);
kono
parents:
diff changeset
1498 else
kono
parents:
diff changeset
1499 Write_Str ("(-");
kono
parents:
diff changeset
1500 UI_Write (Val.Den, Decimal);
kono
parents:
diff changeset
1501 Write_Char (')');
kono
parents:
diff changeset
1502 end if;
kono
parents:
diff changeset
1503 end if;
kono
parents:
diff changeset
1504
kono
parents:
diff changeset
1505 if Brackets then
kono
parents:
diff changeset
1506 Write_Char (']');
kono
parents:
diff changeset
1507 end if;
kono
parents:
diff changeset
1508
kono
parents:
diff changeset
1509 -- Rationals where numerator is divisible by denominator can be output
kono
parents:
diff changeset
1510 -- as literals after we do the division. This includes the common case
kono
parents:
diff changeset
1511 -- where the denominator is 1.
kono
parents:
diff changeset
1512
kono
parents:
diff changeset
1513 elsif Val.Num mod Val.Den = 0 then
kono
parents:
diff changeset
1514 UI_Write (Val.Num / Val.Den, Decimal);
kono
parents:
diff changeset
1515 Write_Str (".0");
kono
parents:
diff changeset
1516
kono
parents:
diff changeset
1517 -- Other non-based (rational) constants are written in num/den style
kono
parents:
diff changeset
1518
kono
parents:
diff changeset
1519 else
kono
parents:
diff changeset
1520 if Brackets then
kono
parents:
diff changeset
1521 Write_Char ('[');
kono
parents:
diff changeset
1522 end if;
kono
parents:
diff changeset
1523
kono
parents:
diff changeset
1524 UI_Write (Val.Num, Decimal);
kono
parents:
diff changeset
1525 Write_Str (".0/");
kono
parents:
diff changeset
1526 UI_Write (Val.Den, Decimal);
kono
parents:
diff changeset
1527 Write_Str (".0");
kono
parents:
diff changeset
1528
kono
parents:
diff changeset
1529 if Brackets then
kono
parents:
diff changeset
1530 Write_Char (']');
kono
parents:
diff changeset
1531 end if;
kono
parents:
diff changeset
1532 end if;
kono
parents:
diff changeset
1533 end UR_Write;
kono
parents:
diff changeset
1534
kono
parents:
diff changeset
1535 -------------
kono
parents:
diff changeset
1536 -- Ureal_0 --
kono
parents:
diff changeset
1537 -------------
kono
parents:
diff changeset
1538
kono
parents:
diff changeset
1539 function Ureal_0 return Ureal is
kono
parents:
diff changeset
1540 begin
kono
parents:
diff changeset
1541 return UR_0;
kono
parents:
diff changeset
1542 end Ureal_0;
kono
parents:
diff changeset
1543
kono
parents:
diff changeset
1544 -------------
kono
parents:
diff changeset
1545 -- Ureal_1 --
kono
parents:
diff changeset
1546 -------------
kono
parents:
diff changeset
1547
kono
parents:
diff changeset
1548 function Ureal_1 return Ureal is
kono
parents:
diff changeset
1549 begin
kono
parents:
diff changeset
1550 return UR_1;
kono
parents:
diff changeset
1551 end Ureal_1;
kono
parents:
diff changeset
1552
kono
parents:
diff changeset
1553 -------------
kono
parents:
diff changeset
1554 -- Ureal_2 --
kono
parents:
diff changeset
1555 -------------
kono
parents:
diff changeset
1556
kono
parents:
diff changeset
1557 function Ureal_2 return Ureal is
kono
parents:
diff changeset
1558 begin
kono
parents:
diff changeset
1559 return UR_2;
kono
parents:
diff changeset
1560 end Ureal_2;
kono
parents:
diff changeset
1561
kono
parents:
diff changeset
1562 --------------
kono
parents:
diff changeset
1563 -- Ureal_10 --
kono
parents:
diff changeset
1564 --------------
kono
parents:
diff changeset
1565
kono
parents:
diff changeset
1566 function Ureal_10 return Ureal is
kono
parents:
diff changeset
1567 begin
kono
parents:
diff changeset
1568 return UR_10;
kono
parents:
diff changeset
1569 end Ureal_10;
kono
parents:
diff changeset
1570
kono
parents:
diff changeset
1571 ---------------
kono
parents:
diff changeset
1572 -- Ureal_100 --
kono
parents:
diff changeset
1573 ---------------
kono
parents:
diff changeset
1574
kono
parents:
diff changeset
1575 function Ureal_100 return Ureal is
kono
parents:
diff changeset
1576 begin
kono
parents:
diff changeset
1577 return UR_100;
kono
parents:
diff changeset
1578 end Ureal_100;
kono
parents:
diff changeset
1579
kono
parents:
diff changeset
1580 -----------------
kono
parents:
diff changeset
1581 -- Ureal_10_36 --
kono
parents:
diff changeset
1582 -----------------
kono
parents:
diff changeset
1583
kono
parents:
diff changeset
1584 function Ureal_10_36 return Ureal is
kono
parents:
diff changeset
1585 begin
kono
parents:
diff changeset
1586 return UR_10_36;
kono
parents:
diff changeset
1587 end Ureal_10_36;
kono
parents:
diff changeset
1588
kono
parents:
diff changeset
1589 ----------------
kono
parents:
diff changeset
1590 -- Ureal_2_80 --
kono
parents:
diff changeset
1591 ----------------
kono
parents:
diff changeset
1592
kono
parents:
diff changeset
1593 function Ureal_2_80 return Ureal is
kono
parents:
diff changeset
1594 begin
kono
parents:
diff changeset
1595 return UR_2_80;
kono
parents:
diff changeset
1596 end Ureal_2_80;
kono
parents:
diff changeset
1597
kono
parents:
diff changeset
1598 -----------------
kono
parents:
diff changeset
1599 -- Ureal_2_128 --
kono
parents:
diff changeset
1600 -----------------
kono
parents:
diff changeset
1601
kono
parents:
diff changeset
1602 function Ureal_2_128 return Ureal is
kono
parents:
diff changeset
1603 begin
kono
parents:
diff changeset
1604 return UR_2_128;
kono
parents:
diff changeset
1605 end Ureal_2_128;
kono
parents:
diff changeset
1606
kono
parents:
diff changeset
1607 -------------------
kono
parents:
diff changeset
1608 -- Ureal_2_M_80 --
kono
parents:
diff changeset
1609 -------------------
kono
parents:
diff changeset
1610
kono
parents:
diff changeset
1611 function Ureal_2_M_80 return Ureal is
kono
parents:
diff changeset
1612 begin
kono
parents:
diff changeset
1613 return UR_2_M_80;
kono
parents:
diff changeset
1614 end Ureal_2_M_80;
kono
parents:
diff changeset
1615
kono
parents:
diff changeset
1616 -------------------
kono
parents:
diff changeset
1617 -- Ureal_2_M_128 --
kono
parents:
diff changeset
1618 -------------------
kono
parents:
diff changeset
1619
kono
parents:
diff changeset
1620 function Ureal_2_M_128 return Ureal is
kono
parents:
diff changeset
1621 begin
kono
parents:
diff changeset
1622 return UR_2_M_128;
kono
parents:
diff changeset
1623 end Ureal_2_M_128;
kono
parents:
diff changeset
1624
kono
parents:
diff changeset
1625 ----------------
kono
parents:
diff changeset
1626 -- Ureal_Half --
kono
parents:
diff changeset
1627 ----------------
kono
parents:
diff changeset
1628
kono
parents:
diff changeset
1629 function Ureal_Half return Ureal is
kono
parents:
diff changeset
1630 begin
kono
parents:
diff changeset
1631 return UR_Half;
kono
parents:
diff changeset
1632 end Ureal_Half;
kono
parents:
diff changeset
1633
kono
parents:
diff changeset
1634 ---------------
kono
parents:
diff changeset
1635 -- Ureal_M_0 --
kono
parents:
diff changeset
1636 ---------------
kono
parents:
diff changeset
1637
kono
parents:
diff changeset
1638 function Ureal_M_0 return Ureal is
kono
parents:
diff changeset
1639 begin
kono
parents:
diff changeset
1640 return UR_M_0;
kono
parents:
diff changeset
1641 end Ureal_M_0;
kono
parents:
diff changeset
1642
kono
parents:
diff changeset
1643 -------------------
kono
parents:
diff changeset
1644 -- Ureal_M_10_36 --
kono
parents:
diff changeset
1645 -------------------
kono
parents:
diff changeset
1646
kono
parents:
diff changeset
1647 function Ureal_M_10_36 return Ureal is
kono
parents:
diff changeset
1648 begin
kono
parents:
diff changeset
1649 return UR_M_10_36;
kono
parents:
diff changeset
1650 end Ureal_M_10_36;
kono
parents:
diff changeset
1651
kono
parents:
diff changeset
1652 -----------------
kono
parents:
diff changeset
1653 -- Ureal_Tenth --
kono
parents:
diff changeset
1654 -----------------
kono
parents:
diff changeset
1655
kono
parents:
diff changeset
1656 function Ureal_Tenth return Ureal is
kono
parents:
diff changeset
1657 begin
kono
parents:
diff changeset
1658 return UR_Tenth;
kono
parents:
diff changeset
1659 end Ureal_Tenth;
kono
parents:
diff changeset
1660
kono
parents:
diff changeset
1661 end Urealp;