s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf.

2014-08-04  Robert Dewar  <dewar@adacore.com>

	* s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf.
	* s-fatgen.adb (Pred): Handle Float'First.
	(Succ): Handle Float'Last.

From-SVN: r213539
This commit is contained in:
Robert Dewar 2014-08-04 08:09:31 +00:00 committed by Arnaud Charlet
parent 98bf4cf497
commit 8616baee3a
3 changed files with 56 additions and 16 deletions

View File

@ -1,3 +1,9 @@
2014-08-04 Robert Dewar <dewar@adacore.com>
* s-imgrea.adb (Image_Floating_Point): Don't add space before +Inf.
* s-fatgen.adb (Pred): Handle Float'First.
(Succ): Handle Float'Last.
2014-08-04 Ed Schonberg <schonberg@adacore.com>
* sem_util.adb (Is_Potentially_Unevaluated): If the original

View File

@ -401,22 +401,37 @@ package body System.Fat_Gen is
-- 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);
@ -624,17 +639,14 @@ package body System.Fat_Gen is
-- 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;
@ -648,6 +660,27 @@ package body System.Fat_Gen is
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);

View File

@ -6,7 +6,7 @@
-- --
-- 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- --
@ -93,9 +93,10 @@ package body System.Img_Real is
-- 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) := ' ';