Comparison of approaches for rounding to an integer

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

English (en)

Real numbers can be converted to integers in many ways. Here's a comparison some of them.

program ComparisonOfApproachesForRoundingToInteger(input,output);
// Comparison of approaches for rounding to an integer

uses  SysUtils,Math;

function RoundISO7185(x:real):integer;
// If x is positive or zero, round(x) shall be equivalent to trunc(x+0 .5) ;
// otherwise, round(x) shall be equivalent to trunc(x-0.5)
begin
  If x >= 0 then result := trunc(x+0.5)
    else result := trunc(x-0.5);
end;

var
  r1,r2,r3,r4:real;
  fmt : string;
begin
  r1 := 1.3;
  r2 := 1.6;
  r3 := 3.5;
  r4 := 4.5;
  fmt := '%10s%10s%10s%10s%10s%10s%10s';
  WriteLn(format(fmt,['Value','Write:x:0','Trunc','Round','ISO7185','Floor','Ceil']));
  fmt := '%10d%10d%10d%10d%10d';
  write (r1:10:1,r1:10:0);
  WriteLn(format(fmt,[Trunc(r1),Round(r1),RoundISO7185(r1),floor(r1),ceil(r1)]));
  write (r2:10:1,r2:10:0);
  WriteLn(format(fmt,[Trunc(r2),Round(r2),RoundISO7185(r2),floor(r2),ceil(r2)]));
  write (r3:10:1,r3:10:0);
  WriteLn(format(fmt,[Trunc(r3),Round(r3),RoundISO7185(r3),floor(r3),ceil(r3)]));
  write (r4:10:1,r4:10:0);
  WriteLn(format(fmt,[Trunc(r4),Round(r4),RoundISO7185(r4),floor(r4),ceil(r4)]));
  r1 := r1 *-1;
  r2 := r2 *-1;
  r3 := r3 *-1;
  r4 := r4 *-1;
  write (r1:10:1,r1:10:0);
  WriteLn(format(fmt,[Trunc(r1),Round(r1),RoundISO7185(r1),floor(r1),ceil(r1)]));
  write (r2:10:1,r2:10:0);
  WriteLn(format(fmt,[Trunc(r2),Round(r2),RoundISO7185(r2),floor(r2),ceil(r2)]));
  write (r3:10:1,r3:10:0);
  WriteLn(format(fmt,[Trunc(r3),Round(r3),RoundISO7185(r3),floor(r3),ceil(r3)]));
  write (r4:10:1,r4:10:0);
  WriteLn(format(fmt,[Trunc(r4),Round(r4),RoundISO7185(r4),floor(r4),ceil(r4)]));
  Readln;
end.
 Output:
 Value Write:x:0     Trunc     Round   ISO7185     Floor      Ceil
   1.3         1         1         1         1         1         2
   1.6         2         1         2         2         1         2
   3.5         4         3         4         4         3         4
   4.5         5         4         4         5         4         5
  -1.3        -1        -1        -1        -1        -2        -1
  -1.6        -2        -1        -2        -2        -2        -1
  -3.5        -4        -3        -4        -4        -4        -3
  -4.5        -5        -4        -4        -5        -5        -4


See also