Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.forth    |    Forth programmers eat a lot of Bratwurst    |    117,927 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 117,561 of 117,927    |
|    albert@spenarnc.xs4all.nl to All    |
|    double precision presentation for e.g. r    |
|    21 Sep 25 15:06:41    |
      Up to 128 precision is obtainable if we approximate a real       number with a fraction n/d where n d is single precision 64 bit.       What is needed is an "oracle" that determines whether       n/d is too small or too large.       In this example the oracle say that p/q is larger than x,       but this oracle can be replaced to whatever you like.              `find-part finds the n-th convergent. If n is to large to accommodate       the largest ratio is returned.              U> is used to indicate overflow in adding positive number,       a technique acceptable in Forth.              \ -------------------- 8< --------------------------------------       WANT U>       VARIABLE x       \ For p1 p2 leave p2 . (pairs)       : PNIP >R >R 2DROP R> R> ;              \ Multiply double single : result double .       : DS*D >R R@ M* SWAP ROT R> UM* D+ ;              : D< DNEGATE D+ 0< NIP ;                     \ For P Q :" The point is above the line" Q^2>RATIO*P^2       : oracle DUP 0< 1010 AND THROW        >R DUP M* x @ DS*D R> DUP M* D< ;              \ Leave START value for convergents.       : \\: 0 1 1 0 ;              \ For CONV1 CONV2 incorporate K (cf term), return CONV2 CONV3       : \\ >R 2SWAP 2OVER R@ * SWAP R> * SWAP D+ ;              \ For consecutive convergents C1 and C2 find next convergent.       \ Leave next C2 and C3.       VARIABLE CFI       : next-convergent 2SWAP 2OVER D+ 2DUP oracle >R 0 CFI !        BEGIN 1 CFI +! 2OVER D+ 2DUP oracle R@ <> UNTIL RDROP        2OVER DNEGATE D+ ;              : MAX-INT -1 1 RSHIFT ;              \ continued-fraction       \ For current values of 'a 'b 'c whatnot find       \ the nth convergent of as numerator denominator .       : find-part >R \\: 2SWAP        R> 0 DO        'next-convergent CATCH IF &* EMIT 2SWAP LEAVE THEN        DUP MAX-INT U> IF && EMIT 2SWAP LEAVE THEN        LOOP        PNIP ;              \ For A B print its continued fraction and the GCD.       : .CF SWAP BEGIN OVER /MOD . DUP WHILE SWAP REPEAT DROP &| EMIT . ;              \ ----------------------------------------------------------------              Example. Printing the continued fraction proves that the result       is correct.              \ -------------------- 8< --------------------------------------       INCLUDE cfsqrtd.frt       S[ ] OK 2 x !              S[ ] OK 3 find-part              S[ 5 7 ] OK .CF       0 1 2 2 |1       S[ ] OK 100 find-part       S[ 2015874949414289041 2850877693509864481 ] OK .CF       0 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2       2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 |1              29 x !       100 find-part .CF       *0 5 2 1 1 2 10 2 1 1 2 10 2 1 1 2 10 2 1 1 2 10 2 1 1 2 10 2 1 1       2 10 2 1 1 2 10 2 1 1 2 10 2 2 |1       \ -------------------- 8< --------------------------------------              Groetjes Albert       --       The Chinese government is satisfied with its military superiority over USA.       The next 5 year plan has as primary goal to advance life expectancy       over 80 years, like Western Europe.              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca