File : numerics.adb


with Reps.IO;
use Reps.IO;

package body Numerics is

  NumZero: constant Numeric := 0.0;
  NumTwo:  constant Numeric := 2.0;

  function Scal(K: Integer) return Numeric is
  begin
    return Numeric(K);
  end Scal;

  function Scal(R: Rep) return Numeric is
  begin
    return Numeric(R);
  end Scal;

  function Approx(N: Numeric) return Rep is
  begin
    return Rep(N);
  end Approx;

  function IsZero(S: Numeric) return Boolean is
  begin
    return S=NumZero;
  end IsZero;

  procedure SetZero(S: out Numeric) is
  begin
    S := NumZero;
  end SetZero;

  function Average(S,T: Numeric) return Numeric is
  begin
    return (S+T)/NumTwo;
  end Average;

  function Disk(R1,R2: Rep) return Numeric is
  begin
    return Numeric(R1+R2)/NumTwo;
  end Disk;

  function MaxNorm(S: Numeric) return Radius is
  begin
    return Radius(abs(S));
  end MaxNorm;

  function Contains(S,T: Numeric) return Boolean is
  begin
    return S=T;
  end Contains;

  procedure Mult(K: in Integer; S: in out Numeric) is
  begin
    S := Scal(K)*S;
  end Mult;

  procedure Prod(K: in Integer; S: in Numeric; T: out Numeric) is
  begin
    T := Scal(K)*S;
  end Prod;

  function "*"(K: Integer; S: Numeric) return Numeric is
  begin
    return Scal(K)*S;
  end "*";

  procedure MultAdd(K: in Integer; S: in Numeric; T: in out Numeric) is
  begin
    T := T+Scal(K)*S;
  end MultAdd;

  procedure Mult(R: in Rep; S: in out Numeric) is
  begin
    S := Numeric(R)*S;
  end Mult;

  procedure Prod(R: in Rep; S1: in Numeric; S2: out Numeric) is
  begin
    S2 := Numeric(R)*S1;
  end Prod;

  function "*"(R: Rep; S: Numeric) return Numeric is
  begin
    return Numeric(R)*S;
  end "*";

  procedure MultAdd(R: in Rep; S1: in Numeric; S2: in out Numeric) is
  begin
    S2 := S2+Numeric(R)*S1;
  end MultAdd;

  function "/"(S: Numeric; R: Rep) return Numeric is
  begin
    return S/Numeric(R);
  end "/";

  function ReturnTrue(S: Numeric) return Boolean is
  begin
    return True;
  end ReturnTrue;

  function ReturnZero(S: Numeric) return Numeric is
  begin
    return NumZero;
  end ReturnZero;

  function ReturnZero(R: Rep) return Numeric is
  begin
    return NumZero;
  end ReturnZero;

  function Identity(S: Numeric) return Numeric is
  begin
    return S;
  end Identity;

  procedure ZeroOut(S: in out Numeric) is
  begin
    S := NumZero;
  end ZeroOut;

---------------------------

  procedure Neg(S: in out Numeric) is
  begin
    S := -S;
  end Neg;

  procedure Neg(S: in Numeric; T: out Numeric) is
  begin
    T := -S;
  end Neg;

  procedure Add(S: in Numeric; T: in out Numeric) is
  begin
    T := S+T;
  end Add;

  procedure Sum(S,T: in Numeric; P: out Numeric) is
  begin
     P := S+T;
  end Sum;

  procedure Sub(S: in Numeric; T: in out Numeric) is
  begin
    T := T-S;
  end Sub;

  procedure Diff(S,T: in Numeric; P: out Numeric) is
  begin
    P := S-T;
  end Diff;

  procedure Mult(S: in Numeric; T: in out Numeric) is
  begin
    T := S*T;
  end Mult;

  procedure Prod(S,T: in Numeric; P: out Numeric) is
  begin
     P := S*T;
  end Prod;

  procedure MultAdd(S,T: in Numeric; P: in out Numeric) is
  begin
    P := P+S*T;
  end MultAdd;

  function Sqr(S: Numeric) return Numeric is
  begin
    return S*S;
  end Sqr;

  function Inv(S: Numeric) return Numeric is
  begin
    return Scal(One)/S;
  end Inv;

  procedure Div(S: in Numeric; T: in out Numeric) is
  begin
    T := T/S;
  end Div;

---------------------------

  procedure ShowType(S: in Numeric) is
  begin
    Show0("Scalar type is Numeric");
  end ShowType;

  procedure Show1(N: in String; S: in Numeric) is
  begin
    Show1(N,Rep(S));
  end Show1;

  procedure Show2(N: in String; S1,S2: in Numeric) is
  begin
    Show2(N,Rep(S1),Rep(S2));
  end Show2;

  procedure Get(F: in File_Type; S: out Numeric; Decimal: in Boolean := True) is
    R1: Rep;
  begin
    Get(F,R1,Decimal);
    S := Numeric(R1);
  end Get;

  procedure Put(F: in File_Type; S: in Numeric; Decimal: in Boolean := True) is
  begin
    Put(F,Rep(S),Decimal);
  end Put;

  procedure UpMultAdd(R1,R2: in Rep; R3: in out Rep) is
  begin
    raise Undefined;
  end UpMultAdd;

end Numerics;