I took a look at the core j implementation, and it looks like it's
using the c fmod() mechanism.

So this is really a bug inherited from c.

I think.

FYI,

-- 
Raul


On Wed, Sep 13, 2017 at 10:06 AM, Erling Hellenäs
<[email protected]> wrote:
>       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
>>> <[email protected]>
>>> 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 <[email protected]>
>>>>> 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
>>>>>> <[email protected]> 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
>
>
> ----------------------------------------------------------------------
> 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