\ Rekenen met breuken (oplossing)

\ AN aug 2025
decimal
: C>F ( C -- F ) 9 5 */ 32 + ;
: F>C ( F -- C ) 32 - 5 9 */ ;

\ Opgave 1 - de code voor C>>F en F>>C

decimal
\ t/n  teller/noemer
: C>>F ( ct cn -- ft fn )   5 * swap 9 * over 32 * + swap ;
: F>>C ( ft fn -- ct cn )   tuck 32 * - 5 * swap 9 * ;

\ Opgave 2 - de code voor .Q

\ Druk t/n (het quotient van t en n) af als decimale breuk
\ #dec = aantal decimalen

\ Eerst maar eens de rekenkundige kern van de zaak:
: .Q ( t n #dec -- )
    >r tuck                     \ n t n
    /mod                        \ n rest quotient
    0 .r ch . emit              \ n rest
    r> 0 ?do
        10 * over /mod          \ n rest' rest*10/n
        ch 0 + emit             \ decimalen achter de komma
    loop 2drop ;
\ En nu rekening houdend met:
\ een buitensporig groot aantal decimalen
\ eventuele mintekens
\ kans op overflow bij REST*10
\ N = 0
: .Q ( t n #dec -- )
    over
    if  64 umin >r                          \ #dec begrenzen
        2dup xor 0< if ch - emit then       \ uitkomst negatief?
        abs swap abs                        \ n t
        over /mod                           \ n rest quotient
        0 .r ch . emit                      \ n rest
        r> 0 ?do   over >r 10 um* r> um/mod \ n rest' rest*10/n
                 \ 10 um* 2 pick um/mod
                   ch 0 + emit              \ decimalen achter de komma
             loop 2drop space
    else 2drop 0 .r ." /0 "                 \ n was 0
    then ;
\ Voorbeelden

21 c>f .
22 c>f .

21  1  c>>f 3 .q
22  1  c>>f 4 .q
215 10 c>>f 5 .q
707 10 f>>c 6 .q
355 113    32 .q
1000 998   32 .q