mirror of https://github.com/ademakov/libjit
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
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.
|
|
|