{ Definiciones Corrientes para uso en matem ticas }
unit xMatDefs;

{$MODE Delphi}

interface

type
	NReal = extended;
	real= double;


{ Las siguientes constantes son calculadas en el auto-arranque de
la unidad por lo que no es aconsejable utilizarlas en los procedimientos
de auto-arranque de otras unidades pues de hacerlo habrá que tener
}
var
	AsumaCero: double; {EPSILON de la maquina en cuentas con NReal }
	DosPi: double;		{ 2*Pi }

{ abs(x) < AsumaCero }
function EsCero( x: NReal ): boolean;

{ Casi0:= Abs(x)< xCero.
	xCero debe ser un numero positivo }
function Casi0( x: NReal; xCero: NReal): boolean;

implementation

function EsCero( x: NReal ): boolean;
begin
	EsCero := Abs(x) < AsumaCero;
end;

function Casi0( x: NReal; xCero: NReal): boolean;
begin
	Casi0:= abs(x) < xCero;
end;


function calceps:NReal;
{calceps
  This function returns the machine EPSILON or floating point tolerance,
  the smallest positive real number such that 1.0 + EPSILON > 1.0.
  EPSILON is needed to set various tolerances for different algorithms.
  While it could be entered as a constant, I prefer to calculate it, since
  users tend to move software between machines without paying attention to
  the computing environment. Note that more complete routines exist.
}
var
  e,e0: NReal;
  i: integer;
begin {calculate machine epsilon}
  e0 := 1; i:=0;
  repeat
    e0 := e0/2; e := 1+e0;  i := i+1;
  until (e=1.0) or (i=50000); {note safety check}
  e0 := e0*2;
{ Writeln('Machine EPSILON =',e0);}
  calceps:=e0;
end; {calceps}

begin
	AsumaCero:= CalcEps;
	DosPi:= 2*Pi;	
end.