-- Pred --
----------
- -- Subtract from the given number a number equivalent to the value of its
- -- least significant bit. Given that the most significant bit represents
- -- a value of 1.0 * radix ** (exp - 1), the value we want is obtained by
- -- shifting this by (mantissa-1) bits to the right, i.e. decreasing the
- -- exponent by that amount.
-
- -- Zero has to be treated specially, since its exponent is zero
-
function Pred (X : T) return T is
X_Frac : T;
X_Exp : UI;
begin
+ -- Zero has to be treated specially, since its exponent is zero
+
if X = 0.0 then
return -Succ (X);
+ -- Special treatment for most negative number
+
+ elsif X = T'First then
+
+ -- If not generating infinities, we raise a constraint error
+
+ if T'Machine_Overflows then
+ raise Constraint_Error with "Pred of largest negative number";
+
+ -- Otherwise generate a negative infinity
+
+ else
+ return X / (X - X);
+ end if;
+
+ -- Subtract from the given number a number equivalent to the value
+ -- of its least significant bit. Given that the most significant bit
+ -- represents a value of 1.0 * radix ** (exp - 1), the value we want
+ -- is obtained by shifting this by (mantissa-1) bits to the right,
+ -- i.e. decreasing the exponent by that amount.
+
else
Decompose (X, X_Frac, X_Exp);
-- Succ --
----------
- -- Similar computation to that of Pred: find value of least significant
- -- bit of given number, and add. Zero has to be treated specially since
- -- the exponent can be zero, and also we want the smallest denormal if
- -- denormals are supported.
-
function Succ (X : T) return T is
X_Frac : T;
X_Exp : UI;
X1, X2 : T;
begin
+ -- Treat zero specially since it has a zero exponent
+
if X = 0.0 then
X1 := 2.0 ** T'Machine_Emin;
return X1;
+ -- Special treatment for largest positive number
+
+ elsif X = T'Last then
+
+ -- If not generating infinities, we raise a constraint error
+
+ if T'Machine_Overflows then
+ raise Constraint_Error with "Succ of largest negative number";
+
+ -- Otherwise generate a positive infinity
+
+ else
+ return X / (X - X);
+ end if;
+
+ -- Add to the given number a number equivalent to the value
+ -- of its least significant bit. Given that the most significant bit
+ -- represents a value of 1.0 * radix ** (exp - 1), the value we want
+ -- is obtained by shifting this by (mantissa-1) bits to the right,
+ -- i.e. decreasing the exponent by that amount.
+
else
Decompose (X, X_Frac, X_Exp);
-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- output of -0.0 on targets where this is the case). We can of
-- course still see a -0.0 on a target where Signed_Zeroes is
-- False (since this attribute refers to the proper handling of
- -- negative zeroes, not to their existence).
+ -- negative zeroes, not to their existence). We do not generate
+ -- a blank for positive infinity, since we output an explicit +.
- if not Is_Negative (V)
+ if (not Is_Negative (V) and then V <= Long_Long_Float'Last)
or else (not Long_Long_Float'Signed_Zeros and then V = -0.0)
then
S (1) := ' ';