>>  <<  Usr  Pri  JfC  LJ  Phr  Dic  Voc  !:  Help  Primer

Tolerance

This section is a bit advanced and understanding it is not critical. If it makes sense, great. If not, don't worry about it, and just move on to the next section.

For some kinds of work with floating point numbers, this section is important, along with a more detailed understanding of how numbers are stored and manipulated by the hardware. For most work, however, this section can be ignored.

Let's consider the calculation at the end of the last section in more detail.
   pps 20
   a =. 3 * 100 * % 3
   a
99.999999999999986
   a = 100
1
By exact math you would expect a to be 100. But because the computer can't exactly represent the value %3, you get a value for a that is very close to 100, but not exactly, as you can see by its detailed display with a print precision of 20. However, note that a is considered to be equal to 100, even though you can see that it is not exactly equal. This is because the comparison is tolerant. That is, numbers do not have to be exactly identical to be considered equal.

Let's experiment to get an idea for how tolerant the comparison is by gradually taking the value further away from 100. The input line recall shortcut with Shift+Ctrl+up arrow is very useful for playing with things like this.
   100 = 100
1
   100 = 99.999999999999986
1
   100 = 99.99999999999998
1
   100 = 99.9999999999999
1
   100 = 99.999999999999
1
   100 = 99.99999999999
0
In the last example you crossed the line and the value is far enough away from 100 that it is no longer considered to be equal. Let's look at another example.
   a =. 23
   b =. a - 1e_12
   c =. a - 1e_11
   a
23
   b
22.999999999999002
   c
22.999999999989999
   a = b
1
   a = c
0
The values of a and b are close enough to be considered equal. The values of a and c are not close enough to be considered equal. Close enough refers to the difference between the two numbers.
   a - b
9.9831254374294076e_13
   a - c
1.000088900582341e_11
In both cases the difference is small, but b is closer than c to a. Reading the J Dictionary definition for = you will see that the dividing line between close enough and not close enough is determined by the result of multiplying the larger of the numbers times the default tolerance value of 2^_44. That is, close enough is relative to the size of the numbers.
   tolerance =. a * 2 ^ _44
   tolerance
1.3073986337985843e_12
Check both differences against this tolerance:
   (a - b , c) <: tolerance
1 0
The difference between a and b is less or equal to the tolerance, whereas the difference between a and c is not.

>>  <<  Usr  Pri  JfC  LJ  Phr  Dic  Voc  !:  Help  Primer