Mercurial > hg > jgplsrc
view docs/ioj/iojComp.htm @ 0:e0bbaa717f41 draft default tip
lol J
author | Jordi Gutiérrez Hermoso <jordigh@octave.org> |
---|---|
date | Mon, 25 Nov 2013 11:56:30 -0500 |
parents | |
children |
line wrap: on
line source
<html> <head> <title>An Implementation of J -- Comparatives</title> </head> <body> <p align=center><font size="6"><b>Comparatives</b></font><br> <font size="4"><b><a href="ioj.htm">An Implementation of J</a></b></font></p> <hr> <br> Comparisons between finite numbers are <i>tolerant</i>, as defined in <a href="iojBib.htm#Bernecky1977">Bernecky</a> [1977]:<br><br> <tt> x = y </tt>if<tt> (|x-y) <:!.0 ct * (|x)>.(|y)</tt> <br><br> (<tt><:!.0 </tt>means <i>exact</i> less than or equal.) That is,<tt> x </tt>and<tt> y </tt>are tolerantly equal if the smaller is on or within the circle centered at the larger, having radius<tt> ct </tt>times the magnitude of the larger.<a name="tolerance"></a><tt> ct</tt>,<tt> </tt>comparison tolerance, is a real number between<tt> 0 </tt>and<tt> 2^_34 </tt>with a default value of<tt> 2^_44</tt>;<tt> </tt>a non-default tolerance may be specified using the <i><a href="iojVerb.htm#fit">fit</a></i> conjunction (<tt>!.</tt>).<tt> </tt>Tolerant relations can be modelled as follows:<br><br> <table> <tr> <td> </td> <td><tt>ct</tt></td> <td><tt>=: </tt></td> <td><tt>2^_44</tt></td> <td>comparison tolerance</td> </tr> <tr> <td> </td> <td><tt>teq</tt></td> <td><tt>=: </tt></td> <td><tt>|@- <:!.0 ct&*@>.&|</tt></td> <td>equal</td> </tr> <tr> <td> </td> <td><tt>tne</tt></td> <td><tt>=: </tt></td> <td><tt>-.@teq</tt></td> <td>not equal</td> </tr> <tr> <td> </td> <td><tt>tlt</tt></td> <td><tt>=: </tt></td> <td><tt>< !.0 *. tne</tt></td> <td>less than</td> </tr> <tr> <td> </td> <td><tt>tgt</tt></td> <td><tt>=: </tt></td> <td><tt>> !.0 *. tne</tt></td> <td>greater than</td> </tr> <tr> <td> </td> <td><tt>tle</tt></td> <td><tt>=: </tt></td> <td><tt><:!.0 +. teq</td> <td>less than or equal to</td> </tr> <tr> <td> </td> <td><tt>tge</tt></td> <td><tt>=: </tt></td> <td><tt>>:!.0 +. teq</td> <td>greater than or equal to</td> </tr> <tr> <td> </td> <td><tt>tfloor</tt></td> <td><tt>=: </tt></td> <td><tt><.!.0@(0.5&+) ([ - tgt) ] </td> <td>floor</td> </tr> <tr> <td> </td> <td><tt>tceil</tt></td> <td><tt>=: </tt></td> <td><tt><.!.0@(0.5&+) ([ + tlt) ]</td> <td>ceiling</td> </tr> <tr> <td> </td> <td><tt>dsignum</tt></td> <td><tt>=: </tt></td> <td><tt>ct&<@| * 0&< - 0&></td> <td>signum (real)</td> </tr> <tr> <td> </td> <td><tt>jsignum</tt></td> <td><tt>=: </tt></td> <td><tt>ct&<@| * (%|)</td> <td>signum (complex)</td> </tr> </table> <br> Additionally, some comparisons internal to the system are <i>fuzzy</i>. Fuzzy comparisons are like tolerant comparisons, but depend on the parameter<a name="fuzz"></a><tt> fuzz</tt>,<tt> </tt>having fixed value<tt> 2^_44</tt>.<tt> </tt>Such comparisons are used in certain domain tests; for example,<tt> (2 3+1e_14)$'abc' </tt>is valid but<tt> (2 3+1e_12)$'abc' </tt>is not. Fuzzy comparisons can be modelled as follows:<br><br> <table> <tr> <td> </td> <td><tt>fuzz</tt></td> <td><tt>=:</tt></td> <td><tt>2^_44</tt></td> </tr> <tr> <td> </td> <td><tt>int</tt></td> <td><tt>=:</tt></td> <td><tt>(-2^31)&<: *. <&(2^31)</tt></td> </tr> <tr> <td> </td> <td><tt>real</tt></td> <td><tt>=:</tt></td> <td><tt>{.@+.</tt></td> </tr> <tr> <td> </td> <td><tt>feq</tt></td> <td><tt>=:</tt></td> <td><tt>|@- <:!.0 fuzz&*@>.&|</tt></td> </tr> <tr> <td> </td> <td><tt>freal</tt></td> <td><tt>=:</tt></td> <td><tt>>:!.0 / @: ((fuzz,1)&*) @: | @: +.</tt></td> </tr> <tr> <td> </td> <td><tt>BfromD</tt></td> <td><tt>=:</tt></td> <td><tt>]`(1&=) @. (feq 1&=)</tt></td> </tr> <tr> <td> </td> <td><tt>IfromD</tt></td> <td><tt>=:</tt></td> <td><tt>]`<. @. (int *. (feq <.))</tt></td> </tr> <tr> <td> </td> <td><tt>DfromZ </tt></td> <td><tt>=:</tt></td> <td><tt>]`real @. (feq real)</tt></td> </tr> </table> <br> The utility<tt> int </tt>tests for membership in the interval<tt> -2^31 </tt>to<tt> _1+2^31 </tt>inclusive.<tt> real </tt>produces the real part of a complex number.<tt> feq </tt>is 1 if its arguments are equal within fuzz;<tt> freal </tt>is 1 if its complex argument is within fuzz of real.<tt> BfromD</tt>,<tt> IfromD</tt>,<tt> </tt>and<tt> DfromZ </tt>convert between types: boolean from real ("double"), integer from real, and real from complex.<br><br> <br> <hr> <a href="iojATW.htm">Next</a> • <a href="iojDisp.htm">Previous</a> • <a href="iojIndex.htm">Index</a> • <a href="ioj.htm#TOC">Table of Contents</a> <br> </body> </html>