program AllRound { www.merlyn.demon.co.ukl >= 2002-03-21 See http://www.merlyn.demon.co.uk/pas-chop.htm#Round N.B. I don't have Delphi Math unit, so cannot test anything using Delphi Floor & Ceil } ; {$I version} {$IFDEF DELPHI} {$APPTYPE CONSOLE} (* uses Math { I don't have it } ; *) {$ENDIF} var x : double ; J : integer ; const i = 4 ; Q = 10000 ; procedure WN(const N : integer) ; begin Write(N:i) end {WN} ; procedure WR(const R : double) ; begin Write(R:7:2) end {WR} ; (* function Sign(D:double) : integer ; // untested begin Sign := Ord(0.00.0 then Sign := +1 else if D<0.0 then Sign := -1 else Sign := 0 end {Sign} ; function F1(const x : double) : integer ; FAR ; { Delphi : Floor } begin F1 := Trunc(x+Q)-Q end {F1} ; function F2(const x : double) : integer ; FAR ; { Delphi : Trunc } begin F2 := Trunc(x) end {F2} ; function F3(const x : double) : integer ; FAR ; begin F3 := Trunc(x+Sign(Frac(x))) end {F3} ; function F4(const x : double) : integer ; FAR ; { Delphi : Ceil } begin F4 := Trunc(x-Q)+Q end {F4} ; function F5a(const x : double) : integer ; FAR ; begin F5a := Round(x-Ord(Abs(Frac(x))=0.5)*0.1) end {F5a} ; function F5b(const x : double) : integer ; FAR ; begin F5b := Round(x-Ord(Abs(Frac(x))=0.5)*Sign(x)*0.1) end {F5b} ; function F5c1(const x : double) : integer ; FAR ; begin F5c1 := Trunc(2.0*x-Trunc(x)) end {F5c1} ; function F5c2(const x : double) : integer ; FAR ; begin F5c2 := Trunc(x+0.5*Sign(x)) end {F5c2} ; function F5c3(const x : double) : integer ; FAR ; begin F5c3 := Round(x+Ord(Abs(Frac(x))=0.5)*Sign(x)*0.1) end {F5c3} ; function F5d(const x : double) : integer ; FAR ; begin F5d := Round(x+Ord(Abs(Frac(x))=0.5)*0.1) end {F5d} ; function F5e(const x : double) : integer ; FAR ; { Delphi : Round } begin F5e := Round(x) end {F5e} ; function F5f(const x : double) : integer ; FAR ; begin F5f := Succ(Round(x-1.0)) end {F5f} ; function F6a(const x : double) : integer ; FAR ; begin F6a := Trunc(x)+Random(2)*Sign(x-Trunc(x)) end {F6a} ; function F6b(const x : double) : integer ; FAR ; begin F6b := Round(x+Random-0.5) end {F6b} ; function F6c(const x : double) : integer ; FAR ; begin F6c := Round(x+Ord(Abs(Frac(x))=0.5)*(integer(2*Random(2))-1)*0.1) end {F6c} ; type Fn = function (const x : double) : integer ; function F(G : Fn ; const x : double) : double ; var S, T : double ; K : integer ; begin S := 0.0 ; for K := 1 to 10000 do begin T := G(x) ; if Abs(T-x)>=1.0 then begin Write(x) ; Readln end ; S := S + T end ; F := S/10000 end {F} ; procedure Dash(const X : double) ; begin if Frac(x)=0.0 then Write('-':2) else Write('':2) end {Dash} ; BEGIN ; Writeln('J':4, 'x ':9, '1':i, '2':i, '3':i, '4':i, '5a':i, '5b':i, '5c':i, '5c':i, '5c':i, '5d':i, '5e':i, '5f':i, '?':i+2) ; for J := +10 downto -10 do begin x := J*0.25 ; Write(J:4, x:7:2) ; Dash(x) ; {1} WN(F1(x)) ; {2} WN(F2(x)) ; {3} WN(F3(x)) ; {4} WN(F4(x)) ; {5a} WN(F5a(x)) ; {5b} WN(F5b(x)) ; {5c} WN(F5c1(x)) ; WN(F5c2(x)) ; WN(F5c3(x)) ; {5d} WN(F5d(x)) ; {5e} WN(F5e(x)) ; {5f} WN(F5f(x)) ; Write('':2) ; {?} WN(Round(x+0.5*Sign(x))) ; Dash(x) ; Writeln end ; Writeln ; Randomize ; Writeln('J':4, 'x ':8, '6a':7, '6b':7, '6c':7) ; for J := +10 downto -10 do begin x := J*0.25 ; Write(J:4, x:7:2) ; Dash(x) ; {6a} WR(F(F6a, x)) ; {6b} WR(F(F6b, x)) ; {6c} WR(F(F6c, x)) ; Dash(x) ; Writeln end ; Readln ; END.