See also https://code.jsoftware.com/wiki/Essays/Extended_Precision_Functions
On Fri, Mar 27, 2020 at 3:41 PM David Lambert <[email protected]> wrote: > J lacks a long precision decimal type, probably because Ken realized that > base 10 is a silliness tied to our biology. Instead, j supports extended > rationals, which let us access many more numbers than I triple E 754 > floating point. There are many problems which require computations to so > many decimal digits. This is somewhat reasonable as measurement > uncertainties are often expressed in base 10. J indirectly supports long > decimal in that the complex format of a rational number can be any > (reasonable) length. We compute series to different term tally to find the > number of literal digits remaining the same. Note that j does not support > a rational result from rational to the power of funky rational. > > 2 2r3 ^&.> 2r3 2 > +------+---+ > |1.5874|4r9| > +------+---+ > > x:inv".'x',~500#'1' NB. x:inv 1111111...111x > _ > > 3j1 ": 22 + 1r10 > *** > > Thoughts on long decimal arithmetic. 1) The Digits adverb, u Digits y > computes u to y significant decimal digits, returning that number. > Meanwhile the verb u y calls u with increasing integral y, from 1, > typically the number of terms. u >:y should be more accurate than u y . u > can be memoized and recursive since it's forced to recompute successively > deeper. Taylor series is easily recurrent. The "50" in Digits is > arbitrary and might be replaced with some function of logarithm. > > > Digits=: adverb define NB. u Digits yu u yu is less accurate than u > yu+1 > NB. returns u to at least y significant digits > format=. ' _.' -.~ ((j.~ 50&+) y)&": > i =. 1 > current=. format u i > whilst. last -.@-: current do. > last =. current > i =. i + 2 NB. increment by 2 for no good reason. > current=. format result =. u i > end. > result > ) > > And 2) Following some arithmetic on rationals can result in long numerators > and denominators. The cf dyad computes a perhaps wieldly fraction within x > tolerance of y. > > cf=: 0.1&$: :(4 :0) NB. tolerance cf value -> continued fraction > approximation of value to tolerance > Y =. y > X =. 0 >. x > terms =. 0 $ 0x > whilst. X < | approximation - y do. > 'term Y' =. <.`([:%1&|)`:0 Y > terms =. terms , term > approximation =. +`%/ }: 1j1 #!.1 terms > end. > ) > > assert (-: 0&cf) 649r200 > assert 13r4 (-: cf) 649r200 > > > references: > http://rosettacode.org/wiki/Ramanujan%27s_constant#J > jpath'~addons/math/misc/contfrac.ins' > labs of which I am unaware. > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
