You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

110 lines
3.4 KiB

(*
* math.pas - Test mathematical operators.
*
* Copyright (C) 2004 Southern Storm Software, Pty Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*)
program coerce;
const
pi = 3.14159265358979323846;
var
failed: Boolean;
procedure run(msg: String; value: Boolean);
begin
Write(msg);
Write(" ... ");
if value then begin
WriteLn("ok");
end else begin
WriteLn("failed");
failed := True;
end;
end;
procedure runf(msg: String; value, expected, delta: ShortReal);
begin
run(msg, Abs(value - expected) <= delta);
end;
procedure rund(msg: String; value, expected, delta: Real);
begin
run(msg, Abs(value - expected) <= delta);
end;
procedure runn(msg: String; value, expected, delta: LongReal);
begin
run(msg, Abs(value - expected) <= delta);
end;
procedure run_tests;
var
b: Byte;
s: ShortInt;
f: ShortReal;
d: Real;
n: LongReal;
begin
{ Initialize some values of odd type sizes }
b := 3;
s := 67;
f := 24.0;
d := 56.0;
n := 123.5;
{ Test coercion rules for mathematical operators }
run("math_coerce_byte", SameType(LongReal, Sin(b)));
run("math_coerce_short", SameType(LongReal, Cos(s)));
run("math_coerce_int", SameType(LongReal, 3 pow 5));
run("math_coerce_uint", SameType(LongReal, Atan2(3, 080000005H)));
run("math_coerce_long", SameType(LongReal, Round(0100000000H)));
run("math_coerce_ulong", SameType(LongReal, Log(08000000000000000H)));
run("math_coerce_float32", SameType(ShortReal, Log10(f)));
run("math_coerce_float64", SameType(Real, Atan(d)));
run("math_coerce_nfloat", SameType(LongReal, Abs(n)));
{ Test that the operators give sane answers }
runf("math_sin_0", Sin(ShortReal(0.0)), ShortReal(0.0), 0.00001);
runf("math_sin_pi_2", Sin(ShortReal(pi / 2)), ShortReal(1.0), 0.00001);
f := ShortReal(pi);
runf("math_sin_pi", Sin(f), ShortReal(0.0), 0.00001);
runf("math_cos_0", Cos(ShortReal(0.0)), ShortReal(1.0), 0.00001);
runf("math_sqrt_1", Sqrt(ShortReal(1.0)), ShortReal(1.0), 0.00001);
runf("math_sqrt_2", Sqrt(ShortReal(2.0)), ShortReal(1.4142), 0.0001);
f := Sqrt(ShortReal(-1.0));
run("math_sqrt_m1", IsNaN(f));
rund("math_ceil_1.5", Ceil(Real(1.5)), Real(2.0), 0.00001);
rund("math_ceil_m1.5", Ceil(Real(-1.5)), Real(-1.0), 0.00001);
rund("math_floor_1.5", Floor(Real(1.5)), Real(1.0), 0.00001);
rund("math_floor_m1.5", Floor(Real(-1.5)), Real(-2.0), 0.00001);
rund("math_rint_1.5", Rint(Real(1.5)), Real(2.0), 0.00001);
rund("math_rint_2.5", Rint(Real(2.5)), Real(2.0), 0.00001);
rund("math_round_1.5", Round(Real(1.5)), Real(2.0), 0.00001);
rund("math_round_2.5", Round(Real(2.5)), Real(3.0), 0.00001);
runn("math_max_1_6", Max(1.0, 6.0), 6.0, 0.00001);
runn("math_min_1_6", Min(1.0, 6.0), 1.0, 0.00001);
end;
begin
failed := False;
run_tests;
if failed then begin
Terminate(1);
end;
end.