[Ada] Small tweaks to couple of Value routines
gcc/ada/ * libgnat/s-valuef.adb (Integer_To_Fixed): Take into account the extra digit when scaling up the input. * libgnat/s-valuer.adb (Scan_Decimal_Digits): Restrict previous change to fixed-point types. (Scan_Integral_Digits): Likewise.
This commit is contained in:
parent
4e6b87e933
commit
def0e5b83d
@ -227,8 +227,9 @@ package body System.Value_F is
|
||||
Z := N;
|
||||
|
||||
for J in 1 .. LS loop
|
||||
if V <= Uns'Last / Uns (B) then
|
||||
V := V * Uns (B);
|
||||
if V <= (Uns'Last - E) / Uns (B) then
|
||||
V := V * Uns (B) + E;
|
||||
E := 0;
|
||||
else
|
||||
Bad_Value (Str);
|
||||
end if;
|
||||
|
@ -188,11 +188,13 @@ package body System.Value_R is
|
||||
|
||||
-- If precision limit has been reached, just ignore any remaining
|
||||
-- digits for the computation of Value and Scale, but store the
|
||||
-- first in Extra and use the second to round Extra. The scanning
|
||||
-- should continue only to assess the validity of the string.
|
||||
-- first in Extra and use the second to round Extra if this is for
|
||||
-- a fixed-point type (we skip the rounding for a floating-point
|
||||
-- type to preserve backward compatibility). The scanning should
|
||||
-- continue only to assess the validity of the string.
|
||||
|
||||
if Precision_Limit_Reached then
|
||||
if Precision_Limit_Just_Reached then
|
||||
if Precision_Limit_Just_Reached and then not Floating then
|
||||
if Digit >= Base / 2 then
|
||||
if Extra = Base - 1 then
|
||||
Extra := 0;
|
||||
@ -343,14 +345,16 @@ package body System.Value_R is
|
||||
end if;
|
||||
|
||||
-- If precision limit has been reached, just ignore any remaining
|
||||
-- digits for the computation of Value, but update Scale and store
|
||||
-- the first in Extra and use the second to round Extra. The scanning
|
||||
-- should continue only to assess the validity of the string.
|
||||
-- digits for the computation of Value and Scale, but store the
|
||||
-- first in Extra and use the second to round Extra if this is for
|
||||
-- a fixed-point type (we skip the rounding for a floating-point
|
||||
-- type to preserve backward compatibility). The scanning should
|
||||
-- continue only to assess the validity of the string.
|
||||
|
||||
if Precision_Limit_Reached then
|
||||
Scale := Scale + 1;
|
||||
|
||||
if Precision_Limit_Just_Reached then
|
||||
if Precision_Limit_Just_Reached and then not Floating then
|
||||
if Digit >= Base / 2 then
|
||||
if Extra = Base - 1 then
|
||||
Extra := 0;
|
||||
|
Loading…
Reference in New Issue
Block a user