Comparatives
An Implementation of J

Comparisons between finite numbers are tolerant, as defined in Bernecky :

x = y   if   (|x-y) <:!.0 ct * (|x)>.(|y)

(<:!.0 means exact less than or equal.) That is, x and y are tolerantly equal if the smaller is on or within the circle centered at the larger, having radius ct times the magnitude of the larger. ct, comparison tolerance, is a real number between 0 and 2^_34 with a default value of 2^_44; a non-default tolerance may be specified using the fit conjunction (!.). Tolerant relations can be modelled as follows:

 ct =: 2^_44 comparison tolerance teq =: |@- <:!.0 ct&*@>.&| equal tne =: -.@teq not equal tlt =: < !.0 *. tne less than tgt =: > !.0 *. tne greater than tle =: <:!.0 +. teq less than or equal to tge =: >:!.0 +. teq greater than or equal to tfloor =: <.!.0@(0.5&+) ([ - tgt) ] floor tceil =: <.!.0@(0.5&+) ([ + tlt) ] ceiling dsignum =: ct&<@| * 0&< - 0&> signum (real) jsignum =: ct&<@| * (%|) signum (complex)

Additionally, some comparisons internal to the system are fuzzy. Fuzzy comparisons are like tolerant comparisons, but depend on the parameter fuzz, having fixed value 2^_44. Such comparisons are used in certain domain tests; for example, (2 3+1e_14)\$'abc' is valid but (2 3+1e_12)\$'abc' is not. Fuzzy comparisons can be modelled as follows:

 fuzz =: 2^_44 int =: (-2^31)&<: *. <&(2^31) real =: {.@+. feq =: |@- <:!.0 fuzz&*@>.&| freal =: >:!.0 / @: ((fuzz,1)&*) @: | @: +. BfromD =: ]`(1&=) @. (feq 1&=) IfromD =: ]`<. @. (int *. (feq <.)) DfromZ =: ]`real @. (feq real)

The utility int tests for membership in the interval -2^31 to _1+2^31 inclusive. real produces the real part of a complex number. feq is 1 if its arguments are equal within fuzz; freal is 1 if its complex argument is within fuzz of real. BfromD, IfromD, and DfromZ convert between types: boolean from real ("double"), integer from real, and real from complex.