--------------
function Is_Valid (Arg : Big_Real) return Boolean is
- (Is_Valid (Arg.Num) and then Is_Valid (Arg.Den));
+ (Is_Valid (Arg.Num) and Is_Valid (Arg.Den));
---------
-- "/" --
-- Numerator --
---------------
- function Numerator (Arg : Big_Real) return Big_Integer is (Arg.Num);
+ function Numerator (Arg : Big_Real) return Big_Integer is
+ (if Is_Valid (Arg.Num) then Arg.Num
+ else raise Constraint_Error with "invalid big real");
-----------------
-- Denominator --
-----------------
- function Denominator (Arg : Big_Real) return Big_Positive is (Arg.Den);
+ function Denominator (Arg : Big_Real) return Big_Positive is
+ (if Is_Valid (Arg.Den) then Arg.Den
+ else raise Constraint_Error with "invalid big real");
---------
-- "=" --
function "+" (L : Big_Real) return Big_Real is
Result : Big_Real;
begin
+ if not Is_Valid (L) then
+ raise Constraint_Error with "invalid big real";
+ end if;
+
Result.Num := L.Num;
Result.Den := L.Den;
return Result;
---------
function "-" (L : Big_Real) return Big_Real is
- (Num => -L.Num, Den => L.Den);
+ (if Is_Valid (L) then (Num => -L.Num, Den => L.Den)
+ else raise Constraint_Error with "invalid big real");
-----------
-- "abs" --
-----------
function "abs" (L : Big_Real) return Big_Real is
- (Num => abs L.Num, Den => L.Den);
+ (if Is_Valid (L) then (Num => abs L.Num, Den => L.Den)
+ else raise Constraint_Error with "invalid big real");
---------
-- "+" --
function "+" (L, R : Big_Real) return Big_Real is
Result : Big_Real;
begin
+ if not Is_Valid (L) or not Is_Valid (R) then
+ raise Constraint_Error with "invalid big real";
+ end if;
+
Result.Num := L.Num * R.Den + R.Num * L.Den;
Result.Den := L.Den * R.Den;
Normalize (Result);
function "-" (L, R : Big_Real) return Big_Real is
Result : Big_Real;
begin
+ if not Is_Valid (L) or not Is_Valid (R) then
+ raise Constraint_Error with "invalid big real";
+ end if;
+
Result.Num := L.Num * R.Den - R.Num * L.Den;
Result.Den := L.Den * R.Den;
Normalize (Result);
function "*" (L, R : Big_Real) return Big_Real is
Result : Big_Real;
begin
+ if not Is_Valid (L) or not Is_Valid (R) then
+ raise Constraint_Error with "invalid big real";
+ end if;
+
Result.Num := L.Num * R.Num;
Result.Den := L.Den * R.Den;
Normalize (Result);
function "/" (L, R : Big_Real) return Big_Real is
Result : Big_Real;
begin
+ if not Is_Valid (L) or not Is_Valid (R) then
+ raise Constraint_Error with "invalid big real";
+ end if;
+
Result.Num := L.Num * R.Den;
Result.Den := L.Den * R.Num;
Normalize (Result);
function "**" (L : Big_Real; R : Integer) return Big_Real is
Result : Big_Real;
begin
+ if not Is_Valid (L) then
+ raise Constraint_Error with "invalid big real";
+ end if;
+
if R = 0 then
Result.Num := To_Big_Integer (1);
Result.Den := To_Big_Integer (1);