I think I have figured out a way to return float when the result has been
made inaccurate.

We had no choice about m&|@^ for negative y: the behavior of that is
defined by the language, and it isn't modular.

u m. n is a much cleaner solution, and faster. m&|@^ is deprecated.

Henry Rich

On Sun, Apr 16, 2023, 11:51 AM 'Michael Day' via Programming <
programm...@jsoftware.com> wrote:

> Thanks for this and your previous comment re  (-:<.@*<:)
> I'm afraid I've only just noticed this later reply in my J mail folder.
>
> I was going to grumble about x!y remaining integer even when the value
> might be wrong.
> Perhaps you or others might think of a suitable warning comment in NuVoc
> about dyadic !  .
> 2!y could perhaps be treated as special case,  being a triangular
> number,  y(y+1)/2 where
> one could right shift whichever of y, y+1 is even, but presumably that
> would involve too
> much overhead.   Caveat Calculator,  I suppose.
>
> BTW,  I see you've decided against implementing x m&|@^ y for negative
> integer y, integer x,
> and extended m.   (Though I don't remember m needing to be extended in
> earlier discussions!)
> A pity,  but it's been useful to learn that the idiom is well supported
> for positive y.
>
> Cheers,
>
> Mike
>
> On 14/04/2023 14:22, Henry Rich wrote:
> > As (x!y) is coded, the calculation is done in floating-point and then
> > converted to integer if the result will fit.  Loss of significance
> > during the calculation will make the result inaccurate.
> >
> > I think it's a JE error to return an integer value when that value
> > might be wrong.  Unfortunately, the way the internal interfaces are,
> > it's difficult to leave the value as floating-point, so you cannot use
> > the fact that an integer was returned as a guarantee of accuracy.
> >
> > Henry Rich
> >
> > On 4/13/2023 11:34 AM, 'Michael Day' via Programming wrote:
> >> Yet again I found myself resorting to Pari GP for a calculation;  my
> >> J function had been giving
> >> correct answers to a problem for lowish inputs,  but apparently gave
> >> up at some stage for
> >> higher values;  I then coded the calculation in Pari GP which gave
> >> the same results for low
> >> inputs,  but diverged from J at the business end.
> >>
> >> Looking for inconsistencies between the two functions,  the
> >> divergence seems to appear
> >> around this case:
> >>
> >> m =. 134235395
> >>    2^.m     NB. plenty of room for multiplication in 64-bits???
> >> 27.0002
> >>
> >>    2!m
> >> 9009570568285316
> >>    datatype 2!m
> >> integer
> >>
> >>    (-:<.@*<:)m
> >> 9009570568285316
> >>    ((*<:)m)<.@%2
> >> 9009570568285315
> >>    _1 (33 b.) (*<:)m
> >> 9009570568285315
> >>
> >>    datatype (*<:)m
> >> integer
> >>
> >> So - why am I getting 2!m returned as integer but wrong?  If there's
> >> overflow,
> >> why isn't it a float?  Why does    (-:<.@*<:)m  return the wrong
> >> integer when
> >>    ((*<:)m)<.@%2   yields the correct integer?
> >>
> >> This was in J.04,
> >> Engine: j9.4.2/j64avx2/windows
> >> Build: commercial/2023-04-10T01:19:53/clang-15-0-7/SLEEF=1
> >>
> >> I haven't checked behaviour in earlier releases.  I didn't try
> >> extended integers
> >> for this problem.
> >>
> >> Thanks,
> >>
> >> Mike
> >>
> >>
> >>
> >> ----------------------------------------------------------------------
> >> 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