ref: 2f2e574cc824695de2d5e2b233063afd6e7814bb
parent: 7f941fe7689b6085a18d67389eb7cd7f8b3fae48
author: Ori Bernstein <[email protected]>
date: Tue Sep 16 21:46:41 EDT 2014
Remove prototype file.
--- a/libstd/fltfmt.myr
+++ /dev/null
@@ -1,200 +1,0 @@
-use "bigint.use"
-
-pkg std =
- const float64bfmt :
- const float32bfmt :
-
-const Dblbias = 1023
-const Fltbias
-
-const fltbfmt = {buf, dbl
- var sign, exp, mant
-
- (sign, mant, exp) = float64explode(dbl)
- -> dragon4(buf, sign, mant, (exp - 52) castto(int64), DblBias, `Normal, -32)
-}
-
-type cutmode = union
- `Normal
- `Absolute
- `Relative
-;;
-
-/*
-buf: output buffer
-e: exponent
-p: precision
-f: mantissa
-
-floating value: x = f^(e - p)
-*/
-const dragon4 = {buf, isneg, f, e, p, mode, cutoff
- var r, s, t, u, v
- var udig
- var mm, mp /* margins above and below */
- var roundup
- var low, high
- var k : int, n
-
- put("encoding... isneg = %t, f = %xl, exp = %l, p = %l\n", isneg, f, e, p)
- /* if we have zero for the mantissa, we can return early */
- n = 0
- if isneg
- n += bfmt(buf, "-")
- ;;
- if f == 0
- n += bfmt(buf, "0.0")
- -> buf[:n]
- ;;
-
- /* initialize */
- roundup = false
- r = mkbigint(f)
- r = bigshli(r, max(e - p, 0))
- s = bigshli(mkbigint(1), max(0, -(e - p)))
- mm = bigshli(mkbigint(1), max((e - p), 0))
- mp = bigdup(mm)
- put("r = %s, s = %s, mm = %s, mp = %s\n", \
- bigfmt(r, 0), bigfmt(s, 0), bigfmt(mm, 0), bigfmt(mp, 0))
-
- /* fixup: unequal gaps */
- t = mkbigint(1)
- bigshli(t, p - 1)
- if bigeqi(t, f)
- bigshli(mp, 1)
- bigshli(r, 1)
- bigshli(s, 1)
- ;;
- bigfree(t)
-
- put("r = %s, s = %s, mm = %s, mp = %s\n", \
- bigfmt(r, 0), bigfmt(s, 0), bigfmt(mm, 0), bigfmt(mp, 0))
-
- k = 0
- while true
- /* r < ceil(s/b) */
- t = bigdup(s)
- bigaddi(t, 9)
- bigdivi(t, 10)
- match bigcmp(r, t)
- | `Before:
- k--
- bigmuli(r, 10)
- bigmuli(mm, 10)
- bigmuli(mp, 10)
- | _:
- bigfree(t)
- break
- ;;
- bigfree(t)
- ;;
- put("r = %s, s = %s, mm = %s, mp = %s\n", \
- bigfmt(r, 0), bigfmt(s, 0), bigfmt(mm, 0), bigfmt(mp, 0))
-
- t = bigdup(r)
- bigshli(t, 1)
- bigadd(t, mp)
- while true
- u = bigdup(s)
- bigshli(u, 1)
- put("t = 2*r + mp = %s, u = 2*s = %s\n", bigfmt(t, 0), bigfmt(u, 0))
- put("s = %s\n", bigfmt(s, 0))
- match bigcmp(t, u)
- | `Before:
- bigfree(u)
- break
- | _:
- k++
- bigmuli(s, 10)
- bigfree(u)
- ;;
- ;;
- cutoff = k - buf.len - 1
- bigfree(t)
- put("r = %s, s = %s, mm = %s, mp = %s, cutoff = %i\n", \
- bigfmt(r, 0), bigfmt(s, 0), bigfmt(mm, 0), bigfmt(mp, 0), \
- cutoff)
-
- if k <= 0
- n += bfmt(buf[n:], "0.")
- ;;
- while true
- k--
- bigmuli(r, 10)
- u = bigdup(r);
- bigdiv(u, s)
-
- bigmod(r, s)
- bigmuli(mm, 10)
- bigmuli(mp, 10)
-
- low = false
- t = bigdup(r)
- bigshli(t, 1)
- put("t = %s, mm = %s\n", bigfmt(t, 0), bigfmt(mm, 0))
- match bigcmp(t, mm)
- | `Before: low = true
- ;;
- bigfree(t)
-
- v = bigdup(r)
- bigshli(v, 1)
- t = bigdup(s)
- bigshli(t, 1)
- bigsub(t, mp)
- match bigcmp(v, t)
- | `After: high = true
- | `Equal: high = roundup
- | `Before: high = false
- ;;
- bigfree(v)
- bigfree(t)
- if low || high || k == cutoff
- put("low = %t, high = %t, k == cutoff = %t\n", \
- low, high, k == cutoff)
- break
- ;;
- n += format(buf[n:], lowdig(u), k)
- bigfree(u)
- ;;
-
- /* format the last digit */
- udig = lowdig(u)
- if low && !high
- n += format(buf[n:], udig, k)
- elif high && !low
- n += format(buf[n:], udig + 1, k)
- else
- bigmuli(r, 2)
- match bigcmp(r, s)
- | `Before: n += format(buf[n:], udig, k)
- | `Equal: n += format(buf[n:], udig, k)
- | `After: n += format(buf[n:], udig + 1, k)
- ;;
- ;;
- put("n = %i\n", n)
- -> buf[:n]
-}
-
-const lowdig = {u
- if u.dig.len > 0
- -> u.dig[0]
- ;;
- -> 0
-}
-
-const format = {buf, d, k
- const dig = "0123456789"
- var n, i
-
- n = 0
- if k == 0
- n += encode(buf[n:], '.')
- elif k < 0
- for i = 0; i < -k; i++
- n += encode(buf[n:], '0')
- ;;
- ;;
- buf[n++] = dig[d]
- -> n
-}