aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-12-17 13:16:35 +0100
committerMarc Poulhiès <poulhies@adacore.com>2023-01-05 15:30:01 +0100
commit3f7776ea33a6ba9dac28bff8a521de04a728e19f (patch)
tree292ecead69d2a112dad860cbedb38980f379040b /gcc/ada
parent133a8e6339ff5d4c695cd1c4ee0f4958386d46bd (diff)
downloadgcc-3f7776ea33a6ba9dac28bff8a521de04a728e19f.zip
gcc-3f7776ea33a6ba9dac28bff8a521de04a728e19f.tar.gz
gcc-3f7776ea33a6ba9dac28bff8a521de04a728e19f.tar.bz2
ada: Do not use decimal approximation in -gnatRj output
This avoids an unnecessary loss of precision for real values. gcc/ada/ * repinfo.ads (The JSON output format): Document change. * urealp.adb (UR_Write_To_JSON): Output a fraction instead of a decimal approximation.
Diffstat (limited to 'gcc/ada')
-rw-r--r--gcc/ada/repinfo.ads4
-rw-r--r--gcc/ada/urealp.adb39
2 files changed, 15 insertions, 28 deletions
diff --git a/gcc/ada/repinfo.ads b/gcc/ada/repinfo.ads
index 6462407..f9200ee 100644
--- a/gcc/ada/repinfo.ads
+++ b/gcc/ada/repinfo.ads
@@ -196,8 +196,8 @@ package Repinfo is
-- "Object_Size" : numerical expression
-- "Value_Size" : numerical expression
-- "Component_Size" : numerical expression
- -- "Range" : array of numbers
- -- "Small" : number
+ -- "Range" : array of numerical expressions
+ -- "Small" : numerical expression
-- "Alignment" : number
-- "Convention" : string
-- "Linker_Section" : string
diff --git a/gcc/ada/urealp.adb b/gcc/ada/urealp.adb
index 8305207..37bf3a7 100644
--- a/gcc/ada/urealp.adb
+++ b/gcc/ada/urealp.adb
@@ -1518,14 +1518,11 @@ package body Urealp is
-- UR_Write_To_JSON --
----------------------
- -- We defer to the implementation of UR_Write in all cases, either directly
- -- for values that are naturally written in a JSON compatible format, or by
- -- first computing a decimal approximation for other values.
+ -- We defer to the implementation of UR_Write for values that are naturally
+ -- written in a JSON compatible format and write a fraction for the others.
procedure UR_Write_To_JSON (Real : Ureal) is
- Val : constant Ureal_Entry := Ureals.Table (Real);
- Imrk : constant Uintp.Save_Mark := Mark;
- Rmrk : constant Urealp.Save_Mark := Mark;
+ Val : constant Ureal_Entry := Ureals.Table (Real);
T : Ureal;
@@ -1561,31 +1558,21 @@ package body Urealp is
elsif Val.Rbase = 0 and then Val.Num mod Val.Den = 0 then
T := Real;
- -- For other constants, compute an approximation in base 10
+ -- Other non-based (rational) constants are written in num/den style
else
- declare
- A : constant Ureal := UR_Abs (Real);
- -- The absolute value
-
- E : constant Uint :=
- (if A < Ureal_1
- then UI_From_Int (3 - Decimal_Exponent_Lo (Real))
- else Uint_3);
- -- The exponent for at least 3 digits after the decimal point
-
- Num : constant Uint :=
- UR_To_Uint (UR_Mul (A, UR_Exponentiate (Ureal_10, E)));
- -- The numerator appropriately rounded
-
- begin
- T := UR_From_Components (Num, E, 10, Val.Negative);
- end;
+ Write_Str ("{ ""code"": ""/"", ""operands"": [ ");
+ if Val.Negative then
+ Write_Char ('-');
+ end if;
+ UI_Write (Val.Num, Decimal);
+ Write_Str (".0, ");
+ UI_Write (Val.Den, Decimal);
+ Write_Str (".0 ] }");
+ return;
end if;
UR_Write (T);
- Release (Imrk);
- Release (Rmrk);
end UR_Write_To_JSON;
-------------