Dragon4 hoon fix

This commit is contained in:
Max G 2017-06-16 02:31:07 -04:00
parent 7dc270f89f
commit d42e7283d4

View File

@ -2006,13 +2006,10 @@
:: ::
=+ m=(met 0 a.a) =+ m=(met 0 a.a)
?> |(s (gth m prc)) :: require precision ?> |(s (gth m prc)) :: require precision
=+ ^= q =+ ^= q %+ max
=+ ^= f :: reduce precision ?: (gth m prc) (^sub m prc) 0 :: reduce precision
?: (gth m prc) (^sub m prc) 0 %- abs:si ?: =(den %i) --0 :: enforce min. prec
=+ ^= g %- abs:si :: enforce min. exp
?: =(den %i) --0
?: =((cmp:si e.a emn) -1) (dif:si emn e.a) --0 ?: =((cmp:si e.a emn) -1) (dif:si emn e.a) --0
(max f g)
=^ b a :- (end 0 q a.a) =^ b a :- (end 0 q a.a)
a(e (sum:si e.a (sun:si q)), a (rsh 0 q a.a)) a(e (sum:si e.a (sun:si q)), a (rsh 0 q a.a))
:: ::
@ -2063,40 +2060,53 @@
?: =(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; get
~/ %drg :: convert to decimal ~/ %drg :: printable decimal;
|= {a/{e/@s a/@u}} ^- {@s @u} |= {a/{e/@s a/@u}} ^- {@s @u} :: guaranteed accurate
?< =(a.a 0) ?< =(a.a 0) :: for rounded floats
=. a (xpd a) =. a (xpd 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)
=+ m=(lsh 0 ?:((syn:si e.a) (abs:si e.a) 0) 1) =+ mn=(lsh 0 ?:((syn:si e.a) (abs:si e.a) 0) 1)
=+ mp=mn
=> ?.
?& =(a.a (bex (dec prc))) :: if next smallest
|(!=(e.a emn) =(den %i)) :: float is half ULP,
== :: tighten lower bound
.
%= .
mp (lsh 0 1 mp)
r (lsh 0 1 r)
s (lsh 0 1 s)
==
=+ [k=--0 q=(^div (^add s 9) 10)] =+ [k=--0 q=(^div (^add s 9) 10)]
|- ?: (^lth r q) |- ?: (^lth r q)
%= $ %= $
k (dif:si k --1) k (dif:si k --1)
r (^mul r 10) r (^mul r 10)
m (^mul m 10) mn (^mul mn 10)
mp (^mul mp 10)
== ==
|- ?: (gte (^add (^mul r 2) m) (^mul s 2)) |- ?: (gte (^add (^mul r 2) mp) (^mul s 2))
$(s (^mul s 10), k (sum:si k --1)) $(s (^mul s 10), k (sum:si k --1))
=+ [u=0 o=0] =+ [u=0 o=0]
|- |- :: r/s+o = a*10^-k
=+ v=(dvr (^mul r 10) s) =+ v=(dvr (^mul r 10) s)
=> %= . => %= .
k (dif:si k --1) k (dif:si k --1)
u p.v u p.v
r q.v r q.v
m (^mul m 10) mn (^mul mn 10)
mp (^mul mp 10)
== ==
=+ l=(^lth (^mul r 2) m) =+ l=(^lth (^mul r 2) mn) :: in lower bound
=+ ^= h =+ ^= h :: in upper bound
?| (^lth (^mul s 2) m) ?| (^lth (^mul s 2) mp)
(gth (^mul r 2) (^sub (^mul s 2) m)) (gth (^mul r 2) (^sub (^mul s 2) mp))
== ==
?: &(!l !h) ?: &(!l !h)
$(o (^add (^mul o 10) u)) $(o (^add (^mul o 10) u))
=+ q=&(h |(!l (gte (^mul r 2) s))) =+ q=&(h |(!l (gth (^mul r 2) s)))
=. o (^add (^mul o 10) ?:(q +(u) u)) =. o (^add (^mul o 10) ?:(q +(u) u))
[k o] [k o]
:: ::