36 lines
1.1 KiB
ObjectPascal
36 lines
1.1 KiB
ObjectPascal
|
|
program integerness(output);
|
|||
|
|
|
|||
|
|
{ determines whether a `complex` also fits in `integer` ---------------- }
|
|||
|
|
function isRealIntegral(protected x: complex): Boolean;
|
|||
|
|
begin
|
|||
|
|
{ It constitutes an error if no value for `trunc(x)` exists, }
|
|||
|
|
{ thus check re(x) is in the range -maxInt..maxInt first. }
|
|||
|
|
isRealIntegral := (im(x) = 0.0) and_then
|
|||
|
|
(abs(re(x)) <= maxInt * 1.0) and_then
|
|||
|
|
(trunc(re(x)) * 1.0 = re(x))
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
{ calls isRealIntegral with zero imaginary part ------------------------ }
|
|||
|
|
function isIntegral(protected x: real): Boolean;
|
|||
|
|
begin
|
|||
|
|
isIntegral := isRealIntegral(cmplx(x * 1.0, 0.0))
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
{ Rosetta code test ---------------------------------------------------- }
|
|||
|
|
procedure test(protected x: complex);
|
|||
|
|
begin
|
|||
|
|
writeLn(re(x), ' + ', im(x), ' 𝒾 : ',
|
|||
|
|
isIntegral(re(x)), ' ', isRealIntegral(x))
|
|||
|
|
end;
|
|||
|
|
|
|||
|
|
{ === MAIN ============================================================= }
|
|||
|
|
begin
|
|||
|
|
test(cmplx(25.0, 0.0));
|
|||
|
|
test(cmplx(24.999999, 0.0));
|
|||
|
|
test(cmplx(25.000100, 0.0));
|
|||
|
|
test(cmplx(-2.1E120, 0.0));
|
|||
|
|
test(cmplx(-5E-2, 0.0));
|
|||
|
|
test(cmplx(5.0, 0.0));
|
|||
|
|
test(cmplx(5, -5));
|
|||
|
|
end.
|