diff options
Diffstat (limited to 'src/grt/grt-fcvt.ads')
-rw-r--r-- | src/grt/grt-fcvt.ads | 50 |
1 files changed, 47 insertions, 3 deletions
diff --git a/src/grt/grt-fcvt.ads b/src/grt/grt-fcvt.ads index 82ed94363..e1e272850 100644 --- a/src/grt/grt-fcvt.ads +++ b/src/grt/grt-fcvt.ads @@ -23,16 +23,60 @@ -- however invalidate any other reasons why the executable file might be -- covered by the GNU Public License. +-- IMPORTANT: this unit can also be used by the front-end, so it must NOT +-- depend on anything else from grt (except the grt parent package), including +-- grt.types. + with Interfaces; use Interfaces; package Grt.Fcvt is - -- Convert V to RADIX number stored (in ASCII) in STR/LEN [using at most + -- Convert V to 10-based number stored (in ASCII) in STR/LEN [using at most -- NDIGITS digits.] -- LEN is the number of characters needed (so it may be greater than -- STR'Length). -- Requires STR'First = 1. procedure To_String (Str : out String; Len : out Natural; - V : IEEE_Float_64; - Radix : Positive := 10); + V : IEEE_Float_64); + + -- Input format is [+-]int[.int][e[+-]int] + -- where int is digit { _ digit } + -- and [+-] means optional + or -. + -- The input string must be correctly formatted. + function From_String (Str : String) return IEEE_Float_64; + + -- Ad-hoc implementation of bignums, with the minimal features to support + -- radix conversion. + type Bignum is private; + + -- Compute L * R + CARRY_IN. + procedure Bignum_Mul_Int + (L : in out Bignum; R : Positive; Carry_In : Natural := 0); + + -- Multiply two bignums. + function Bignum_Mul (L, R : Bignum) return Bignum; + + -- Compute L**N + function Bignum_Pow (L : Natural; N : Natural) return Bignum; + + -- Create a bignum from a natural. + procedure Bignum_Int (Res : out Bignum; N : Natural); + + -- Convert N to RES. OK is set to True if the number fits in RES. + procedure Bignum_To_Int + (N : Bignum; Res : out Unsigned_64; OK : out Boolean); + + -- Return (-1)**Neg * F * BASE**EXP to a float. + function To_Float_64 + (Neg : Boolean; F : Bignum; Base : Positive; Exp : Integer) + return IEEE_Float_64; +private + type Unsigned_32_Array is array (Natural range <>) of Unsigned_32; + + type Bignum is record + -- Number of digits. Must be 0 for number 0. + N : Natural; + -- Digits. The leading digit V(N + 1) must not be 0. + V : Unsigned_32_Array (1 .. 37); + end record; end Grt.Fcvt; |