diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2021-03-03 20:15:42 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-06-16 04:43:04 -0400 |
commit | f4fe186bfe3e74c7c9b2d49b635565ea9a4df1b2 (patch) | |
tree | d05d7cef7094ef78e900aa25cd6e0749dc094ab8 /gcc | |
parent | 07b7dc09b21d1a2f000f2861a87b017b764b38b4 (diff) | |
download | gcc-f4fe186bfe3e74c7c9b2d49b635565ea9a4df1b2.zip gcc-f4fe186bfe3e74c7c9b2d49b635565ea9a4df1b2.tar.gz gcc-f4fe186bfe3e74c7c9b2d49b635565ea9a4df1b2.tar.bz2 |
[Ada] Fix floating-point exponentiation with Integer'First exponent
gcc/ada/
* urealp.adb (Scale): Change first paramter to Uint and adjust.
(Equivalent_Decimal_Exponent): Pass U.Den directly to Scale.
* libgnat/s-exponr.adb (Negative): Rename to...
(Safe_Negative): ...this and change its lower bound.
(Exponr): Adjust to above renaming and deal with Integer'First.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/libgnat/s-exponr.adb | 9 | ||||
-rw-r--r-- | gcc/ada/urealp.adb | 10 |
2 files changed, 10 insertions, 9 deletions
diff --git a/gcc/ada/libgnat/s-exponr.adb b/gcc/ada/libgnat/s-exponr.adb index ece53b5..ad7f401 100644 --- a/gcc/ada/libgnat/s-exponr.adb +++ b/gcc/ada/libgnat/s-exponr.adb @@ -57,8 +57,8 @@ function System.Exponr (Left : Num; Right : Integer) return Num is subtype Double_T is Double_Real.Double_T; -- The double floating-point type - subtype Negative is Integer range Integer'First .. -1; - -- The range of negative exponents + subtype Safe_Negative is Integer range Integer'First + 1 .. -1; + -- The range of safe negative exponents function Expon (Left : Num; Right : Natural) return Num; -- Routine used if Right is greater than 4 @@ -113,9 +113,12 @@ begin return Num'Machine (Sqr * Sqr); end; - when Negative => + when Safe_Negative => return Num'Machine (1.0 / Exponr (Left, -Right)); + when Integer'First => + return Num'Machine (1.0 / (Exponr (Left, Integer'Last) * Left)); + when others => return Num'Machine (Expon (Left, Right)); end case; diff --git a/gcc/ada/urealp.adb b/gcc/ada/urealp.adb index 59d5c08..0f57043 100644 --- a/gcc/ada/urealp.adb +++ b/gcc/ada/urealp.adb @@ -270,23 +270,21 @@ package body Urealp is 15 => (Num => 53_385_559, Den => 45_392_361), -- 1.176091259055681 16 => (Num => 78_897_839, Den => 65_523_237)); -- 1.204119982655924 - function Scale (X : Int; R : Ratio) return Int; + function Scale (X : Uint; R : Ratio) return Int; -- Compute the value of X scaled by R ----------- -- Scale -- ----------- - function Scale (X : Int; R : Ratio) return Int is - type Wide_Int is range -2**63 .. 2**63 - 1; - + function Scale (X : Uint; R : Ratio) return Int is begin - return Int (Wide_Int (X) * Wide_Int (R.Num) / Wide_Int (R.Den)); + return UI_To_Int (X * R.Num / R.Den); end Scale; begin pragma Assert (U.Rbase /= 0); - return Scale (UI_To_Int (U.Den), Logs (U.Rbase)); + return Scale (U.Den, Logs (U.Rbase)); end Equivalent_Decimal_Exponent; ---------------- |