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
<erl...@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/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

Reply via email to