[Jprogramming] Puzzling result

Erling Hellenäs erling at erlinghellenas.se
Wed Sep 13 14:06:32 UTC 2017


       196x|57290824867848391x
99

I wonder how they manage to handle this in Nial:

      57290824867848391 - ( 196 * floor ( 57290824867848391 / 196 ) )
99

Floor creates an integer, but the precision should be lost in the 
division if they represent their floats as IEEE double. So, maybe they 
have another representation or they change it when needed. The division 
does create a floating point number.

Cheers,

Erling


Den 2017-09-13 kl. 15:44, skrev Erling Hellenäs:
> Yes.
>
>     (14^2)|!.0 [ 5729082486784839
>
> 147
>
>
> /Erling
>
>
> Den 2017-09-13 kl. 15:25, skrev Don Guinn:
>> That is true, but the problem is not in J, but in IEEE as it cannot
>> represent that number exactly in float double. Before 64 bit integers 
>> came
>> out all integers were included exactly in float double. So converting
>> integer to float never caused a loss in precision. Now it does.
>>
>>     2^.57290824867848391
>>
>> 55.6692
>>
>>     0j0":{.57290824867848391 0.5
>>
>> 57290824867848392
>>
>>
>> When things are pushed to their limits and possibly beyond, strange 
>> things
>> happen. Comparison tolerance address many problems that bite other
>> programming languages, but it's not perfect. That decimal numbers with
>> fractional values cannot be represented exactly in binary computers 
>> causes
>> a lot of grief in all programming languages.
>>
>>
>> I'm just relieved to understand the problem and that it is easy to get
>> around up to the limits of IEEE float double.
>>
>> On Wed, Sep 13, 2017 at 7:06 AM, Erling Hellenäs 
>> <erling at erlinghellenas.se>
>> wrote:
>>
>>> So, the perceived problem is related to comparison tolerance. The 
>>> question
>>> is then how it is used and if this use is rational?
>>>
>>> With comparison tolerance at 0, when we add another digit, we get a new
>>> incorrect result, now related to lost precision?
>>>
>>> 9!:19]0
>>>       196x|57290824867848391x
>>> 99
>>>      ({.196 0.5)|57290824867848391
>>> 104
>>>
>>> Cheers,
>>>
>>> Erling
>>>
>>>
>>> Den 2017-09-13 kl. 14:38, skrev Don Guinn:
>>>
>>>> I think I found the culprit.
>>>>
>>>>      ({.196 0.5)|5729082486784839
>>>> 0
>>>>      9!:18''
>>>> 5.68434e_14
>>>>      2^.9!:18''
>>>> _44
>>>>      9!:19]0
>>>>
>>>>      ({.196 0.5)|5729082486784839
>>>> 147
>>>>      9!:19]5.68434e_15
>>>>
>>>>      ({.196 0.5)|5729082486784839
>>>> 147
>>>>      ({.196 0.5)|57290824867848391
>>>> 0
>>>>      9!:19]5.68434e_16
>>>>
>>>>      ({.196 0.5)|57290824867848391
>>>> 104
>>>>
>>>> On Tue, Sep 12, 2017 at 4:57 PM, Raul Miller <rauldmiller at gmail.com>
>>>> wrote:
>>>>
>>>>      R2=: |
>>>>>      R1=: (] - [ * [: <.!.0 ] % [)"0
>>>>>      R0=: (|&x:)"0
>>>>>
>>>>>      (14^2) R1 5729082486784839
>>>>> 147
>>>>>      (14^2) R2 5729082486784839
>>>>> 0
>>>>>
>>>>>      X=: (0.1-0.1)+i.1000
>>>>>      Y=: 5729082486784839+i:1000
>>>>>
>>>>>      datatype X
>>>>> floating
>>>>>
>>>>>      +/,X (R0/ ~: R2/) Y
>>>>> 1845046
>>>>>      +/,X (R0/ ~: R1/) Y
>>>>> 0
>>>>>
>>>>> Good question.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> -- 
>>>>> Raul
>>>>>
>>>>>
>>>>> On Tue, Sep 12, 2017 at 4:26 AM, Erling Hellenäs
>>>>> <erling at erlinghellenas.se> wrote:
>>>>>
>>>>>> Residue1=: ] - [ * [: <.!.0 ] % [
>>>>>>
>>>>>> Residue2=: |
>>>>>>
>>>>>> (14^2) Residue1 5729082486784839
>>>>>>
>>>>>> 147
>>>>>>
>>>>>> (14^2) Residue2 5729082486784839
>>>>>>
>>>>>> 0
>>>>>>
>>>>>> Why is Residue2 losing precision when Residue1 is not?
>>>>>>
>>>>>> /Erling
>>>>>>
>>>>>>
>>>>>>
>>>>>> Den 2017-09-12 kl. 02:04, skrev Don Kelly:
>>>>>>
>>>>>>> I believe that Raul has hit it on the head.  14^2 will be 
>>>>>>> floating as
>>>>>>>
>>>>>> will
>>>>>> generally be the case with % so it is possible that errors add or
>>>>>> subtract
>>>>>> to give an erroneous result. Note that
>>>>>>> (14^2) (] - [ * [: <. ] % [)5729082486784839x
>>>>>>>
>>>>>>> 147
>>>>>>>
>>>>>>>
>>>>>>> (14^2x) (] - [ * [: <. ] % [)5729082486784839
>>>>>>>
>>>>>>> 147
>>>>>>>
>>>>>>> and
>>>>>>>
>>>>>>> (14^2x)|5729082486784839
>>>>>>>
>>>>>>> 147
>>>>>>>
>>>>>>>
>>>>>>> does it more simply
>>>>>>>
>>>>>>>
>>>>>>> Don
>>>>>>>
>>>>>>> On 2017-09-11 6:50 AM, Erling Hellenäs wrote:
>>>>>>>
>>>>>>>> (14^2x) (] - [ * [: <. ] % [)5729082486784839x
>>>>>>>>
>>>>>>>> 147
>>>>>>>>
>>>>>>>> (14^2) (] - [ * [: <. ] % [)5729082486784839
>>>>>>>>
>>>>>>>> _49
>>>>>>>>
>>>>>>>> (14^2) (] - [ * _1 + [: <. ] % [)5729082486784839
>>>>>>>>
>>>>>>>> 147
>>>>>>>>
>>>>>>>> /Erling
>>>>>>>>
>>>>>>>>
>>>>>>>> Den 2017-09-11 kl. 15:40, skrev Erling Hellenäs:
>>>>>>>>
>>>>>>>>>   From what I see, floor gives an incorrect result which I 
>>>>>>>>> correct
>>>>>>>>> with
>>>>>>>>> the " _1 + " There is not other problem. No loss of precision.
>>>>>>>>> /Erling
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Den 2017-09-11 kl. 15:27, skrev Raul Miller:
>>>>>>>>>
>>>>>>>>>> I do not know what you are thinking, and you have not 
>>>>>>>>>> illustrated
>>>>>>>>>>
>>>>>>>>> your
>>>>>> thoughts sufficiently for me to grasp them.
>>>>>>>>>> So, I thought I'd work through this:
>>>>>>>>>>
>>>>>>>>>>       (14^2) (] - [ * _1 + [: <. ] % [)5729082486784839
>>>>>>>>>> 147
>>>>>>>>>>       (14^2x) (] - [ * _1 + [: <. ] % [)5729082486784839x
>>>>>>>>>> 343
>>>>>>>>>>
>>>>>>>>>> Clearly, the exact answer is different from the quick answer.
>>>>>>>>>>
>>>>>>>>>> If we compare
>>>>>>>>>>       load'debug/dissect'
>>>>>>>>>>       dissect '(14^2) (] - [ * _1 + [: <. ] % 
>>>>>>>>>> [)5729082486784839'
>>>>>>>>>>       dissect '(14^2x) (] - [ * _1 + [: <. ] % 
>>>>>>>>>> [)5729082486784839x'
>>>>>>>>>>
>>>>>>>>>> We can see the initial off-by-one errors, but the big difference
>>>>>>>>>>
>>>>>>>>> shows
>>>>>> up at the end (where we subtract from 5729082486784839)
>>>>>>>>>> The value we are subtracting is:
>>>>>>>>>>
>>>>>>>>>>       (14^2x) ([ * _1 + [: <. ] % [)5729082486784839x
>>>>>>>>>> 5729082486784496
>>>>>>>>>>       (14^2) ([ * _1 + [: <. ] % [)5729082486784839
>>>>>>>>>> 5.72908e15
>>>>>>>>>>
>>>>>>>>>> Looking at the bits needed to represent that as an integer:
>>>>>>>>>>
>>>>>>>>>>       2^.(14^2) ([ * _1 + [: <. ] % [)5729082486784839
>>>>>>>>>> 52.3472
>>>>>>>>>>
>>>>>>>>>> we can see that that's right on the edge of being the number of
>>>>>>>>>> representable digits in a 64 bit float.
>>>>>>>>>>
>>>>>>>>>> But, also, it's the result of multiplying
>>>>>>>>>>
>>>>>>>>>>       14^2
>>>>>>>>>> 196
>>>>>>>>>>
>>>>>>>>>> by an off-by-one amount. And...
>>>>>>>>>>
>>>>>>>>>>       343-196
>>>>>>>>>> 147
>>>>>>>>>>
>>>>>>>>>> ...
>>>>>>>>>>
>>>>>>>>>> Anyways, I'm not sure what you were thinking, but I guess we can
>>>>>>>>>> take
>>>>>>>>>> this as a good example of the idea that errors can actually
>>>>>>>>>> accumulate.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>>
>>>>>>>>>> ------------------------------------------------------------
>>>>>>>> ----------
>>>>>> For information about J forums see http://www.jsoftware.com/
>>>>>>>> forums.htm
>>>>>>>> ------------------------------------------------------------
>>>>>>>> ----------
>>>>>>>> For information about J forums see http://www.jsoftware.com/forum
>>>>>>>> s.htm
>>>>>>>>
>>>>>>> ---------------------------------------------------------------------- 
>>>>>>>
>>>>>>> For information about J forums see 
>>>>>>> http://www.jsoftware.com/forums.htm
>>>>>>>
>>>>>> ---------------------------------------------------------------------- 
>>>>>>
>>>>>> For information about J forums see 
>>>>>> http://www.jsoftware.com/forums.htm
>>>>>>
>>>>> ---------------------------------------------------------------------- 
>>>>>
>>>>> For information about J forums see 
>>>>> http://www.jsoftware.com/forums.htm
>>>>>
>>>>> ---------------------------------------------------------------------- 
>>>>>
>>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>>
>>> ----------------------------------------------------------------------
>>> For information about J forums see http://www.jsoftware.com/forums.htm
>>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm



More information about the Programming mailing list