procedure rprod(var x1,x2,x3: hreal);
var
  k,n: integer;
  j,carry: integer32;
begin { rprod }
  trunc:=false;
  if (x1.si=0) or (x2.si=0) then x3.si:=0
  else begin
    if x1.si=x2.si then x3.si:=1 else x3.si:=-1;
    with x1 do begin  
      carry:=0;
      for k:=2*hdim downto hdim+1 do begin
        j:=carry;
        carry:=0;
        for n:=k-hdim to hdim do begin
          j:=j+ma[n]*x2.ma[k-n];
          carry:=carry+(j div 10000);
          j:=j mod 10000;
        end;
        if not trunc then trunc:=(j>0);
      end;
      for k:=hdim downto 0 do begin
        j:=carry;
        carry:=0;
        for n:=0 to k do begin
          j:=j+ma[n]*x2.ma[k-n];
          carry:=carry+(j div 10000);
          j:=j mod 10000;
        end;
        x3.ma[k]:=j;
      end;
    end;
    with x3 do begin
      if carry=0 then ex:=x1.ex+x2.ex
      else begin
        if not trunc then trunc:=(ma[hdim]>0);
        for n:=hdim downto 1 do ma[n]:=ma[n-1];
        ma[0]:=carry;
        ex:=x1.ex+x2.ex+1;
      end;
      if abs(ex)>exmax then begin
        if ex<0 then underflow:=true else overflow:=true;
      end;
    end;
  end;
end { rprod };

