Merge pull request #379 from max19/test

comments, a couple fixes
This commit is contained in:
cgyarvin 2015-08-06 12:11:24 -07:00
commit 6e5ecb0f3d

View File

@ -1278,7 +1278,7 @@
[%n ~] [%n ~]
== ==
:: ::
++ fl ++ fl :: arbitrary precision floating point
=+ ^- [[p=@u v=@s w=@u] r=?(%n %u %d %z %a) d=?(%d %f %i)] =+ ^- [[p=@u v=@s w=@u] r=?(%n %u %d %z %a) d=?(%d %f %i)]
[[113 -16.494 32.765] %n %d] [[113 -16.494 32.765] %n %d]
:: p=precision: number of bits in arithmetic form; must be at least 2 :: p=precision: number of bits in arithmetic form; must be at least 2
@ -1289,7 +1289,9 @@
:: infinite exponent range :: infinite exponent range
=> =>
~% %cofl +> ~ ~% %cofl +> ~
|% :: don't put 0s into [@s @u] args :: internal functions; mostly operating on [e=@s a=@u], in other words
:: positive numbers. many of these have undefined behavior if a=0.
|%
++ rou ++ rou
|= [a=[e=@s a=@u]] ^- fn (rau a &) |= [a=[e=@s a=@u]] ^- fn (rau a &)
:: ::
@ -1301,7 +1303,7 @@
%n (lug %ne a t) %n (lug %ne a t)
== ==
:: ::
++ add ++ add :: add; exact if e
|= [a=[e=@s a=@u] b=[e=@s a=@u] e=?] ^- fn |= [a=[e=@s a=@u] b=[e=@s a=@u] e=?] ^- fn
=+ q=(dif:si e.a e.b) =+ q=(dif:si e.a e.b)
|- ?. (syn:si q) $(b a, a b, q +(q)) :: a has larger exponent |- ?. (syn:si q) $(b a, a b, q +(q)) :: a has larger exponent
@ -1319,7 +1321,7 @@
== ==
(rou [e.b (^add (lsh 0 (abs:si q) a.a) a.b)]) (rou [e.b (^add (lsh 0 (abs:si q) a.a) a.b)])
:: ::
++ sub ++ sub :: subtract; exact if e
|= [a=[e=@s a=@u] b=[e=@s a=@u] e=?] ^- fn |= [a=[e=@s a=@u] b=[e=@s a=@u] e=?] ^- fn
=+ q=(dif:si e.a e.b) =+ q=(dif:si e.a e.b)
|- ?. (syn:si q) |- ?. (syn:si q)
@ -1341,11 +1343,11 @@
?~ i [%f & zer] ?~ i [%f & zer]
?: e [%f & e.b i] (rou [e.b i]) ?: e [%f & e.b i] (rou [e.b i])
:: ::
++ mul ++ mul :: multiply
|= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- fn |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- fn
(rou (sum:si e.a e.b) (^mul a.a a.b)) (rou (sum:si e.a e.b) (^mul a.a a.b))
:: ::
++ div ++ div :: divide
|= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- fn |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- fn
=+ [ma=(met 0 a.a) mb=(met 0 a.b)] =+ [ma=(met 0 a.a) mb=(met 0 a.b)]
=+ v=(dif:si (sun:si ma) (sun:si +((^add mb prc)))) =+ v=(dif:si (sun:si ma) (sun:si +((^add mb prc))))
@ -1354,18 +1356,7 @@
=+ [j=(dif:si e.a e.b) q=(dvr a.a a.b)] =+ [j=(dif:si e.a e.b) q=(dvr a.a a.b)]
(rau [j p.q] =(q.q 0)) (rau [j p.q] =(q.q 0))
:: ::
++ fma ++ sqt :: square root
|= [a=[e=@s a=@u] b=[e=@s a=@u] c=[e=@s a=@u]] ^- fn
(add [(sum:si e.a e.b) (^mul a.a a.b)] c |)
::
++ frd :: a/2, rounds to -inf
|= [a=@s]
=+ b=(old:si a)
?: |(-.b =((end 0 1 +.b) 0))
(new:si -.b (rsh 0 1 +.b))
(new:si -.b +((rsh 0 1 +.b)))
::
++ sqt
|= [a=[e=@s a=@u]] ^- fn |= [a=[e=@s a=@u]] ^- fn
=. a =. a
=+ [w=(met 0 a.a) x=(^mul +(prc) 2)] =+ [w=(met 0 a.a) x=(^mul +(prc) 2)]
@ -1373,10 +1364,10 @@
=+ ?: =((dis - 1) (dis (abs:si e.a) 1)) - =+ ?: =((dis - 1) (dis (abs:si e.a) 1)) -
(^add - 1) (^add - 1)
a(e (dif:si e.a (sun:si -)), a (lsh 0 - a.a)) a(e (dif:si e.a (sun:si -)), a (lsh 0 - a.a))
=+ [y=(^sqt a.a) z=(frd e.a)] =+ [y=(^sqt a.a) z=(fra:si e.a --2)]
(rau [z p.y] =(q.y 0)) (rau [z p.y] =(q.y 0))
:: ::
++ lth ++ lth :: less-than
|= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ? |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ?
?: =(e.a e.b) (^lth a.a a.b) ?: =(e.a e.b) (^lth a.a a.b)
=+ c=(cmp:si (ibl a) (ibl b)) =+ c=(cmp:si (ibl a) (ibl b))
@ -1385,7 +1376,7 @@
(^lth (rsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b) (^lth (rsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b)
(^lth (lsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b) (^lth (lsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b)
:: ::
++ lte ++ lte :: less-equals
|= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ? |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ?
?: =(e.a e.b) (^lte a.a a.b) ?: =(e.a e.b) (^lte a.a a.b)
=+ c=(cmp:si (ibl a) (ibl b)) =+ c=(cmp:si (ibl a) (ibl b))
@ -1394,7 +1385,7 @@
(^lte a.a (lsh 0 (abs:si (dif:si e.a e.b)) a.b)) (^lte a.a (lsh 0 (abs:si (dif:si e.a e.b)) a.b))
(^lte (lsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b) (^lte (lsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b)
:: ::
++ equ ++ equ :: equals
|= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ? |= [a=[e=@s a=@u] b=[e=@s a=@u]] ^- ?
?. =((ibl a) (ibl b)) | ?. =((ibl a) (ibl b)) |
?: =((cmp:si e.a e.b) -1) ?: =((cmp:si e.a e.b) -1)
@ -1406,16 +1397,18 @@
|= [a=[e=@s a=@u]] ^- @s |= [a=[e=@s a=@u]] ^- @s
(sum:si (sun:si (dec (met 0 a.a))) e.a) (sum:si (sun:si (dec (met 0 a.a))) e.a)
:: ::
:: change to a representation where a.a is odd
:: every fn has a unique representation of this kind
++ uni ++ uni
|= [a=[e=@s a=@u]] |= [a=[e=@s a=@u]]
?< =(a.a 0)
|- ?: =((end 0 1 a.a) 1) a |- ?: =((end 0 1 a.a) 1) a
$(a.a (rsh 0 1 a.a), e.a (sum:si e.a --1)) $(a.a (rsh 0 1 a.a), e.a (sum:si e.a --1))
:: ::
:: expands to either full precision or to denormalized
:: assumes (met 0 a.a) <= precision
++ xpd ++ xpd
|= [a=[e=@s a=@u]] |= [a=[e=@s a=@u]]
=+ ma=(met 0 a.a) =+ ma=(met 0 a.a)
?< =(ma 0)
=+ ?: =(den %i) (^sub prc ma) =+ ?: =(den %i) (^sub prc ma)
=+ ^= q =+ ^= q
=+ w=(dif:si e.a emn) =+ w=(dif:si e.a emn)
@ -1423,13 +1416,16 @@
(min q (^sub prc ma)) (min q (^sub prc ma))
a(e (dif:si e.a (sun:si -)), a (lsh 0 - a.a)) a(e (dif:si e.a (sun:si -)), a (lsh 0 - a.a))
:: ::
:: in order: floor, ceiling, nearest (even, away from 0, toward 0), :: central rounding mechanism
:: larger, smaller; t=sticky bit :: can perform: floor, ceiling, smaller, larger,
:: nearest (round ties to: even, away from 0, toward 0)
:: s is sticky bit: represents a value less than ulp(a) = 2^(e:(xpd a))
++ lug ++ lug
~/ %lug ~/ %lug
|= [t=?(%fl %ce %ne %na %nt %lg %sm) a=[e=@s a=@u] s=?] ^- fn |= [t=?(%fl %ce %sm %lg %ne %na %nt) a=[e=@s a=@u] s=?] ^- fn
?< =(a.a 0)
=- =-
?. =(den %f) - ?. =(den %f) - :: if %f, flush denormals
?. ?=([%f *] -) - ?. ?=([%f *] -) -
?: =((met 0 ->+>) prc) - [%f & zer] ?: =((met 0 ->+>) prc) - [%f & zer]
:: ::
@ -1456,7 +1452,7 @@
%na [%f & ?:((^lth b (bex (dec q))) zer spd)] %na [%f & ?:((^lth b (bex (dec q))) zer spd)]
== ==
:: ::
=. a (xpd a) :: expand =. a (xpd a)
:: ::
=. a =. a
?- t ?- t
@ -1489,9 +1485,10 @@
?: =(den %i) [%f & a] ?: =(den %i) [%f & a]
?: =((cmp:si emx e.a) -1) [%i &] [%f & a] :: enforce max. exp ?: =((cmp:si emx e.a) -1) [%i &] [%f & a] :: enforce max. exp
:: ::
++ drg :: dragon4 ++ drg :: dragon4; convert to decimal
~/ %drg ~/ %drg
|= [a=[e=@s a=@u]] ^- [@s @u] |= [a=[e=@s a=@u]] ^- [@s @u]
?< =(a.a 0)
=. a ?: (^lth (met 0 a.a) prc) (xpd a) a =. a ?: (^lth (met 0 a.a) prc) (xpd a) a
=+ r=(lsh 0 ?:((syn:si e.a) (abs:si e.a) 0) a.a) =+ r=(lsh 0 ?:((syn:si e.a) (abs:si e.a) 0) a.a)
=+ s=(lsh 0 ?.((syn:si e.a) (abs:si e.a) 0) 1) =+ s=(lsh 0 ?.((syn:si e.a) (abs:si e.a) 0) 1)
@ -1525,7 +1522,7 @@
=. o (^add (^mul o 10) ?:(q +(u) u)) =. o (^add (^mul o 10) ?:(q +(u) u))
[k o] [k o]
:: ::
++ toi ++ toj :: round to integer
|= [a=[e=@s a=@u]] ^- fn |= [a=[e=@s a=@u]] ^- fn
?. =((cmp:si e.a --0) -1) [%f & a] ?. =((cmp:si e.a --0) -1) [%f & a]
=+ x=(abs:si e.a) =+ x=(abs:si e.a)
@ -1537,50 +1534,49 @@
?: &(=(z i) =((dis y 1) 0)) [%f & --0 y] ?: &(=(z i) =((dis y 1) 0)) [%f & --0 y]
?: (^lth z i) [%f & --0 y] [%f & --0 +(y)] ?: (^lth z i) [%f & --0 y] [%f & --0 +(y)]
:: ::
++ ned ++ ned :: require ?=([%f *] a)
|= [a=fn] ^- [%f s=? e=@s a=@u] |= [a=fn] ^- [%f s=? e=@s a=@u]
?: ?=([%f *] a) a ?: ?=([%f *] a) a
~| %need-float !! ~| %need-float !!
:: ::
++ shf ++ shf :: a * 2^b; no rounding
|= [a=fn b=@s] |= [a=fn b=@s]
?: |(?=([%n *] a) ?=([%i *] a)) a ?: |(?=([%n *] a) ?=([%i *] a)) a
a(e (sum:si e.a b)) a(e (sum:si e.a b))
:: ::
++ fli ++ fli :: flip sign
|= [a=fn] ^- fn |= [a=fn] ^- fn
?-(-.a %f a(s !s.a), %i a(s !s.a), %n a) ?-(-.a %f a(s !s.a), %i a(s !s.a), %n a)
:: ::
++ swr ?+(r r %d %u, %u %d) ++ swr ?+(r r %d %u, %u %d) :: flipped rounding mode
++ prc ?>((gth p 1) p) ++ prc ?>((gth p 1) p) :: enforce precision at least 2
++ den d ++ den d :: denorms/flush/inf exponent range
++ emn v ++ emn v :: minimum exponent
++ emm (sum:si emn (sun:si (dec prc))) ++ emx (sum:si emn (sun:si w)) :: maximum exponent
++ emx (sum:si emn (sun:si w)) ++ spd [e=emn a=1] :: smallest denormal
++ spd [e=emn a=1] :: smallest "denormal" ++ spn [e=emn a=(bex (dec prc))] :: smallest normal
++ spn [e=emn a=(bex (dec prc))] :: smallest "normal"
++ lfn [e=emx a=(fil 0 prc 1)] :: largest ++ lfn [e=emx a=(fil 0 prc 1)] :: largest
++ lfe (sum:si emx (sun:si prc)) :: 2^lfe is larger than all floats ++ lfe (sum:si emx (sun:si prc)) :: 2^lfe is larger than all floats
++ zer [e=--0 a=0] ++ zer [e=--0 a=0]
-- --
|% |%
++ rou ++ rou :: round
|= [a=fn] ^- fn |= [a=fn] ^- fn
?. ?=([%f *] a) a ?. ?=([%f *] a) a
?~ a.a [%f s.a zer] ?~ a.a [%f s.a zer]
?: s.a (^rou +>.a) ?: s.a (^rou +>.a)
=.(r swr (fli (^rou +>.a))) =.(r swr (fli (^rou +>.a)))
:: ::
++ syn ++ syn :: get sign
|= [a=fn] ^- ? |= [a=fn] ^- ?
?-(-.a %f s.a, %i s.a, %n &) ?-(-.a %f s.a, %i s.a, %n &)
:: ::
++ abs ++ abs :: absolute value
|= [a=fn] ^- fn |= [a=fn] ^- fn
?: ?=([%f *] a) [%f & e.a a.a] ?: ?=([%f *] a) [%f & e.a a.a]
?: ?=([%i *] a) [%i &] [%n ~] ?: ?=([%i *] a) [%i &] [%n ~]
:: ::
++ add ++ add :: add
|= [a=fn b=fn] ^- fn |= [a=fn b=fn] ^- fn
?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~]
?: |(?=([%i *] a) ?=([%i *] b)) ?: |(?=([%i *] a) ?=([%i *] b))
@ -1610,16 +1606,20 @@
?: |(=(a.a 0) =(a.b 0)) ?: |(=(a.a 0) =(a.b 0))
?. &(=(a.a 0) =(a.b 0)) ?~(a.a b a) ?. &(=(a.a 0) =(a.b 0)) ?~(a.a b a)
[%f ?:(=(r %d) &(s.a s.b) |(s.a s.b)) zer] [%f ?:(=(r %d) &(s.a s.b) |(s.a s.b)) zer]
%- |= [a=fn]
?. ?=([%f *] a) a
?. =(a.a 0) a
[%f !=(r %d) zer]
?: =(s.a s.b) ?: =(s.a s.b)
?: s.a (^add +>.a +>.b &) ?: s.a (^add +>.a +>.b &)
(fli (^add +>.a +>.b &)) (fli (^add +>.a +>.b &))
?: s.a (^sub +>.a +>.b &) ?: s.a (^sub +>.a +>.b &)
(^sub +>.b +>.a &) (^sub +>.b +>.a &)
:: ::
++ sub ++ sub :: subtract
|= [a=fn b=fn] ^- fn (add a (fli b)) |= [a=fn b=fn] ^- fn (add a (fli b))
:: ::
++ mul ++ mul :: multiply
|= [a=fn b=fn] ^- fn |= [a=fn b=fn] ^- fn
?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~]
?: ?=([%i *] a) ?: ?=([%i *] a)
@ -1642,7 +1642,7 @@
?: |(=(a.a 0) =(a.b 0)) [%f =(s.a s.b) zer] ?: |(=(a.a 0) =(a.b 0)) [%f =(s.a s.b) zer]
[%f =(s.a s.b) (sum:si e.a e.b) (^^mul a.a a.b)] [%f =(s.a s.b) (sum:si e.a e.b) (^^mul a.a a.b)]
:: ::
++ div ++ div :: divide
|= [a=fn b=fn] ^- fn |= [a=fn b=fn] ^- fn
?: |(?=([%n *] a) ?=([%n *] b)) [%n ~] ?: |(?=([%n *] a) ?=([%n *] b)) [%n ~]
?: ?=([%i *] a) ?: ?=([%i *] a)
@ -1653,8 +1653,8 @@
?: =(s.a s.b) (^div +>.a +>.b) ?: =(s.a s.b) (^div +>.a +>.b)
=.(r swr (fli (^div +>.a +>.b))) =.(r swr (fli (^div +>.a +>.b)))
:: ::
++ fma :: a * b + c ++ fma :: fused multiply-add
|= [a=fn b=fn c=fn] ^- fn |= [a=fn b=fn c=fn] ^- fn :: (a * b) + c
(add (emu a b) c) (add (emu a b) c)
:: ::
++ sqt :: square root ++ sqt :: square root
@ -1664,20 +1664,21 @@
?~ a.a [%f s.a zer] ?~ a.a [%f s.a zer]
?: s.a (^sqt +>.a) [%n ~] ?: s.a (^sqt +>.a) [%n ~]
:: ::
++ inv ++ inv :: inverse
|= [a=fn] ^- fn |= [a=fn] ^- fn
(div [%f & --0 1] a) (div [%f & --0 1] a)
:: ::
++ sun ++ sun :: unsigned integer to float
|= [a=@u] ^- fn |= [a=@u] ^- fn
(rou [%f & --0 a]) (rou [%f & --0 a])
:: ::
++ san ++ san :: signed integer to float
|= [a=@s] ^- fn |= [a=@s] ^- fn
=+ b=(old:si a) =+ b=(old:si a)
(rou [%f -.b --0 +.b]) (rou [%f -.b --0 +.b])
:: ::
++ lth :: comparisons return ~ in the event of a NaN
++ lth :: less-than
|= [a=fn b=fn] ^- (unit ,?) |= [a=fn b=fn] ^- (unit ,?)
?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~ ?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~
?: =(a b) | ?: =(a b) |
@ -1688,7 +1689,7 @@
?: !=(s.a s.b) s.b ?: !=(s.a s.b) s.b
?: s.a (^lth +>.a +>.b) (^lth +>.b +>.a) ?: s.a (^lth +>.a +>.b) (^lth +>.b +>.a)
:: ::
++ lte ++ lte :: less-equal
|= [a=fn b=fn] ^- (unit ,?) |= [a=fn b=fn] ^- (unit ,?)
?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~ ?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~
?: =(a b) & ?: =(a b) &
@ -1699,7 +1700,7 @@
?: !=(s.a s.b) s.b ?: !=(s.a s.b) s.b
?: s.a (^lte +>.a +>.b) (^lte +>.b +>.a) ?: s.a (^lte +>.a +>.b) (^lte +>.b +>.a)
:: ::
++ equ ++ equ :: equal
|= [a=fn b=fn] ^- (unit ,?) |= [a=fn b=fn] ^- (unit ,?)
?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~ ?: |(?=([%n *] a) ?=([%n *] b)) ~ :- ~
?: =(a b) & ?: =(a b) &
@ -1709,10 +1710,10 @@
?: |(=(e.a e.b) !=(s.a s.b)) | ?: |(=(e.a e.b) !=(s.a s.b)) |
(^equ +>.a +>.b) (^equ +>.a +>.b)
:: ::
++ gte ++ gte :: greater-equal
|= [a=fn b=fn] ^- (unit ,?) (lte b a) |= [a=fn b=fn] ^- (unit ,?) (lte b a)
:: ::
++ gth ++ gth :: greater-than
|= [a=fn b=fn] ^- (unit ,?) (lth b a) |= [a=fn b=fn] ^- (unit ,?) (lth b a)
:: ::
++ drg :: float to decimal ++ drg :: float to decimal
@ -1732,29 +1733,41 @@
(mul [%f s.a --0 a.a] [%f & e.a (pow 5 q)]) (mul [%f s.a --0 a.a] [%f & e.a (pow 5 q)])
(div [%f s.a --0 a.a] [%f & (sun:si q) (pow 5 q)]) (div [%f s.a --0 a.a] [%f & (sun:si q) (pow 5 q)])
:: ::
++ toi :: round to integer ++ toi :: round to integer @s
|= [a=fn] ^- (unit ,@s)
=+ b=(toj a)
?. ?=([%f *] b) ~ :- ~
=+ c=(^^mul (bex (abs:si e.b)) a.b)
(new:si s.b c)
::
++ toj :: round to integer fn
|= [a=fn] ^- fn |= [a=fn] ^- fn
?. ?=([%f *] a) a ?. ?=([%f *] a) a
?~ a.a [%f s.a zer] ?~ a.a [%f s.a zer]
?: s.a (^toi +>.a) ?: s.a (^toj +>.a)
=.(r swr (fli (^toi +>.a))) =.(r swr (fli (^toj +>.a)))
-- --
:: ::
++ ff :: ieee754 format ++ ff :: ieee 754 format floating point
|_ [[w=@u p=@u b=@s] r=?(%n %u %d %z %a)] |_ [[w=@u p=@u b=@s] r=?(%n %u %d %z %a)]
:: this core has no use outside of the functionality
:: provided to ++rd, ++rs, ++rq, and ++rh
:: ::
++ sz +((^add w p)) :: w=width: bits in exponent field
++ sb (bex (^add w p)) :: p=precision: bits in fraction field
++ me (dif:si (dif:si --1 b) (sun:si p)) :: w=bias: added to exponent when storing
:: r=rounding mode: same as in ++fl
::
++ sb (bex (^add w p)) :: sign bit
++ me (dif:si (dif:si --1 b) (sun:si p)) :: minimum exponent
:: ::
++ pa ++ pa
%*(. fl p +(p), v me, w (^sub (bex w) 3), d %d, r r) %*(. fl p +(p), v me, w (^sub (bex w) 3), d %d, r r)
:: ::
++ sea ++ sea :: @r to fn
|= [a=@r] ^- fn |= [a=@r] ^- fn
=+ f=(cut 0 [0 p] a) =+ [f=(cut 0 [0 p] a) e=(cut 0 [p w] a)]
=+ e=(cut 0 [p w] a) =+ s=(sig a)
=+ s==(0 (cut 0 [(^add p w) 1] a))
?: =(e 0) ?: =(e 0)
?: =(f 0) [%f s --0 0] [%f s me f] ?: =(f 0) [%f s --0 0] [%f s me f]
?: =(e (fil 0 w 1)) ?: =(e (fil 0 w 1))
@ -1763,9 +1776,9 @@
=+ r=(^add f (bex p)) =+ r=(^add f (bex p))
[%f s q r] [%f s q r]
:: ::
++ bit |= [a=fn] (bif (rou:pa a)) ++ bit |= [a=fn] (bif (rou:pa a)) :: fn to @r with rounding
:: ::
++ bif ++ bif :: fn to @r without rounding
|= [a=fn] ^- @r |= [a=fn] ^- @r
?: ?=([%i *] a) ?: ?=([%i *] a)
=+ q=(lsh 0 p (fil 0 w 1)) =+ q=(lsh 0 p (fil 0 w 1))
@ -1781,180 +1794,280 @@
=+ r=(^add (lsh 0 p (abs:si q)) (end 0 p a.a)) =+ r=(^add (lsh 0 p (abs:si q)) (end 0 p a.a))
?: s.a r (^add r sb) ?: s.a r (^add r sb)
:: ::
++ sig ++ sig :: get sign
|= [a=@r] ^- ? |= [a=@r] ^- ?
=(0 (cut 0 [(^add p w) 1] a)) =(0 (cut 0 [(^add p w) 1] a))
:: ::
++ exp ++ exp :: get exponent
|= [a=@r] ^- @s |= [a=@r] ^- @s
(dif:si (sun:si (cut 0 [p w] a)) b) (dif:si (sun:si (cut 0 [p w] a)) b)
:: ::
++ toi ++ add :: add
|= [a=@r] ^- (unit ,@s) |= [a=@r b=@r]
=+ b=(toi:pa (sea a)) (bif (add:pa (sea a) (sea b)))
?. ?=([%f *] b) ~ :- ~
=+ c=(^mul (bex (abs:si e.b)) a.b)
(new:si s.b c)
:: ::
++ add |= [a=@r b=@r] (bif (add:pa (sea a) (sea b))) ++ sub :: subtract
++ sub |= [a=@r b=@r] (bif (sub:pa (sea a) (sea b))) |= [a=@r b=@r]
++ mul |= [a=@r b=@r] (bif (mul:pa (sea a) (sea b))) (bif (sub:pa (sea a) (sea b)))
++ div |= [a=@r b=@r] (bif (div:pa (sea a) (sea b))) ::
++ fma |= [a=@r b=@r c=@r] (bif (fma:pa (sea a) (sea b) (sea c))) ++ mul :: multiply
++ sqt |= [a=@r] (bif (sqt:pa (sea a))) |= [a=@r b=@r]
++ sun |= [a=@u] (bit [%f & --0 a]) (bif (mul:pa (sea a) (sea b)))
++ san |= [a=@s] (bit [%f (syn:si a) --0 (abs:si a)]) ::
++ lth |= [a=@r b=@r] (fall (lth:pa (sea a) (sea b)) |) ++ div :: divide
++ lte |= [a=@r b=@r] (fall (lte:pa (sea a) (sea b)) |) |= [a=@r b=@r]
++ equ |= [a=@r b=@r] (fall (equ:pa (sea a) (sea b)) |) (bif (div:pa (sea a) (sea b)))
++ gte |= [a=@r b=@r] (fall (gte:pa (sea a) (sea b)) |) ::
++ gth |= [a=@r b=@r] (fall (gth:pa (sea a) (sea b)) |) ++ fma :: fused multiply-add
++ drg |= [a=@r] (drg:pa (sea a)) |= [a=@r b=@r c=@r]
++ grd |= [a=dn] (bif (grd:pa a)) (bif (fma:pa (sea a) (sea b) (sea c)))
::
++ sqt :: square root
|= [a=@r]
(bif (sqt:pa (sea a)))
::
++ lth :: less-than
|= [a=@r b=@r] (fall (lth:pa (sea a) (sea b)) |)
++ lte :: less-equals
|= [a=@r b=@r] (fall (lte:pa (sea a) (sea b)) |)
++ equ :: equals
|= [a=@r b=@r] (fall (equ:pa (sea a) (sea b)) |)
++ gte :: greater-equals
|= [a=@r b=@r] (fall (gte:pa (sea a) (sea b)) |)
++ gth :: greater-than
|= [a=@r b=@r] (fall (gth:pa (sea a) (sea b)) |)
++ sun :: unsigned integer to @r
|= [a=@u] (bit [%f & --0 a])
++ san :: signed integer to @r
|= [a=@s] (bit [%f (syn:si a) --0 (abs:si a)])
++ toi :: round to integer
|= [a=@r] (toi:pa (sea a))
++ drg :: @r to decimal float
|= [a=@r] (drg:pa (sea a))
++ grd :: decimal float to @r
|= [a=dn] (bif (grd:pa a))
-- --
:: ::
++ rlyd |= a=@rd ^- dn (drg:rd a) ++ rlyd |= a=@rd ^- dn (drg:rd a) :: prepare @rd for printing
++ rlys |= a=@rs ^- dn (drg:rs a) ++ rlys |= a=@rs ^- dn (drg:rs a) :: prepare @rs for printing
++ rlyh |= a=@rh ^- dn (drg:rh a) ++ rlyh |= a=@rh ^- dn (drg:rh a) :: prepare @rh for printing
++ rlyq |= a=@rq ^- dn (drg:rq a) ++ rlyq |= a=@rq ^- dn (drg:rq a) :: prepare @rq for printing
++ ryld |= a=dn ^- @rd (grd:rd a) ++ ryld |= a=dn ^- @rd (grd:rd a) :: finish parsing of @rd
++ ryls |= a=dn ^- @rs (grd:rs a) ++ ryls |= a=dn ^- @rs (grd:rs a) :: finish parsing of @rs
++ rylh |= a=dn ^- @rh (grd:rh a) ++ rylh |= a=dn ^- @rh (grd:rh a) :: finish parsing of @rh
++ rylq |= a=dn ^- @rq (grd:rq a) ++ rylq |= a=dn ^- @rq (grd:rq a) :: finish parsing of @rq
:: ::
++ rd ++ rd :: double precision floating point
~% %rd +> ~ ~% %rd +> ~
|_ r=?(%n %u %d %z) |_ r=?(%n %u %d %z)
:: round to nearest, round up, round down, round to zero
::
++ ma ++ ma
%*(. ff w 11, p 52, b --1.023, r r) %*(. ff w 11, p 52, b --1.023, r r)
++ sea
|= [a=@rd] (sea:ma a)
++ bit
|= [a=fn] ^- @rd (bit:ma a)
++ add ~/ %add
|= [a=@rd b=@rd] ^- @rd ~| %rd-fail (add:ma a b)
++ sub ~/ %sub
|= [a=@rd b=@rd] ^- @rd ~| %rd-fail (sub:ma a b)
++ mul ~/ %mul
|= [a=@rd b=@rd] ^- @rd ~| %rd-fail (mul:ma a b)
++ div ~/ %div
|= [a=@rd b=@rd] ^- @rd ~| %rd-fail (div:ma a b)
++ fma ~/ %fma
|= [a=@rd b=@rd c=@rd] ^- @rd ~| %rd-fail (fma:ma a b c)
++ sqt ~/ %sqt
|= [a=@rd] ^- @rd ~| %rd-fail (sqt:ma a)
:: ::
++ sun |= [a=@u] ^- @rd (sun:ma a) ++ sea :: @rd to fn
++ san |= [a=@s] ^- @rd (san:ma a) |= [a=@rd] (sea:ma a)
++ lth ~/ %lth |= [a=@rd b=@rd] ~| %rd-fail (lth:ma a b) ::
++ lte ~/ %lte |= [a=@rd b=@rd] ~| %rd-fail (lte:ma a b) ++ bit :: fn to @rd
++ equ ~/ %equ |= [a=@rd b=@rd] ~| %rd-fail (equ:ma a b) |= [a=fn] ^- @rd (bit:ma a)
++ gte ~/ %gte |= [a=@rd b=@rd] ~| %rd-fail (gte:ma a b) ::
++ gth ~/ %gth |= [a=@rd b=@rd] ~| %rd-fail (gth:ma a b) ++ add ~/ %add :: add
++ sig |= [a=@rd] (sig:ma a) |= [a=@rd b=@rd] ^- @rd ~| %rd-fail
++ exp |= [a=@rd] (exp:ma a) (add:ma a b)
++ toi |= [a=@rd] (toi:ma a) ::
++ drg |= [a=@rd] (drg:ma a) ++ sub ~/ %sub :: subtract
++ grd |= [a=dn] (grd:ma a) |= [a=@rd b=@rd] ^- @rd ~| %rd-fail
(sub:ma a b)
::
++ mul ~/ %mul :: multiply
|= [a=@rd b=@rd] ^- @rd ~| %rd-fail
(mul:ma a b)
::
++ div ~/ %div :: divide
|= [a=@rd b=@rd] ^- @rd ~| %rd-fail
(div:ma a b)
::
++ fma ~/ %fma :: fused multiply-add
|= [a=@rd b=@rd c=@rd] ^- @rd ~| %rd-fail
(fma:ma a b c)
::
++ sqt ~/ %sqt :: square root
|= [a=@rd] ^- @rd ~| %rd-fail
(sqt:ma a)
::
++ lth ~/ %lth :: less-than
|= [a=@rd b=@rd] ~| %rd-fail (lth:ma a b)
++ lte ~/ %lte :: less-equals
|= [a=@rd b=@rd] ~| %rd-fail (lte:ma a b)
++ equ ~/ %equ :: equals
|= [a=@rd b=@rd] ~| %rd-fail (equ:ma a b)
++ gte ~/ %gte :: greater-equals
|= [a=@rd b=@rd] ~| %rd-fail (gte:ma a b)
++ gth ~/ %gth :: greater-than
|= [a=@rd b=@rd] ~| %rd-fail (gth:ma a b)
::
++ sun |= [a=@u] ^- @rd (sun:ma a) :: unsigned integer to @rd
++ san |= [a=@s] ^- @rd (san:ma a) :: signed integer to @rd
++ sig |= [a=@rd] ^- ? (sig:ma a) :: get sign
++ exp |= [a=@rd] ^- @s (exp:ma a) :: get exponent
++ toi |= [a=@rd] ^- (unit ,@s) (toi:ma a) :: round to integer
++ drg |= [a=@rd] ^- dn (drg:ma a) :: @rd to decimal float
++ grd |= [a=dn] ^- @rd (grd:ma a) :: decimal float to @rd
-- --
:: ::
++ rs ++ rs :: single precision floating point
~% %rs +> ~ ~% %rs +> ~
|_ r=?(%n %u %d %z) |_ r=?(%n %u %d %z)
++ ma :: round to nearest, round up, round down, round to zero
%*(. ff w 8, p 23, b --127, r r)
++ sea
|= [a=@rs] (sea:ma a)
++ bit
|= [a=fn] ^- @rs (bit:ma a)
++ add ~/ %add
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail (add:ma a b)
++ sub ~/ %sub
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail (sub:ma a b)
++ mul ~/ %mul
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail (mul:ma a b)
++ div ~/ %div
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail (div:ma a b)
++ fma ~/ %fma
|= [a=@rs b=@rs c=@rs] ^- @rs ~| %rs-fail (fma:ma a b c)
++ sqt ~/ %sqt
|= [a=@rs] ^- @rs ~| %rs-fail (sqt:ma a)
:: ::
++ sun |= [a=@u] ^- @rs (sun:ma a) ++ ma
++ san |= [a=@s] ^- @rs (san:ma a) %*(. ff w 11, p 52, b --1.023, r r)
++ lth ~/ %lth |= [a=@rs b=@rs] ~| %rs-fail (lth:ma a b) ::
++ lte ~/ %lte |= [a=@rs b=@rs] ~| %rs-fail (lte:ma a b) ++ sea :: @rs to fn
++ equ ~/ %equ |= [a=@rs b=@rs] ~| %rs-fail (equ:ma a b) |= [a=@rs] (sea:ma a)
++ gte ~/ %gte |= [a=@rs b=@rs] ~| %rs-fail (gte:ma a b) ::
++ gth ~/ %gth |= [a=@rs b=@rs] ~| %rs-fail (gth:ma a b) ++ bit :: fn to @rs
++ sig |= [a=@rs] (sig:ma a) |= [a=fn] ^- @rs (bit:ma a)
++ exp |= [a=@rs] (exp:ma a) ::
++ toi |= [a=@rs] (toi:ma a) ++ add ~/ %add :: add
++ drg |= [a=@rs] (drg:ma a) |= [a=@rs b=@rs] ^- @rs ~| %rs-fail
++ grd |= [a=dn] (grd:ma a) (add:ma a b)
::
++ sub ~/ %sub :: subtract
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail
(sub:ma a b)
::
++ mul ~/ %mul :: multiply
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail
(mul:ma a b)
::
++ div ~/ %div :: divide
|= [a=@rs b=@rs] ^- @rs ~| %rs-fail
(div:ma a b)
::
++ fma ~/ %fma :: fused multiply-add
|= [a=@rs b=@rs c=@rs] ^- @rs ~| %rs-fail
(fma:ma a b c)
::
++ sqt ~/ %sqt :: square root
|= [a=@rs] ^- @rs ~| %rs-fail
(sqt:ma a)
::
++ lth ~/ %lth :: less-than
|= [a=@rs b=@rs] ~| %rs-fail (lth:ma a b)
++ lte ~/ %lte :: less-equals
|= [a=@rs b=@rs] ~| %rs-fail (lte:ma a b)
++ equ ~/ %equ :: equals
|= [a=@rs b=@rs] ~| %rs-fail (equ:ma a b)
++ gte ~/ %gte :: greater-equals
|= [a=@rs b=@rs] ~| %rs-fail (gte:ma a b)
++ gth ~/ %gth :: greater-than
|= [a=@rs b=@rs] ~| %rs-fail (gth:ma a b)
::
++ sun |= [a=@u] ^- @rs (sun:ma a) :: unsigned integer to @rs
++ san |= [a=@s] ^- @rs (san:ma a) :: signed integer to @rs
++ sig |= [a=@rs] ^- ? (sig:ma a) :: get sign
++ exp |= [a=@rs] ^- @s (exp:ma a) :: get exponent
++ toi |= [a=@rs] ^- (unit ,@s) (toi:ma a) :: round to integer
++ drg |= [a=@rs] ^- dn (drg:ma a) :: @rs to decimal float
++ grd |= [a=dn] ^- @rs (grd:ma a) :: decimal float to @rs
-- --
:: ::
++ rq ++ rq :: quadruple precision floating point
~% %rq +> ~ ~% %rq +> ~
|_ r=?(%n %u %d %z) |_ r=?(%n %u %d %z)
++ ma :: round to nearest, round up, round down, round to zero
%*(. ff w 15, p 112, b --16.383, r r)
++ sea
|= [a=@rq] (sea:ma a)
++ bit
|= [a=fn] ^- @rq (bit:ma a)
++ add ~/ %add
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail (add:ma a b)
++ sub ~/ %sub
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail (sub:ma a b)
++ mul ~/ %mul
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail (mul:ma a b)
++ div ~/ %div
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail (div:ma a b)
++ fma ~/ %fma
|= [a=@rq b=@rq c=@rq] ^- @rq ~| %rq-fail (fma:ma a b c)
++ sqt ~/ %sqt
|= [a=@rq] ^- @rq ~| %rq-fail (sqt:ma a)
:: ::
++ sun |= [a=@u] ^- @rq (sun:ma a) ++ ma
++ san |= [a=@s] ^- @rq (san:ma a) %*(. ff w 11, p 52, b --1.023, r r)
++ lth ~/ %lth |= [a=@rq b=@rq] ~| %rq-fail (lth:ma a b) ::
++ lte ~/ %lte |= [a=@rq b=@rq] ~| %rq-fail (lte:ma a b) ++ sea :: @rq to fn
++ equ ~/ %equ |= [a=@rq b=@rq] ~| %rq-fail (equ:ma a b) |= [a=@rq] (sea:ma a)
++ gte ~/ %gte |= [a=@rq b=@rq] ~| %rq-fail (gte:ma a b) ::
++ gth ~/ %gth |= [a=@rq b=@rq] ~| %rq-fail (gth:ma a b) ++ bit :: fn to @rq
++ sig |= [a=@rq] (sig:ma a) |= [a=fn] ^- @rq (bit:ma a)
++ exp |= [a=@rq] (exp:ma a) ::
++ toi |= [a=@rq] (toi:ma a) ++ add ~/ %add :: add
++ drg |= [a=@rq] (drg:ma a) |= [a=@rq b=@rq] ^- @rq ~| %rq-fail
++ grd |= [a=dn] (grd:ma a) (add:ma a b)
::
++ sub ~/ %sub :: subtract
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail
(sub:ma a b)
::
++ mul ~/ %mul :: multiply
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail
(mul:ma a b)
::
++ div ~/ %div :: divide
|= [a=@rq b=@rq] ^- @rq ~| %rq-fail
(div:ma a b)
::
++ fma ~/ %fma :: fused multiply-add
|= [a=@rq b=@rq c=@rq] ^- @rq ~| %rq-fail
(fma:ma a b c)
::
++ sqt ~/ %sqt :: square root
|= [a=@rq] ^- @rq ~| %rq-fail
(sqt:ma a)
::
++ lth ~/ %lth :: less-than
|= [a=@rq b=@rq] ~| %rq-fail (lth:ma a b)
++ lte ~/ %lte :: less-equals
|= [a=@rq b=@rq] ~| %rq-fail (lte:ma a b)
++ equ ~/ %equ :: equals
|= [a=@rq b=@rq] ~| %rq-fail (equ:ma a b)
++ gte ~/ %gte :: greater-equals
|= [a=@rq b=@rq] ~| %rq-fail (gte:ma a b)
++ gth ~/ %gth :: greater-than
|= [a=@rq b=@rq] ~| %rq-fail (gth:ma a b)
::
++ sun |= [a=@u] ^- @rq (sun:ma a) :: unsigned integer to @rq
++ san |= [a=@s] ^- @rq (san:ma a) :: signed integer to @rq
++ sig |= [a=@rq] ^- ? (sig:ma a) :: get sign
++ exp |= [a=@rq] ^- @s (exp:ma a) :: get exponent
++ toi |= [a=@rq] ^- (unit ,@s) (toi:ma a) :: round to integer
++ drg |= [a=@rq] ^- dn (drg:ma a) :: @rq to decimal float
++ grd |= [a=dn] ^- @rq (grd:ma a) :: decimal float to @rq
-- --
:: ::
++ rh ++ rh :: half precision floating point
|_ r=?(%n %u %d %z) |_ r=?(%n %u %d %z)
:: round to nearest, round up, round down, round to zero
::
++ ma ++ ma
%*(. ff w 5, p 10, b --15, r r) %*(. ff w 5, p 10, b --15, r r)
++ sea ::
++ sea :: @rh to fn
|= [a=@rh] (sea:ma a) |= [a=@rh] (sea:ma a)
++ bit ::
++ bit :: fn to @rh
|= [a=fn] ^- @rh (bit:ma a) |= [a=fn] ^- @rh (bit:ma a)
++ tos ::
++ tos :: @rh to @rs
|= [a=@rh] (bit:rs (sea a)) |= [a=@rh] (bit:rs (sea a))
++ fos ::
++ fos :: @rs to @rh
|= [a=@rs] (bit (sea:rs a)) |= [a=@rs] (bit (sea:rs a))
:: ::
++ sun |= [a=@u] ^- @rh (sun:ma a) ++ lth ~/ %lth :: less-than
++ san |= [a=@s] ^- @rh (san:ma a) |= [a=@rh b=@rh] ~| %rh-fail (lth:ma a b)
++ lth |= [a=@rh b=@rh] ~| %rh-fail (lth:ma a b) ++ lte ~/ %lte :: less-equals
++ lte |= [a=@rh b=@rh] ~| %rh-fail (lte:ma a b) |= [a=@rh b=@rh] ~| %rh-fail (lte:ma a b)
++ equ |= [a=@rh b=@rh] ~| %rh-fail (equ:ma a b) ++ equ ~/ %equ :: equals
++ gte |= [a=@rh b=@rh] ~| %rh-fail (gte:ma a b) |= [a=@rh b=@rh] ~| %rh-fail (equ:ma a b)
++ gth |= [a=@rh b=@rh] ~| %rh-fail (gth:ma a b) ++ gte ~/ %gte :: greater-equals
++ sig |= [a=@rh] (sig:ma a) |= [a=@rh b=@rh] ~| %rh-fail (gte:ma a b)
++ exp |= [a=@rh] (exp:ma a) ++ gth ~/ %gth :: greater-than
++ toi |= [a=@rh] (toi:ma a) |= [a=@rh b=@rh] ~| %rh-fail (gth:ma a b)
++ drg |= [a=@rh] (drg:ma a) ::
++ grd |= [a=dn] (grd:ma a) ++ sun |= [a=@u] ^- @rh (sun:ma a) :: unsigned integer to @rh
++ san |= [a=@s] ^- @rh (san:ma a) :: signed integer to @rh
++ sig |= [a=@rh] ^- ? (sig:ma a) :: get sign
++ exp |= [a=@rh] ^- @s (exp:ma a) :: get exponent
++ toi |= [a=@rh] ^- (unit ,@s) (toi:ma a) :: round to integer
++ drg |= [a=@rh] ^- dn (drg:ma a) :: @rh to decimal float
++ grd |= [a=dn] ^- @rh (grd:ma a) :: decimal float to @rh
-- --
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: section 2cH, urbit time :: :: section 2cH, urbit time ::