Urbit / Docs

3b: floating point

++fn

Float

A mold for the floating-point arithmetic using the base of two, the formula is (-1)^s * a * 2^e.

Produces either a float ($f), an infinity of other sign ($i), or not-a-number ($n). s refers to sign, the flags & or |; e to exponent, a signed decimal; and a to the significand, an unsigned integer.

Source

    ++  fn
            $%  [$f s=? [email protected] [email protected]]
                [$i s=?]
                [$n ~]
            ==

Examples

    > *fn
    [%n ~]

    > (add:fl [%f & --33 2] [%f | --23 2])
    [%f s=%.y e=-79 a=10.374.452.512.267.829.421.849.019.032.797.184]

    > (add:fl [%i &] [%i &])
    [%i s=%.y]

    > (add:fl [%n ~] [%i |])
    [%n ~]

    > (sun:fl 961.193.554.848.514.048.973.893.027.381.506.219.443)
    [%f s=%.y e=--17 a=7.333.324.850.834.000.007.430.214.137.126.970]

++dn

Decimal float

A mold for the floating-point arithmetic using the base of 10; the formula is (-1)^s * a *10^e.

Valid values are a float ($d), an infinity ($i), or a not-a-number ($n). s refers to sign, the flags & or |; e to exponent, a signed decimal; and a to the significand, an unsigned integer.

    ++  dn
            $%  [$d s=? [email protected] [email protected]]
                [$i s=?]
                [$n ~]
            ==

Examples

    > `dn`[%d & --0 17.163.091.968]
    [%d s=%.y e=--0 a=17.163.091.968]

    > `dn`[%i s=%.y]
    [%i s=%.y]

    > `dn`[%n ~]
    [%n ~]

++rn

Parsed decimal float

A mold for the floating-point arithmetic using the base of 10; the formula is (-1)^s * a *10^e.

Produces either a parsed float ($d), infinity of either sign ($i), or not-a-number ($n).

Source

        $%  [$d a=? b=[[email protected] [[email protected] [email protected]] f=? [email protected]]]
            [$i a=?]
            [$n ~]
        ==

Examples

    > `rn`[%d | [2 [3 4] | 17.163]]
    [%d a=%.n b=[c=2 [d=3 e=4] f=%.n i=17.163]]

++fl

Arbitrary-precision floating-point

Container arm for floating-point arithmetic functions.

  • Precision (p): number of bits in the significand; must be at least 2. Default is 113.

  • Minimum exponent (v): minimum value of e. Default is -16.494.

  • Width (w): Max value of e minus min value of e. 0 is for fixed-point. Default is 32.988.

  • Rounding mode (r): Possible modes are nearest ($n), up ($u), down ($d), to zero ($z), and away from zero ($a). Default value is %n.

  • Behavior (d): return denormals ($d), flush denormals to zero ($z), infinite exponent range ($i). Default value is %d.

Source

  ++  fl
    =+  ^-  [[[email protected] [email protected] [email protected]] r=$?($n $u $d $z $a) d=$?($d $f $i)]
      [[113 -16.494 32.765] %n %d]
    =>
      ~%  %cofl  +>  ~
      |%

++rou:fl

Round

Rounds a to a the nearest float that can be represented with a 113-bit significand. There is no term to sign the significand, meaning that a positive sign will always be produced.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

An fn.

Source

        ++  rou
          |=  [a=[[email protected] [email protected]]]  ^-  fn  (rau a &)

Examples

    > =a 10.161.487.211.429.486.882.397.572.894.294.017.777
    > (^rou:fl [--12 a])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.002]

    > (^rou:fl [--12 (add a 1)])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.002]

    > (^rou:fl [--12 (add a 300)])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.002]

    > (^rou:fl [--12 (add a 1.000)])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.003]

++rau:fl

Various roundings

Rounds a based on what the state of of r in the core contained in fl. t is a sticky bit that represents a value less than ULP(a) = 2^(e.a) when passed to lug:fl.

Accepts

a is a cell of a signed integer and an unsigned integer.

t is a flag.

Produces

An fn.

Source

        ++  rau
          |=  [a=[[email protected] [email protected]] t=?]  ^-  fn
          ?-  r
            $z  (lug %fl a t)  $d  (lug %fl a t)
            $a  (lug %ce a t)  $u  (lug %ce a t)
            $n  (lug %ne a t)
          ==

Examples

    > (rau:fl [-18 342.602.577] &)
    [%f s=%.y e=-102 a=6.626.897.619.228.945.634.459.505.846.648.832]

Discussion

See lug:fl for possible rounding operations.


++add:fl

Add

Produces the sum of a and b. e is used to choose between an exact result (any-sized significand) or a rounded result (113-bit significand).

There is no term to sign the significands, so a positive sign will always be produced.

Accepts

a is an fn.

b is an fn

e is a flag.

Produces

An fn.

Source

        ++  add
          |=  [a=[[email protected] [email protected]] b=[[email protected] [email protected]] e=?]  ^-  fn
          =+  q=(dif:si e.a e.b)
          |-  ?.  (syn:si q)  $(b a, a b, q +(q))           ::  a has larger exp
          ?:  e
            [%f & e.b (^add (lsh 0 (abs:si q) a.a) a.b)]
          =+  [ma=(met 0 a.a) mb=(met 0 a.b)]
          =+  ^=  w  %+  dif:si  e.a  %-  sun:si            ::  expanded exp of a
            ?:  (gth prc ma)  (^sub prc ma)  0
          =+  ^=  x  %+  sum:si  e.b  (sun:si mb)           ::  highest exp for b
          ?:  =((cmp:si w x) --1)                           ::  don't need to add
            ?-  r
              $z  (lug %fl a &)  $d  (lug %fl a &)
              $a  (lug %lg a &)  $u  (lug %lg a &)
              $n  (lug %na a &)
            ==
          (rou [e.b (^add (lsh 0 (abs:si q) a.a) a.b)])

Examples

    > (^add:fl [--33 2.718] [--23 11] %.y)
    [%f s=%.y e=--23 a=2.783.243]

    > (^add:fl [--33 2.718] [--23 11] %.n)
    [%f s=%.y e=-68 a=6.890.975.897.521.519.304.902.126.405.156.864]

++sub:fl

Subtract

Produces the difference of a minus b. e is used to choose between an exact result (any-sized significand) or a rounded result (113-bit significand).

Accepts

a is a cell of a signed integer and an unsigned integer.

b is a cell of a signed integer and an unsigned integer.

e is a flag.

Produces

An fn.

Source

        ++  sub
          |=  [a=[[email protected] [email protected]] b=[[email protected] [email protected]] e=?]  ^-  fn
          =+  q=(dif:si e.a e.b)
          |-  ?.  (syn:si q)
            (fli $(b a, a b, q +(q), r swr))
          =+  [ma=(met 0 a.a) mb=(met 0 a.b)]
          =+  ^=  w  %+  dif:si  e.a  %-  sun:si
            ?:  (gth prc ma)  (^sub prc ma)  0
          =+  ^=  x  %+  sum:si  e.b  (sun:si +(mb))
          ?:  &(!e =((cmp:si w x) --1))
            ?-  r
              $z  (lug %sm a &)  $d  (lug %sm a &)
              $a  (lug %ce a &)  $u  (lug %ce a &)
              $n  (lug %nt a &)
            ==
          =+  j=(lsh 0 (abs:si q) a.a)
          |-  ?.  (gte j a.b)
            (fli $(a.b j, j a.b, r swr))
          =+  i=(^sub j a.b)
          ?~  i  [%f & zer]
          ?:  e  [%f & e.b i]  (rou [e.b i])

Examples

    > (^sub:fl [--33 2.718] [--23 11] %.y)
    [%f s=%.y e=--23 a=2.783.221]

    > (^sub:fl [--33 2.718] [--63 11] %.y)
    [%f s=%.n e=--33 a=11.811.157.346]

++mul:fl

Multiply

Produces the product of a multiplied by b. There is no term to sign the significands, so a positive sign will always be produced.

Accepts

a is a cell of a signed integer and an unsigned integer.

b is a cell of a signed integer and an unsigned integer.

Produces

An fn.

Source

        ++  mul
          |=  [a=[[email protected] [email protected]] b=[[email protected] [email protected]]]  ^-  fn
          (rou (sum:si e.a e.b) (^mul a.a a.b))

Examples

    > (^mul:fl [--3 2.718] [--23 11])
    [%f s=%.y e=-72 a=9.475.054.411.405.900.661.487.108.108.582.912]

++div:fl

Divide

Produces the quotient of a divided by b. There is no term to sign the significands, so a positive sign will always be produced.

Accepts

a is a cell of a signed integer and an unsigned integer.

b is a cell of a signed integer and an unsigned integer.

Produces

An fn.

Source

        ++  div
          |=  [a=[[email protected] [email protected]] b=[[email protected] [email protected]]]  ^-  fn
          =+  [ma=(met 0 a.a) mb=(met 0 a.b)]
          =+  v=(dif:si (sun:si ma) (sun:si +((^add mb prc))))
          =.  a  ?:  (syn:si v)  a
          a(e (sum:si v e.a), a (lsh 0 (abs:si v) a.a))
          =+  [j=(dif:si e.a e.b) q=(dvr a.a a.b)]
          (rau [j p.q] =(q.q 0))

Examples

    > (^div:fl [--13 2.718] [--23 11])
    [%f s=%.y e=-115 a=10.023.198.055.040.952.765.870.659.817.343.907]

++sqt:fl

Square root

Produces the square root of a.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

An fn.

Source

        ++  sqt
          |=  [a=[[email protected] [email protected]]]  ^-  fn
          =.  a
            =+  [w=(met 0 a.a) x=(^mul +(prc) 2)]
            =+  ?:((^lth w x) (^sub x w) 0)
            =+  ?:  =((dis - 1) (dis (abs:si e.a) 1))  -
              (^add - 1)
            a(e (dif:si e.a (sun:si -)), a (lsh 0 - a.a))
          =+  [y=(^sqt a.a) z=(fra:si e.a --2)]
          (rau [z p.y] =(q.y 0))

Examples

    > (^sqt:fl [-18 342.602.577])
    [%f s=%.y e=-107 a=5.865.903.143.604.945.574.132.671.852.050.553]

++lth:fl

Less than

Tests if a is less than b.

Accepts

a is a cell of a signed integer and an unsigned integer.

b is a cell of a signed integer and an unsigned integer.

Produces

An flag.

Source

        ++  lth
          |=  [a=[[email protected] [email protected]] b=[[email protected] [email protected]]]  ^-  ?
          ?:  =(e.a e.b)  (^lth a.a a.b)
          =+  c=(cmp:si (ibl a) (ibl b))
          ?:  =(c -1)  &  ?:  =(c --1)  |
          ?:  =((cmp:si e.a e.b) -1)
            (^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)

Examples

    > (^lth:fl [-4 684] [--0 35])
    %.n

    > (^lth:fl [-4 684] [--0 90])
    %.y

++equ:fl

Equals

Tests if a is equal to b.

Accepts

a is a cell of a signed integer and an unsigned integer.

b is a cell of a signed integer and an unsigned integer.

Produces

A flag.

Source

        ++  equ
          |=  [a=[[email protected] [email protected]] b=[[email protected] [email protected]]]  ^-  ?
          ?.  =((ibl a) (ibl b))  |
          ?:  =((cmp:si e.a e.b) -1)
            =((lsh 0 (abs:si (dif:si e.a e.b)) a.b) a.a)
          =((lsh 0 (abs:si (dif:si e.a e.b)) a.a) a.b)

Examples

    > (^equ:fl [-4 480] [-0 50])
    %.n

    > (^equ:fl [-4 480] [-0 30])
    %.y

++ibl:fl

Integer binary logarithm

Produces the lowest power to which the number 2 must be raised to obtain a or greater.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

A signed integer.

Source

        ++  ibl
          |=  [a=[[email protected] [email protected]]]  ^-  @s
          (sum:si (sun:si (dec (met 0 a.a))) e.a)

Examples

    > (ibl:fl [-18 342.602.577])
    --10

++uni:fl

Change representation to odd

Produces another representation of the floating point a where the significand is odd. Every floating-point number has a unique representation of this kind. If the significand of a is already odd, nothing changes.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

A cell of a signed integer and an unsigned integer.

Source

        ++  uni
          |=  [a=[[email protected] [email protected]]]
          |-  ?:  =((end 0 1 a.a) 1)  a
          $(a.a (rsh 0 1 a.a), e.a (sum:si e.a --1))

Examples

    > (uni:fl [-8 342.602.578])
    [e=-7 a=171.301.289]

    > (uni:fl [-8 342.602.577])
    [e=-8 a=342.602.577]

++xpd:fl

Expand

Produces the fully precise form of a, or the denormalized form of a.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

A cell of a signed integer and an unsigned integer.

Sources

        ++  xpd
          |=  [a=[[email protected] [email protected]]]
          =+  ma=(met 0 a.a)
          ?:  (gte ma prc)  a
          =+  ?:  =(den %i)  (^sub prc ma)
              =+  ^=  q
                =+  w=(dif:si e.a emn)
                ?:  (syn:si w)  (abs:si w)  0
              (min q (^sub prc ma))
          a(e (dif:si e.a (sun:si -)), a (lsh 0 - a.a))

Examples

    > (xpd:fl [--3 12])
    [e=-106 a=7.788.445.287.802.241.442.795.744.493.830.144]

    > (xpd:fl [-8 342.602.577])
    [e=-92 a=6.626.897.619.228.945.634.459.505.846.648.832]

    > (xpd:fl [-92 6.626.897.619.228.945.634.459.505.846.648.832])
    [e=-92 a=6.626.897.619.228.945.634.459.505.846.648.832]

++lug:fl

Central rounding mechanism

Performs various rounding operations on a. An operation is chosen based on the value selected for t. s is a sticky bit that represents a value less than ULP(a) = 2^(e.a)

Possible rounding operations:

  • Floor ($fl)

  • Ceiling ($ce)

  • Smaller ($sm)

  • Larger ($lg)

  • Nearest ($ne) -- Rounds ties away from 0 if the number is even, rounds toward 0 if the number is odd.

Accepts

t is one of the following: $fl, $ce, $sm, $lg, $ne, $na, or $nt.

a is a cell of a signed integer and an unsigned integer.

s is a flag.

Produces

An fn.

Source

        ::
        ::  central rounding mechanism
        ::  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.a)
        ::
        ++  lug
          ~/  %lug
          |=  [t=$?($fl $ce $sm $lg $ne $na $nt) a=[[email protected] [email protected]] s=?]  ^-  fn
          ?<  =(a.a 0)
          =-
            ?.  =(den %f)  -                                ::  flush denormals
            ?.  ?=([$f *] -)  -
            ?:  =((met 0 ->+>) prc)  -  [%f & zer]
          ::
          =+  m=(met 0 a.a)
          ?>  |(s (gth m prc))                              ::  require precision
          =+  ^=  q  %+  max
              ?:  (gth m prc)  (^sub m prc)  0              ::  reduce precision
            %-  abs:si  ?:  =(den %i)  --0                  ::  enforce min. exp
            ?:  =((cmp:si e.a emn) -1)  (dif:si emn e.a)  --0
          =^  b  a  :-  (end 0 q a.a)
            a(e (sum:si e.a (sun:si q)), a (rsh 0 q a.a))
          ::
          ?~  a.a
            ?<  =(den %i)
            ?-  t
              $fl  [%f & zer]
              $sm  [%f & zer]
              $ce  [%f & spd]
              $lg  [%f & spd]
              $ne  ?:  s  [%f & ?:((lte b (bex (dec q))) zer spd)]
                   [%f & ?:((^lth b (bex (dec q))) zer spd)]
              $nt  ?:  s  [%f & ?:((lte b (bex (dec q))) zer spd)]
                   [%f & ?:((^lth b (bex (dec q))) zer spd)]
              $na  [%f & ?:((^lth b (bex (dec q))) zer spd)]
            ==
          ::
          =.  a  (xpd a)
          ::
          =.  a
            ?-  t
              $fl  a
              $lg  a(a +(a.a))
              $sm  ?.  &(=(b 0) s)  a
                   ?:  &(=(e.a emn) !=(den %i))  a(a (dec a.a))
                   =+  y=(dec (^mul a.a 2))
                   ?.  (lte (met 0 y) prc)  a(a (dec a.a))
                   [(dif:si e.a --1) y]
              $ce  ?:  &(=(b 0) s)  a  a(a +(a.a))
              $ne  ?~  b  a
                   =+  y=(bex (dec q))
                   ?:  &(=(b y) s)                          ::  round halfs to even
                     ?~  (dis a.a 1)  a  a(a +(a.a))
                   ?:  (^lth b y)  a  a(a +(a.a))
              $na  ?~  b  a
                   =+  y=(bex (dec q))
                   ?:  (^lth b y)  a  a(a +(a.a))
              $nt  ?~  b  a
                   =+  y=(bex (dec q))
                   ?:  =(b y)  ?:  s  a  a(a +(a.a))
                   ?:  (^lth b y)  a  a(a +(a.a))
            ==
          ::
          =.  a  ?.  =((met 0 a.a) +(prc))  a
            a(a (rsh 0 1 a.a), e (sum:si e.a --1))
          ?~  a.a  [%f & zer]
          ::
          ?:  =(den %i)  [%f & a]
          ?:  =((cmp:si emx e.a) -1)  [%i &]  [%f & a]      ::  enforce max. exp
        ::

++drg:fl

Get printable decimal

Produces the decimal form of a using the Dragon4 algorithm. Guarantees accurate results for rounded floats.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

A cell of a signed integer and an unsigned integer.

Source

        ++  drg
          ~/  %drg
          |=  [a=[[email protected] [email protected]]]  ^-  [@s @u]
          ?<  =(a.a 0)
          =.  a  (xpd 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)
          =+  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)]
          |-  ?:  (^lth r q)
            %=  $
              k  (dif:si k --1)
              r  (^mul r 10)
              mn  (^mul mn 10)
              mp  (^mul mp 10)
            ==
          |-  ?:  (gte (^add (^mul r 2) mp) (^mul s 2))
            $(s (^mul s 10), k (sum:si k --1))
          =+  [u=0 o=0]
          |-                                                ::  r/s+o = a*10^-k
          =+  v=(dvr (^mul r 10) s)
          =>  %=  .
              k  (dif:si k --1)
              u  p.v
              r  q.v
              mn  (^mul mn 10)
              mp  (^mul mp 10)
            ==
          =+  l=(^lth (^mul r 2) mn)                        ::  in lower bound
          =+  ^=  h                                         ::  in upper bound
            ?|  (^lth (^mul s 2) mp)
                (gth (^mul r 2) (^sub (^mul s 2) mp))
            ==
          ?:  &(!l !h)
            $(o (^add (^mul o 10) u))
          =+  q=&(h |(!l (gth (^mul r 2) s)))
          =.  o  (^add (^mul o 10) ?:(q +(u) u))
          [k o]

Examples

    > (sun:fl 218.116)
    [%f s=%.y e=-95 a=8.640.464.947.480.640.129.276.716.135.743.488]
    > (^drg:fl [e=-95 a=8.640.464.947.480.640.129.276.716.135.743.488])
    [--0 218.116]

    > (sun:fl 102.057.673.128.349)
    [%f s=%.y e=-66 a=7.530.527.107.827.833.883.675.587.233.447.936]
    > (^drg:fl [e=-66 a=7.530.527.107.827.833.883.675.587.233.447.936])
    [--0 102.057.673.128.349]

++toj:fl

Round to integer

Rounds float a to the nearest decimal float with an exponent of 0.

Accepts

a is a cell of a signed integer and an unsigned integer.

Produces

An fn.

Source

        ++  toj
          |=  [a=[[email protected] [email protected]]]  ^-  fn
          ?.  =((cmp:si e.a --0) -1)  [%f & a]
          =+  x=(abs:si e.a)
          =+  y=(rsh 0 x a.a)
          ?:  |(=(r %d) =(r %z))  [%f & --0 y]
          =+  z=(end 0 x a.a)
          ?:  |(=(r %u) =(r %a))  [%f & --0 ?~(z y +(y))]
          =+  i=(bex (dec x))
          ?:  &(=(z i) =((dis y 1) 0))  [%f & --0 y]
          ?:  (^lth z i)  [%f & --0 y]  [%f & --0 +(y)]

Examples

    > (^toj:fl [-11 7.530.107.827.833.587])
    [%f s=%.y e=--0 a=3.676.810.462.809]

    > (^toj:fl [-11 7.530.107.827.833.589])
    [%f s=%.y e=--0 a=3.676.810.462.809]

++ned:fl

Require float

Produces a if a is a is of floating-point representation. If a is another case of fn, such as infinity or not-a-number, a crash is produced.

Accepts

a is an fn.

Produces

A cell of a signed integer and an unsigned integer.

Source

        ++  ned
          |=  [a=fn]  ^-  [$f s=? [email protected] [email protected]]
          ?:  ?=([$f *] a)  a
          ~_  leaf+"need-float"
          !!

Examples

    > (ned:fl [%f s=%.y e=-11 a=7.530.107.827.833.587])
    [%f s=%.y e=-11 a=7.530.107.827.833.587]

    > (ned:fl [%n ~])
    ! need-float
    ! exit

    > (ned:fl [%i |])
    ! need-float
    ! exit

++shf:fl

Shift power

Multiplies a by 2 to the b power without rounding. This results in shifting the exponent term by b.

Accepts

a is an fn.

b is a signed integer.

Produces

An fn.

Source

        ++  shf
          |=  [a=fn [email protected]]
          ?:  |(?=([$n *] a) ?=([$i *] a))  a
          a(e (sum:si e.a b))

Examples

    > (shf:fl [[%f & -2 7] --2])
    [%f s=%.y e=--0 a=7]

    > (shf:fl [[%f & -2 7] -2])
    [%f s=%.y e=-4 a=7]

    > (shf:fl [%f & -11 7.530.107.827.833.587] --5)
    [%f s=%.y e=-6 a=7.530.107.827.833.587]

++fli:fl

Flip sign

Produces a with its signed changed from positive to negative, or vice versa.

Accepts

a is an fn.

Produces

An fn.

Source

    ++  fli
      |=  [a=fn]  ^-  fn
      ?-(-.a $f a(s !s.a), $i a(s !s.a), $n a)

Examples

    > (fli:fl [%f %.y -2 7])
    [%f s=%.n e=-2 a=7]

    > (fli:fl [%f %.n --2 30.617])
    [%f s=%.y e=--2 a=30.617]

    > (fli:fl [%f | --2 30.617])
    [%f s=%.y e=--2 a=30.617]

++swr:fl

Switch rounding

Switches the rounding mode of r:fl.

Source

        ++  swr  ?+(r r $d %u, $u %d)

Examples

    > r:fl
    %n
    > swr:fl
    %n

    > =new-fl fl                              ::  new fl core with changed state
    > =new-fl new-fl(r %u)
    > swr:new-fl
    %d

++prc:fl

Force precision of 2 or greater

Produces p, the core's precision, if p is greater than or equal to 2. Otherwise, a crash is produced.

Source

        ++  prc  ?>((gth p 1) p)

Examples

    > prc:fl
    113

    > =new-fl fl
    > =new-fl new-fl(p 1)
    > prc:new-fl
    ! exit

    > =new-fl new-fl(p 2)
    > prc:new-fl
    2

++den:fl

Behavior

Produces d:fl. Denormalizes if d:fl is %d. Flushes denormals to zero if d:fl is %f.

  • Denormalizes if d:fl is %d.

  • Flushes denormals to zero if d:fl is %f.

  • Infinite exponent range if $d is $i.

The default value of d is %d.

Source

        ++  den  d

Examples

    > den:fl
    %d

    > =new-fl fl
    > =new-fl new-fl(d %f)
    > den:new-fl
    %f

++emn:si

Minimum exponent

Produces v:fl, the minimum exponent. The default minimum exponent is -16.494.

Source

        ++  emn  v

Examples

    > emn:fl
    -16.494

++emx:fl

Maximum exponent

Returns the maximum exponent of fl. The default maximum exponent is --16.494.

Source

        ++  emx  (sum:si emn (sun:si w))

Examples

    > `@u`emx:fl
    32.542

++spd:fl

Smallest denormal

Produces the smallest possible denormalized float.

Source

        ++  spd  [e=emn a=1]

Examples

    > spd:fl
    [e=-16.494 a=1]

++spn:fl

Smallest normal

Produces the smallest representable normal float.

Source

        ++  spn  [e=emn a=(bex (dec prc))]

Examples

    > spn:fl
    [e=-16.494 a=5.192.296.858.534.827.628.530.496.329.220.096]

++lfn:fl

Largest normal

Produces the largest representable normal float.

Source

        ++  lfn  [e=emx a=(fil 0 prc 1)]

Examples

    > lfn:fl
    [e=--16.271 a=10.384.593.717.069.655.257.060.992.658.440.191]

++lfe:fl

Maximum

Produces the sum of emx:fl plus prc:fl.

Source

        ++  lfe  (sum:si emx (sun:si prc))                  ::  2^lfe is > than all

Examples

    > lfe:fl
    --16.384

++zer:fl

Zero

Produces zero represented as a float.

Source

    ++  zer  [e=--0 a=0]
    --
  |%

Examples

    > zer:fl
    [e=--0 a=0]

++rou:fl

Round

Rounds a. The way in which a is rounded depends on the value of r:fl.

Accepts

a is an fn.

Produes

An fn.

Source

      ++  rou
        |=  [a=fn]  ^-  fn
        ?.  ?=([$f *] a)  a
        ?~  a.a  [%f s.a zer]
        ?:  s.a  (^rou +>.a)
        =.(r swr (fli (^rou +>.a)))

Examples

    > =a 10.161.487.211.429.486.882.397.572.894.294.017.777
    > (rou:fl [%f & --12 a])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.002]

    > (rou:fl [%f & --12 (add a 1)])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.002]

    > (rou:fl [%f & --12 (add a 300)])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.002]

    > (rou:fl [%f & --12 (add a 1.000)])
    [%f s=%.y e=--22 a=9.923.327.354.911.608.283.591.379.779.584.003]

++syn:fl

Get sign

Produces the sign of a.

Accepts

a is an fn.

Produes

An fn.

Source

  ++  syn
    |=  [a=fn]  ^-  ?
    ?-(-.a $f s.a, $i s.a, $n &)

Examples

    > (syn:fl (sun:fl 106))
    %.y

    > (syn:fl [%f | --0 106])
    %.n

++abs:fl

Absolute value

Produces the absolute value of a.

Accepts

a is an fn.

Produes

An fn.

Sources

      ++  abs
        |=  [a=fn]  ^-  fn
        ?:  ?=([$f *] a)  [%f & e.a a.a]
        ?:  ?=([$i *] a)  [%i &]  [%n ~]

Examples

    > (abs:fl [%f | --0 106])
    [%f s=%.y e=--0 a=106]

    > (abs:fl [%f & --0 106])
    [%f s=%.y e=--0 a=106]

++add:fl

Add

Produces the sum of a plus b.

Accepts

a is an fn.

b is an fn.

Produces

An fn.

Source

  ++  add
    |=  [a=fn b=fn]  ^-  fn
    ?:  |(?=([$n *] a) ?=([$n *] b))  [%n ~]
    ?:  |(?=([$i *] a) ?=([$i *] b))
      ?:  &(?=([$i *] a) ?=([$i *] b))
        ?:  =(a b)  a  [%n ~]
      ?:  ?=([$i *] a)  a  b
    ?:  |(=(a.a 0) =(a.b 0))
      ?.  &(=(a.a 0) =(a.b 0))  %-  rou  ?~(a.a b a)
      [%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  (^add +>.a +>.b |)
      =.(r swr (fli (^add +>.a +>.b |)))
    ?:  s.a  (^sub +>.a +>.b |)
    (^sub +>.b +>.a |)

Examples

    > (add:fl [%f & --0 106] [%f | --3 55])
    [%f s=%.n e=-104 a=6.774.324.807.619.657.921.598.381.929.529.344]

++ead:fl

Exact add

Produces the exact sum of a plus b.

Accepts

a is an fn.

b is an fn.

Produces

An fn.

Source

  ++  ead
    |=  [a=fn b=fn]  ^-  fn
    ?:  |(?=([$n *] a) ?=([$n *] b))  [%n ~]
    ?:  |(?=([$i *] a) ?=([$i *] b))
      ?:  &(?=([$i *] a) ?=([$i *] b))
        ?:  =(a b)  a  [%n ~]
      ?:  ?=([$i *] a)  a  b
    ?:  |(=(a.a 0) =(a.b 0))
      ?.  &(=(a.a 0) =(a.b 0))  ?~(a.a b a)
      [%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  (^add +>.a +>.b &)
      (fli (^add +>.a +>.b &))
    ?:  s.a  (^sub +>.a +>.b &)
    (^sub +>.b +>.a &)
  ::

Examples

    > (ead:fl [%f & --0 106] [%f | --3 55])
    [%f s=%.n e=--0 a=334]

++sub:fl

Subtract

Produces the difference of a minus b.

Accepts

a is an fn.

b is an fn.

Produces

An fn.

Source

        ++  sub
          |=  [a=fn b=fn]  ^-  fn  (add a (fli b))

Examples

    > (sub:fl [%f & --13 2.718] [%f & --23 11])
    [%f s=%.n e=-86 a=5.416.671.014.775.224.232.595.412.796.571.648]

++mul:fl

Multiply

Produces the product of a multiplied by b.

Accepts

a is an fn.

b is an fn.

Produces

An fn.

Source

      ++  mul
        |=  [a=fn b=fn]  ^-  fn
        ?:  |(?=([$n *] a) ?=([$n *] b))  [%n ~]
        ?:  ?=([$i *] a)
          ?:  ?=([$i *] b)
            [%i =(s.a s.b)]
          ?:  =(a.b 0)  [%n ~]  [%i =(s.a s.b)]
        ?:  ?=([$i *] b)
          ?:  =(a.a 0)  [%n ~]  [%i =(s.a s.b)]
        ?:  |(=(a.a 0) =(a.b 0))  [%f =(s.a s.b) zer]
        ?:  =(s.a s.b)  (^mul +>.a +>.b)
        =.(r swr (fli (^mul +>.a +>.b)))

++emu:fl

Exact multiply

Produces the exact product of a multiplied by b.

Accepts

a is an fn.

b is an fn.

Produces

An fn.

Examples

      ++  emu
        |=  [a=fn b=fn]  ^-  fn
        ?:  |(?=([$n *] a) ?=([$n *] b))  [%n ~]
        ?:  ?=([$i *] a)
          ?:  ?=([$i *] b)
            [%i =(s.a s.b)]
          ?:  =(a.b 0)  [%n ~]  [%i =(s.a s.b)]
        ?:  ?=([$i *] b)
          ?:  =(a.a 0)  [%n ~]  [%i =(s.a s.b)]
        ?:  |(=(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)]

++div:fl

Divide

Produces the quotient of a divided by b.

Accepts

a is an fn.

b is an fn.

Produces

An fn.

Divide

      ++  div
        |=  [a=fn b=fn]  ^-  fn
        ?:  |(?=([$n *] a) ?=([$n *] b))  [%n ~]
        ?:  ?=([$i *] a)
          ?:  ?=([$i *] b)  [%n ~]  [%i =(s.a s.b)]
        ?:  ?=([$i *] b)  [%f =(s.a s.b) zer]
        ?:  =(a.a 0)  ?:  =(a.b 0)  [%n ~]  [%f =(s.a s.b) zer]
        ?:  =(a.b 0)  [%i =(s.a s.b)]
        ?:  =(s.a s.b)  (^div +>.a +>.b)
        =.(r swr (fli (^div +>.a +>.b)))

++fma:fl

Fused multiply-add

Produces the sum of c plus the product of a multiplied by b; (a * b) + c.

Accepts

a is an fn.

b is an fn.

c is an fn.

Produces

An fn.

Source

      ++  fma
        |=  [a=fn b=fn c=fn]  ^-  fn
        (add (emu a b) c)

Examples

    > (fma:fl [%f & --13 2.718] [%f & --23 11] [%f & --13 2.718])
    [%f s=%.y e=-62 a=9.475.054.514.089.037.465.004.673.635.188.736]=

++sqt:fl

Square root

Produces the square root of a.

Accepts

a is an fn.

Produces

An fn.

Source

      ++  sqt
        |=  [a=fn]  ^-  fn
        ?:  ?=([$n *] a)  [%n ~]
        ?:  ?=([$i *] a)  ?:(s.a a [%n ~])
        ?~  a.a  [%f s.a zer]
        ?:  s.a  (^sqt +>.a)  [%n ~]

Examples

    > (sqt:fl [%f s=%.y e=-18 a=342.602.577])
    [%f s=%.y e=-107 a=5.865.903.143.604.945.574.132.671.852.050.553]

++inv:fl

Inverse

Produces the inverse of a by dividing 1 by a.

Accepts

a is an fn.

Produces

An fn.

Source

  ++  inv
    |=  [a=fn]  ^-  fn
    (div [%f & --0 1] a)

Examples

    > (inv:fl [%f s=%.y e=--0 a=10])
    [%f s=%.y e=-116 a=8.307.674.973.655.724.205.648.794.126.752.154]
    > (drg:fl [%f s=%.y e=-116 a=8.307.674.973.655.724.205.648.794.126.752.154])
    [%d s=%.y e=-1 a=1]

    > (inv:fl [%f s=%.y e=--1 a=10])
    [%f s=%.y e=-117 a=8.307.674.973.655.724.205.648.794.126.752.154]
    > (drg:fl [%f s=%.y e=-117 a=8.307.674.973.655.724.205.648.794.126.752.154])
    [%d s=%.y e=-2 a=5]

    > (inv:fl [%f s=%.y e=--2 a=10])
    [%f s=%.y e=-118 a=8.307.674.973.655.724.205.648.794.126.752.154]
    > (drg:fl [%f s=%.y e=-118 a=8.307.674.973.655.724.205.648.794.126.752.154])
    [%d s=%.y e=-3 a=25]

++sun:fl

Signed integer to float

Produces a in floating-point representation.

Accepts

a is an unsigned integer.

Produces

An fn.

Source

      ++  sun
        |=  [[email protected]]  ^-  fn
        (rou [%f & --0 a])

Examples

    > (sun:fl 0)
    [%f s=%.y e=--0 a=0]

    > (sun:fl 5.048.729)
    [%f s=%.y e=-90 a=6.250.023.776.601.238.669.911.180.544.311.296]

    > (sun:fl -100)
    ! exit

++san:fl

Signed integer to float

Produces the floating-point representation of a, an unsigned integer.

Accepts

a is an unsigned integer.

Produces

An fn.

Source

      ++  san
        |=  [[email protected]]  ^-  fn
        =+  b=(old:si a)
        (rou [%f -.b --0 +.b])

Examples

    > (san:fl --100)
    [%f s=%.y e=-106 a=8.112.963.841.460.668.169.578.900.514.406.400]

    > (san:fl -100)
    [%f s=%.n e=-106 a=8.112.963.841.460.668.169.578.900.514.406.400]

++lth:fl

Less than

Tests if a is less than b. Returns ~ in the event of a or b being a NaN ([%n ~]).

Accepts

a is an fn.

b is an fn.

Produces

A unit of flag.

Source

  ++  lth
    |=  [a=fn b=fn]  ^-  (unit ?)
    ?:  |(?=([$n *] a) ?=([$n *] b))  ~  :-  ~
    ?:  =(a b)  |
    ?:  ?=([$i *] a)  !s.a  ?:  ?=([$i *] b)  s.b
    ?:  |(=(a.a 0) =(a.b 0))
      ?:  &(=(a.a 0) =(a.b 0))  |
      ?:  =(a.a 0)  s.b  !s.a
    ?:  !=(s.a s.b)  s.b
    ?:  s.a  (^lth +>.a +>.b)  (^lth +>.b +>.a)

Examples

    > (lth:fl (sun:fl 116) (sun:fl 4.820))
    [~ u=%.y]

    > (lth:fl (sun:fl 218.116) (sun:fl 4.820))
    [~ u=%.n]

    > (lth:fl (sun:fl 218.116) [%n ~])
    ~

++lte:fl

Less than or equal

Tests whether a is less than or equal to b. Returns ~ in the event of a or b being a NaN ([%n ~]).

Accepts

a is an fn.

b is an fn.

Produces

A unit of flag.

Source

      ++  lte
        |=  [a=fn b=fn]  ^-  (unit ?)
        %+  bind  (lth b a)  |=  a=?  !a

Examples

    > (lte:fl (sun:fl 102) [%f %.y -5 973.655.724])
    [~ u=%.y]

    > (lte:fl (sun:fl 102) [%f %.y -24 973.655.724])
    [~ u=%.n]

    > (lte:fl [%f %.y --2 25] (sun:fl 100))
    [~ u=%.y]

    > (lte:fl [%f %.y --2 25] [%f %.y --3 2])
    [~ u=%.n]

    > (lte:fl [%f %.y --2 25] [%n ~])
    ~

++equ:fl

Equals

Tests if a is equal to b. Returns ~ in the event of a or b being a NaN ([%n ~]).

Accepts

a is an fn.

b is an fn.

Produces

An unit of flag.

Source

      ++  equ
        |=  [a=fn b=fn]  ^-  (unit ?)
        ?:  |(?=([$n *] a) ?=([$n *] b))  ~  :-  ~
        ?:  =(a b)  &
        ?:  |(?=([$i *] a) ?=([$i *] b))  |
        ?:  |(=(a.a 0) =(a.b 0))
          ?:  &(=(a.a 0) =(a.b 0))  &  |
        ?:  |(=(e.a e.b) !=(s.a s.b))  |
        (^equ +>.a +>.b)

Examples

    > (equ:fl [%f %.y --2 25] (sun:fl 100))
    [~ u=%.y]

    > (equ:fl [%f %.y --2 25] (sun:fl 101))
    [~ u=%.n]

++gte:fl

Greater or equal than

Tests whether a is greater than or equal to b. Returns ~ in the event of a or b being a NaN ([%n ~]).

Accepts

a is an fn.

b is an fn.

Produces

An unit of flag.

Source

      ++  gte
        |=  [a=fn b=fn]  ^-  (unit ?)  (lte b a)

Examples

    > (gte:fl [%f %.y --2 25] (sun:fl 100))
    [~ u=%.y]

    > (gth:fl [%f %.y --6 73.989] [%f %.y --5 919.599])
    [~ u=%.n]

    > (gth:fl [%f %.y --6 73.989] [%n ~])
    ~

++gth:fl

Greater than

Tests whether a is greater than b. Returns ~ in the event of a or b being a NaN ([%n ~]).

Accepts

a is an fn.

b is an fn.

Produces

An unit of flag.

Source

      ++  gth
        |=  [a=fn b=fn]  ^-  (unit ?)  (lth b a)

Examples

    > (gth:fl [%f %.y --2 25] (sun:fl 100))
    [~ u=%.n]

    > (gth:fl [%f %.y --6 73.989] [%f %.y --5 119.599])
    [~ u=%.y]

++drg:fl

Float to decimal

Produces the decimal form of a using the Dragon4 algorithm. Guarantees accurate results for rounded floats.

Accepts

a is an fn.

Produces

A dn.

Source

      ++  drg
        |=  [a=fn]  ^-  dn
        ?:  ?=([$n *] a)  [%n ~]
        ?:  ?=([$i *] a)  [%i s.a]
        ?~  a.a  [%d s.a --0 0]
        [%d s.a (^drg +>.a)]

Examples

    > (drg:fl [%f | --6 73.989])
    [%d s=%.n e=--0 a=4.735.296]

++grd:fl

Decimal to float

Converts decimal a to fn.

Accepts

a is a dn.

Produces

An fn.

Source

      ++  grd
        |=  [a=dn]  ^-  fn
        ?:  ?=([$n *] a)  [%n ~]
        ?:  ?=([$i *] a)  [%i s.a]
        =>  .(r %n)
        =+  q=(abs:si e.a)
        ?:  (syn:si e.a)
          (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)])

Examples

    > (grd:fl [%d s=%.n e=--0 a=73.989])
    [%f s=%.n e=-96 a=5.862.012.516.267.904.074.208.723.341.410.304]

    > (grd:fl [%d s=%.n e=--0 a=100])
    [%f s=%.n e=-106 a=8.112.963.841.460.668.169.578.900.514.406.400]

++toi:fl

Round to signed integer

Rounds a to the nearest signed integer.

Accepts

a is an fn.

Produces

A unit of @s.

Source

      ++  toi
        |=  [a=fn]  ^-  (unit @s)
        =+  b=(toj a)
        ?.  ?=([$f *] b)  ~  :-  ~
        =+  c=(^^mul (bex (abs:si e.b)) a.b)
        (new:si s.b c)

Examples

    > (toi:fl [%f s=%.y e=-78 a=8.112.963.841.460.668.169.578.900.514.406.400])
    [~ u=--26.843.545.600]

++toj:fl

Round to integer fn

Rounds a to the nearest decimal integer.

Accepts

a is an fn.

Produces

A unit of @s.

Source

      ++  toj
        |=  [a=fn]  ^-  fn
        ?.  ?=([$f *] a)  a
        ?~  a.a  [%f s.a zer]
        ?:  s.a  (^toj +>.a)
        =.(r swr (fli (^toj +>.a)))
      --

Examples

    > (toj:fl [%f s=%.y e=-78 a=8.112.963.841.460.668.169.578.900.514.406.400])
    [%f s=%.y e=--0 a=26.843.545.600]

    > (toj:fl [%f s=%.y e=-78 a=8.112.963.841.460.668.169.578.900.514])
    [%f s=%.y e=--0 a=26.844]

    > (toj:fl [%f s=%.y e=-78 a=8.112.963.841.460])
    [%f s=%.y e=--0 a=0]

    > (toj:fl [%f s=%.y e=-9 a=9.002])
    [%f s=%.y e=--0 a=16]

+ff

IEEE-754 Formatting

Container core for IEEE-754 formatting operations.

  • w is width: The number of bits in the exponent field.

  • p is precision: The number of bits in the significand field.

  • w is bias: Added to exponent when storing.

  • r is rounding mode: Possible modes are nearest ($n), up ($u), down ($d), to zero ($z), and away from zero ($a). Default value is %a.

Source

    ++  ff
      |_  [[[email protected] [email protected] [email protected]] r=$?($n $u $d $z $a)]

Examples

    > =ffcore ~(. ff [8 8 0] %n)
    > ffcore
    <24.ltg {{{@ud @ud @ud} r/$n} <54.tyv 119.wim 31.ohr 1.jmk $143>}>
    >

Discussion

+ff has no use outside of the functionality provided to other cores: ++rd, ++rs, ++rq, and ++rh. It's not intended to be used directly; it's just meant to power those cores.


++sb:ff

Sign bit

Produces the sign bit of ++ff.

Source

        ++  sb  (bex (^add w p))

Examples

    > sb:ff
    1

++me:ff

Minimum exponent

Produces the minimum possible exponent of ff.

Source

        ++  me  (dif:si (dif:si --1 b) (sun:si p))

Examples

    > me:ff
    --1

++pa:ff

Initialize fl

Instantiates the core fl, giving values to its samples based on the configuration of the ff core.

Source

        ++  pa
          %*(. fl p +(p), v me, w (^sub (bex w) 3), d %d, r r)

Examples

    > ~(pa ff [11 52 --1.023] %n)
    < 23.qzd
      28.btz
      { {{p/@ v/@s w/@} r/?($n $u $a $d $z) d/$d}
        <54.tyv 119.wim 31.ohr 1.jmk $143>
      }
    >

Discussion

++pa exists exclusively for internal use of ++ff, and ++ff exists for internal use in other cores.


++sea

@r to fn

Converts a from @r to fn.

Accepts

a is a @r, an IEEE float.

Produces

A unit of @s.

Source

      ++  sea
        |=  [[email protected]]  ^-  fn
        =+  [f=(cut 0 [0 p] a) e=(cut 0 [p w] a)]
        =+  s=(sig a)
        ?:  =(e 0)
          ?:  =(f 0)  [%f s --0 0]  [%f s me f]
        ?:  =(e (fil 0 w 1))
          ?:  =(f 0)  [%i s]  [%n ~]
        =+  q=:(sum:si (sun:si e) me -1)
        =+  r=(^add f (bex p))
        [%f s q r]

Examples

    > (sea:ff `@r`0x8)
    [%f s=%.y e=--0 a=0]

++bit:ff

fn to @r, rounding

Converts a from fn to @r and applies rounding.

Accepts

a is an fn.

Produces

A @r.

Source

      ++  bit  |=  [a=fn]  (bif (rou:pa a))

Examples

    > (bit:ma:rd [%f | -6 202])
    0xc009400000000000

++bif:ff

fn to @r, no rounding

Converts a from fn to @r. No rounding is applied.

Accepts

a is a @r, an IEEE float.

Produces

A flag.

Source

      ++  bif
        |=  [a=fn]  ^-  @r
        ?:  ?=([$i *] a)
          =+  q=(lsh 0 p (fil 0 w 1))
          ?:  s.a  q  (^add q sb)
        ?:  ?=([$n *] a)  (lsh 0 (dec p) (fil 0 +(w) 1))
        ?~  a.a  ?:  s.a  `@r`0  sb
        =+  ma=(met 0 a.a)
        ?.  =(ma +(p))
          ?>  =(e.a me)
          ?>  (^lth ma +(p))
          ?:  s.a  `@r`a.a  (^add a.a sb)
        =+  q=(sum:si (dif:si e.a me) --1)
        =+  r=(^add (lsh 0 p (abs:si q)) (end 0 p a.a))
        ?:  s.a  r  (^add r sb)

Examples

    > (bif:ma:rd *fn)
    0x7ff8000000000000

++sig:ff

Get sign

Produces the sign of a.

Accepts

a is a @r, an IEEE float.

Produces

A flag.

Source

      ++  sig
        |=  [[email protected]]  ^-  ?
        =(0 (cut 0 [(^add p w) 1] a))

Examples

    > (sig:ff `@r`5)
    %.n

++exp

Get exponent

Produces the exponent of a.

Accepts

a is a @r, an IEEE float.

Produces

A signed integer.

Source

      ++  exp
        |=  [[email protected]]  ^-  @s
        (dif:si (sun:si (cut 0 [p w] a)) b)

Examples

    > (exp:ff `@r`5)
    --0

++add

Add

Produces the sum of a plus b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A @r, an IEEE float.

Source

      ++  add
        |=  [[email protected] [email protected]]
        (bif (add:pa (sea a) (sea b)))

Examples

    > (add:ma:rd `@r`5 `@r`11)
    0x10

++sub:ff

Sub

Produces the sum of a plus b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A @r, an IEEE float.

Source

      ++  sub
        |=  [[email protected] [email protected]]
        (bif (sub:pa (sea a) (sea b)))

Examples

    > (sub:ma:rd `@r`5 `@r`11)
    0x8000000000000006

mul:ff

Multiply

Produces the product of a multiplied by b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A @r, an IEEE float.

Multiply

      ++  mul
        |=  [[email protected] [email protected]]
        (bif (mul:pa (sea a) (sea b)))

Examples

    > (mul:ma:rd `@r`11 `@r`2)
    0x0

++div:ff

Divide

Produces the quotient of a divided by b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A @r, an IEEE float.

Source

      ++  div
        |=  [[email protected] [email protected]]
        (bif (div:pa (sea a) (sea b)))

Examples

    > (div:ma:rd `@r`175 `@r`26)
    0x401aec4ec4ec4ec4

++fma:ff

Fused multiply-add

Produces the sum of c plus the product of a multiplied by b; (a * b) + c.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

c is a @r, an IEEE float.

Produces

A @r, an IEEE float.

Source

      ++  fma
        |=  [[email protected] [email protected] [email protected]]
        (bif (fma:pa (sea a) (sea b) (sea c)))

Examples

    > (fma:ma:rd `@r`175 `@r`26 `@r`100)
    0x64

++sqt:ff

Square root

Produces the square root of a.

Accepts

a is a @r, an IEEE float.

Produces

A @r, an IEEE float.

Source

      ++  sqt
        |=  [[email protected]]
        (bif (sqt:pa (sea a)))

Examples

    > (sqt:ma:rd `@r`175)
    0x1e9a751f9447b724

++lth:ff

Less than

Tests whether a is less than b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A flag.

Source

      ++  lth
        |=  [[email protected] [email protected]]  (fall (lth:pa (sea a) (sea b)) |)

Examples

    > (lth:ma:rd `@rd`1 `@rd`2)
    %.y

    > (lth:ma:rd `@rd`10 `@rd`2)
    %.n

++lte:ff

Less than or equal to

Tests whether a is less than or equal to b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A flag.

Source

      ++  lte
        |=  [[email protected] [email protected]]  (fall (lte:pa (sea a) (sea b)) |)

Examples

    > (lte:ma:rd `@rd`10 `@rd`2)
    %.n

    > (lte:ma:rd `@rd`10 `@rd`10)
    %.y

equ:ff

Equals

Tests whether a is equal to b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A flag.

Source

      ++  equ
        |=  [[email protected] [email protected]]  (fall (equ:pa (sea a) (sea b)) |)

Examples

    > (equ:ma:rd `@rd`10 `@rd`2)
    %.n

    > (equ:ma:rd `@rd`10 `@rd`10)
    %.y

++gte:ff

Greater or equal than

Tests whether a is greater than or equal to b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A flag.

Source

      ++  gte
        |=  [[email protected] [email protected]]  (fall (gte:pa (sea a) (sea b)) |)

Examples

    > (gte:ma:rd `@rd`10 `@rd`10)
    %.y

    > (gte:ma:rd `@rd`10 `@rd`11)
    %.n

++gth:ff

Greater than

Tests whether a is greater than or equal to b.

Accepts

a is a @r, an IEEE float.

b is a @r, an IEEE float.

Produces

A flag.

Source

      ++  gth
        |=  [[email protected] [email protected]]  (fall (gth:pa (sea a) (sea b)) |)

Examples

    > (gth:ma:rd `@rd`10 `@rd`10)
    %.n

    > (gth:ma:rd `@rd`10 `@rd`9)
    %.y

++sun:ff

Unsigned integer to @r

Converts a from an unsigned integer (@u) to @r.

Accepts

a is @u, unsigned integer.

Produces

A @r, an IEEE float.

Source

      ++  sun
        |=  [[email protected]]  (bit [%f & --0 a])

Examples

    > (sun:ma:rd 658.149.282)
    0x41c39d47d1000000

++san:ff

Signed integer to @r

Converts a from a signed integer to @r.

Accepts

a is @s, an unsigned integer

Produces

A @r, an IEEE float.

Source

      ++  san
        |=  [[email protected]]  (bit [%f (syn:si a) --0 (abs:si a)])

Examples

    > (san:ma:rd --10)
    0x4024000000000000

++toi:ff

Round to integer

Rounds a to the nearest signed integer.

Accepts

a is a @r, an IEEE float.

Produces

A flag of @s.

Source

      ++  toi
        |=  [[email protected]]  (toi:pa (sea a))

Examples

      > (toi:ma:rd `@r`0x4af)
      [~ u=--0]

++drg:ff

@r to decimal float

Converts a from @r to dn using the Dragon4 algorithm.

Accepts

a is a @r, an IEEE float.

Produces

A dn.

Source

      ++  drg
        |=  [[email protected]]  (drg:pa (sea a))

Examples

    > (drg:ma:rd `@r`0x41c0)
    [%d s=%.y e=-323 a=8.316]

    > (drg:ma:rd (sun:ma:rd 658.149.282))
    [%d s=%.y e=--0 a=658.149.282]

++grd:ff

Decimal float to @r

Converts a from dn to @r.

Accepts

a is a dn.

Produces

A @r, an IEEE float.

Source

      ++  grd
        |=  [a=dn]  (bif (grd:pa a))
      --

Examples

    > (grd:ma:rd [%d s=%.y e=--0 a=658.149.282])
    0x41c39d47d1000000

rlyd

Prep @rd for print

Converts a from a double-precision binary float to decimal64.

Accepts

a is a @rd, a double-precision float.

Produces

A dn.

Source

    ++  rlyd  |=  [email protected]  ^-  dn  (drg:rd a)

Examples

    > (rlyd .~2.4703e-320)
    [%d s=%.y e=-324 a=24.703]

++rlys

Prep @rs for print

Converts a from a single-precision binary float to decimal32.

Accepts

a is a @rs, a single-precision float.

Produces

A dn.

Source

    ++  rlys  |=  [email protected]  ^-  dn  (drg:rs a)

Examples

    > (rlys .1.681557e-39)
    [%d s=%.y e=-45 a=1.681.557]

++rlyh

Prep @rh for print

Converts a from a half-precision binary float to decimal16.

Accepts

a is a @rh, a half-precision float.

Produces

A dn.

Source

    ++  rlyh  |=  [email protected]  ^-  dn  (drg:rh a)

Examples

    > (rlyh .~~3e1)
    [%d s=%.y e=--1 a=3]

++rlyq

Prep @rq for print

Converts a from a quad-precision binary float to decimal128.

Accepts

a is a @rq, a quad-precision float.

Produces

A dn.

Source

    ++  rlyq  |=  [email protected]  ^-  dn  (drg:rq a)

Examples

    > (rlyq .~~~2.2628017865927756787440310766086816e-4343)
    [%d s=%.y e=-4.377 a=22.628.017.865.927.756.787.440.310.766.086.816]

++ryld

Finish parsing @rd

Converts a from a decimal float to a double-precision binary float.

Accepts

a is a dn.

Produces

A a @rd, a double-precision float.

Source

    ++  ryld  |=  a=dn  ^-  @rd  (grd:rd a)

Examples

    > (ryld [%d s=%.y e=-324 a=24.703])
    .~2.4703e-320

++ryls

Finish parsing @rs

Converts a from a decimal float to a single-precision binary float.

Accepts

a is a dn.

Produces

A a @rs, a single-precision float.

Source

    ++  ryls  |=  a=dn  ^-  @rs  (grd:rs a)

Examples

    > (ryls [%d s=%.y e=-324 a=24.703])
    .0

    > (ryls [%d s=%.y e=-32 a=24.703])
    .2.4703e-28

++rylh

Finish parsing @rh

Converts a from a decimal float to a half-precision binary float.

Accepts

a is a dn.

Produces

A a @rh, a half-precision float.

Source

    ++  rylh  |=  a=dn  ^-  @rh  (grd:rh a)

Examples

    > (rylh [%d s=%.y e=--1 a=703])
    .~~7.032e3

    > (rylh [%d s=%.y e=--3 a=56])
    .~~5.6e4

    > (rylh [%d s=%.y e=--4 a=56])
    .~~inf

++rylq

Finish parsing @rq

Converts a from a decimal float to a quad-precision binary float.

Accepts

a is a dn.

Produces

A a @rq, a quad-precision float.

Source

    ++  rylq  |=  a=dn  ^-  @rq  (grd:rq a)

Examples

    > (rylq [%d s=%.y e=-324 a=24.703])
    .~~~2.4703e-320

++rd

Double-precision fp

A container core for operations related to double-precision binary floats.

++rd has four rounding modes: round to nearest ($n), round up ($u), round down ($d), and round to zero ($z).

Source

    ++  rd
      ^?
      ~%  %rd  +>  ~
      |_  r=$?($n $u $d $z)

++ma:rd

Initialize ff

Instantiates the core ff, giving values to its samples based on the configuration of the rd core.

Source

      ++  ma
        %*(. ff w 11, p 52, b --1.023, r r)

Examples

    > ~(ma rd %n)
    < 24.ltg
      {{{w/@ud p/@ud b/@sd} r/?($n $u $d $z)} <54.tyv 119.wim 31.ohr 1.jmk $143>}
    >

sea:rd

@rd to fn

Converts a from a double-precision binary float to fn.

      ++  sea                                               ::  @rd to fn
        |=  [[email protected]]  (sea:ma a)

Examples

    > (sea:rd .~4.94066e-319)
    [%f s=%.y e=-1.074 a=100.000]

bit:rd

fn to @rd

Converts a from fn to a double-precision binary float.

Accepts

a is an fn.

Produces

A @rd, a double-precision float.

Source

      ++  bit
        |=  [a=fn]  ^-  @rd  (bit:ma a)

Examples

    > (bit:rd [%f s=%.y e=-1.074 a=100.000])
    .~4.94066e-319

add:rd

Add

Produces the sum of a plus b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  add  ~/  %add
        |=  [[email protected] [email protected]]  ^-  @rd
        ~_  leaf+"rd-fail"
        (add:ma a b)

Examples

    > (add:rd .~3.94066e12 .~9.2846e11)
    .~4.86912e12

sub:rd

Subtract

Produces the difference of a minus b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  sub  ~/  %sub
        |=  [[email protected] [email protected]]  ^-  @rd
        ~_  leaf+"rd-fail"
        (sub:ma a b)

Examples

    > (sub:rd .~7.94069e2 .~1.2846e3)
    .~-4.9053099999999995e2

sub:rd

Multiply

Produces the product of a times b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  mul  ~/  %mul
        |=  [[email protected] [email protected]]  ^-  @rd
        ~_  leaf+"rd-fail"
        (mul:ma a b)

Examples

    > (mul:rd .~7.94069e2 .~1.2246e3)
    .~9.724168973999998e5

div:rd

Divide

Produces the quotient of a divided by b.

Accepts

a is a @rd, a double-precision float.

b is a @rd.

Produces

A @rd.

Source

      ++  div  ~/  %div
        |=  [[email protected] [email protected]]  ^-  @rd
        ~_  leaf+"rd-fail"
        (div:ma a b)

Examples

    > (div:rd .~7.94099e2 .~1.2246e3)
    .~6.484558223093255e-1

++fma:rd

Fused multiply-add

Produces the sum of c plus the product of a multiplied by b; (a * b) + c.

Accepts

a is a @rd, an IEEE float.

b is a @rd.

c is a @rd.

Produces

A @rd.

Source

Source

      ++  fma  ~/  %fma
        |=  [[email protected] [email protected] [email protected]]  ^-  @rd
        ~_  leaf+"rd-fail"
        (fma:ma a b c)

Examples

    > (fma:rd .~7.94099e2 .~1.2246e3 .~3.94066e3)
    .~9.763942954e5

+sqt:fr

Square root

Produces the square root of a.

Accepts

a is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  sqt  ~/  %sqt
        |=  [[email protected]]  ^-  @rd  ~_  leaf+"rd-fail"
        (sqt:ma a)

Examples

    > (sqt:rd .~3.94066e3)
    .~6.2774676422901614e1

lth:rd

Less than

Test whether a is less than b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  lth  ~/  %lth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rd-fail"
        (lth:ma a b)

Examples

    > (lth:rd .~7.94099e2 .~1.2246e3)
    %.y

    > (lth:rd .~7.94099e2 .~1.2246e2)
    %.n

    > (lth:rd .~1.2246e2 .~1.2246e2)
    %.n

++lte:rd

Less than or equal

Test whether a is less than or equal to b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  lte  ~/  %lte                                     ::  less-equals
        |=  [[email protected] [email protected]]
        ~_  leaf+"rd-fail"
        (lte:ma a b)

Examples

    > (lte:rd .~7.94099e2 .~1.2246e3)
    %.y

    > (lte:rd .~7.94099e2 .~1.2246e2)
    %.n

    > (lte:rd .~1.2246e2 .~1.2246e2)
    %.y

equ:rd

Equals

Test whether a is equal to b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  equ  ~/  %equ
        |=  [[email protected] [email protected]]
        ~_  leaf+"rd-fail"
        (equ:ma a b)

Examples

    > (equ:rd .~7.94099e2 .~1.2246e3)
    %.n

    > (equ:rd .~7.94099e2 .~1.2246e2)
    %.n

    > (equ:rd .~1.2246e2 .~1.2246e2)
    %.y

++gte:rd

Greater than or equal

Test whether a is greater than or equal to b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  gte  ~/  %gte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rd-fail"
        (gte:ma a b)

Examples

    > (gte:rd .~7.94099e2 .~1.2246e3)
    %.n

    > (gte:rd .~7.94099e2 .~1.2246e2)
    %.y

    > (gte:rd .~1.2246e2 .~1.2246e2)
    %.y

++gth:rd

Greater than

Test whether a is greater b.

Accepts

a is a @rd, a double-precision float.

b is a @rd, a double-precision float.

Produces

A @rd.

Source

      ++  gth  ~/  %gth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rd-fail"
        (gth:ma a b)

Examples

    > (gte:rd .~7.94099e2 .~1.2246e3)
    %.n

    > (gte:rd .~7.94099e2 .~1.2246e2)
    %.y

    > (gte:rd .~1.2246e2 .~1.2246e2)
    %.y

++sun:rd

Unsigned integer to @rd

Converts an unsigned integer a to @rd.

Accepts

a is a @u, an unsigned integer.

Produces

A @rd.

Source

      ++  sun  |=  [[email protected]]  ^-  @rd  (sun:ma a)

Examples

    > (sun:rd 511)
    .~5.11e2

++san:rd

Unsigned integer to @rd

Converts a signed integer a to @rd.

Accepts

a is a @s, a signed integer.

Produces

A @rd.

Source

      ++  san  |=  [[email protected]]  ^-  @rd  (san:ma a)

Examples

    > (san:rd -511)
    .~-5.11e2

++sig:rd

Get sign

Produces the sign of a.

Accepts

a is a @rd

Produces

A flag.

Source

      ++  sig  |=  [[email protected]]  ^-  ?  (sig:ma a)

Examples

    > (sig:rd .~1.2246e3)
    %.y

exp:rd

Get exponent

Produces the exponent of a.

Accepts

a is a @rd

Produces

A @s.

Source

      ++  exp  |=  [[email protected]]  ^-  @s  (exp:ma a)              ::  get exponent

Examples

    > (exp:rd .~1.2246e3)
    --10

++toi:rd

Round to integer

Rounds a to the nearest integer.

Accepts

a is a @rd

Produces

A unit of @s.

Source

      ++  toi  |=  [[email protected]]  ^-  (unit @s)  (toi:ma a)

Examples

    > (toi:rd .~1.2246e3)
    [~ u=--1.224]

++drg:rd

@rd to decimal float

Produces the decimal form of a using the Dragon4 algorithm. Guarantees accurate results for rounded floats.

Accepts

a is a @rd

Produces

A dn.

Source

      ++  drg  |=  [[email protected]]  ^-  dn  (drg:ma a)

Examples

    > (drg:rd .~1.2246e3)
    [%d s=%.y e=-1 a=12.246]

++grd:rd

Decimal float to @rd

Converts a from decimal float to @rd.

Accepts

a is a @dn

Produces

A @rd.

Source

      ++  grd  |=  [a=dn]  ^-  @rd  (grd:ma a)              ::  decimal float to @rd
      --

Examples

    > (grd:rd [%d s=%.y e=-1 a=12.246])
    .~1.2246e3

++rs

Single-precision fp

A container core for operations related to single-precision binary floats.

++rs has four rounding modes: round to nearest ($n), round up ($u), round down ($d), and round to zero ($z).

Source

    ++  rs
      ~%  %rs  +>  ~
      ^?
      |_  r=$?($n $u $d $z)

ma:rs

Initialize ff

Instantiates the core ff, giving values to its samples based on the configuration of the rs core.

Source

      ++  ma
        %*(. ff w 8, p 23, b --127, r r)

Examples

    > ~(ma rs %n)
    < 24.ltg
      {{{w/@ud p/@ud b/@sd} r/?($n $u $d $z)} <54.tyv 119.wim 31.ohr 1.jmk $143>}
    >

sea:rs

@rs to fn

Converts a from @rs to fn.

Accepts

a is a @rs, an single-precision float.

Produces

An fn.

Source

      ++  sea
        |=  [[email protected]]  (sea:ma a)

Examples

    > (sea:rs .1.4e-43)
    [%f s=%.y e=-149 a=100]

bit:rs

fn to @rs

Converts a from fn to @rs.

Accepts

a is an fn.

Produces

A @rs, a single-precision float.

Source

      ++  bit
        |=  [a=fn]  ^-  @rs  (bit:ma a)

Examples

    > (bit:rs [%f & -2 1.000])
    .2.5e2

++add:rs

Add

Produces the sum of a plus b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  add  ~/  %add
        |=  [[email protected] [email protected]]  ^-  @rs
        ~_  leaf+"rs-fail"
        (add:ma a b)

Examples

    > (add:rs .2.5e1 .2.5e2)
    .2.75e2

++sub:rs

Subtract

Subtracts a from b.

Source

      ++  sub  ~/  %sub
        |=  [[email protected] [email protected]]  ^-  @rs
        ~_  leaf+"rs-fail"
        (sub:ma a b)

Examples

    > (sub:rs .2.5e1 .2.5e2)
    .-2.25e2

++mul:rs

Multiply

Produces the product of a multiplied by b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  mul  ~/  %mul
        |=  [[email protected] [email protected]]  ^-  @rs
        ~_  leaf+"rs-fail"
        (mul:ma a b)

Examples

    > (mul:rs .2.5e1 .2.5e2)
    .6.25e3

++div:rs

Divide

Produces the quotient of a divided by b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  div  ~/  %div
        |=  [[email protected] [email protected]]  ^-  @rs
        ~_  leaf+"rs-fail"
        (div:ma a b)

Examples

    > (div:rs .4.5e1 .2.2e2)
    .2.0454545e-1

++fma:rs

Fused multiply-add

Produces the sum of c plus the product of a multiplied by b; (a * b) + c.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

c is a @rs.

Produces

A @rs.

Source

      ++  fma  ~/  %fma
        |=  [[email protected] [email protected] [email protected]]  ^-  @rs
        ~_  leaf+"rs-fail"
        (fma:ma a b c)

Examples

    > (fma:rs .2.5e1 .2.5e2 .8.2e1)
    .6.332e3

++sqt:rs

Square root

Produces the square root of a.

Accepts

a is a @rs, a single-precision float.

Produces

A @rs.

Source

      ++  sqt  ~/  %sqt
        |=  [[email protected]]  ^-  @rs
        ~_  leaf+"rs-fail"
        (sqt:ma a)

Examples

    > (sqt:rs .2.5e2)
    .1.5811388e1

lth:rs

Less than

Test whether a is less than b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  lth  ~/  %lth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rs-fail"
        (lth:ma a b)

Examples

    > (lth:rs .9.9e1 .1.1e2)
    %.y

    > (lth:rs .9.9e1 .9.9e1)
    %.n

++lte:rs

Less than or equal

Test whether a is less than or equal to b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  lte  ~/  %lte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rs-fail"
        (lte:ma a b)

Examples

    > (lte:rs .9.9e1 .1.1e2)
    %.y

    > (lte:rs .9.9e1 .9.9e1)
    %.y

equ:rs

Equals

Test whether a is equal to b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  equ  ~/  %equ
        |=  [[email protected] [email protected]]
        ~_  leaf+"rs-fail"
        (equ:ma a b)

Examples

    > (equ:rs .9.9e1 .1.1e2)
    %.n

    > (equ:rs .9.9e1 .9.9e1)
    %.y

++gte:rs

Greater than or equal

Test whether a is greater than or equal to b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  gte  ~/  %gte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rs-fail"
        (gte:ma a b)

Examples

    > (gte:rs .9.9e1 .9.9e1)
    %.y

    > (gte:rs .9.9e1 .9.2e2)
    %.n

++gth:rs

Greater than

Test whether a is greater than b.

Accepts

a is a @rs, a single-precision float.

b is a @rs.

Produces

A @rs.

Source

      ++  gth  ~/  %gth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rs-fail"
        (gth:ma a b)

Examples

    > (gth:rs .9.9e1 .9.2e2)
    %.n

    > (gth:rs .9.9e1 .9.9e1)
    %.n

    > (gth:rs .9.9e1 .1.9e1)
    %.y

++sun:rs

Unsigned integer to @rs

Converts a from an unsigned integer to @rs.

Accepts

a is an unsigned integer.

Produces

A @rs.

Source

      ++  sun  |=  [[email protected]]  ^-  @rs  (sun:ma a)

Examples

    > (sun:rs 343)
    .3.43e2

++san:rs

Signed integer to @rs'

Converts a from an unsigned integer to @rs.

Accepts

a is a signed integer.

Produces

A @rs.

Source

      ++  san  |=  [[email protected]]  ^-  @rs  (san:ma a)

Examples

    > (san:rs -343)
    .-3.43e2'

++sig:rs

Get sign

Produces the sign of a.

Accepts

a is a @rs.

Produces

A flag.

Source

      ++  sig  |=  [[email protected]]  ^-  ?  (sig:ma a)

Examples

    > (sig:rs .3.43e2)
    %.y

    > (sig:rs .-3.43e2)
    %.n

exp:rs

Get exponent

Produces the exponent of a.

Accepts

a is a @rs.

Produces

A signed integer.

Source

      ++  exp  |=  [[email protected]]  ^-  @s  (exp:ma a)

Examples

    > (exp:rs .-3.43e2)
    --8

++toi:rs

Round to integer

Rounds a to the nearest integer.

Accepts

a is a @rs.

Produces

A unit of @s.

Source

      ++  toi  |=  [[email protected]]  ^-  (unit @s)  (toi:ma a)

Examples

    > (toi:rs .-3.43e2)
    [~ u=-343]

++drg:rs

@rs to decimal float

Produces the decimal form of a using the Dragon4 algorithm. Guarantees accurate results for rounded floats.

Accepts

a is a @rs

Produces

A dn.

Source

      ++  drg  |=  [[email protected]]  ^-  dn  (drg:ma a)

Examples

    > (drg:rs .-3.43e2)
    [%d s=%.n e=--0 a=343]

++grd:rs

Decimal float to @rs

Converts a from dn to @rs.

Accepts

a is a dn.

Produces

A @rs.

Source

      ++  grd  |=  [a=dn]  ^-  @rs  (grd:ma a)
      --

Examples

    > (grd:rs [%d s=%.n e=--0 a=343])
    .-3.43e2

++rq

Quadruple-precision fp

A container core for operations related to quadruple-precision binary floats.

++rq has four rounding modes: round to nearest ($n), round up ($u), round down ($d), and round to zero ($z).

Source

    ++  rq
      ~%  %rq  +>  ~
      ^?
      |_  r=$?($n $u $d $z)

++ma:rq

Initialize ff

Instantiates the core ff, giving values to its samples based on the configuration of the rq core.

Source

      ++  ma
        %*(. ff w 15, p 112, b --16.383, r r)

++sea:rq

@rq to fn

Converts a from @rq to fn.

Accepts

a is a @rq, a quad-precision float.

Produces

An fn.

Source

      ++  sea
        |=  [[email protected]]  (sea:ma a)

Examples

    > (sea:rq .~~~1.05102e5)
    [%f s=%.y e=-96 a=8.327.038.336.574.210.409.756.656.268.214.272]

++bit:rq

fn to @rq

Converts a from fn to @rq.

Accepts

a is an fn.

Produces

A @rq, a quad-precision float.

Source

      ++  bit
        |=  [a=n]  ^-  @rq  (bit:ma a)

Examples

    > (bit:rq [%f s=%.y e=-96 a=8.327.038.336.574.210.409.756.656.268.214.272])
    .~~~1.05102e5

++add:rq

Add

Produces the sum of a plus b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  add  ~/  %add
        |=  [[email protected] [email protected]]  ^-  @rq
        ~_  leaf+"rq-fail"
        (add:ma a b)

Examples

    > (add:rq .~~~-1.821e5 .~~~1.05102e5)
    .~~~-7.6998e4

++sub:rq

Subtract

Produces the difference of a minus b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  sub  ~/  %sub
        |=  [[email protected] [email protected]]  ^-  @rq
        ~_  leaf+"rq-fail"
        (sub:ma a b)

Examples

    > (sub:rq .~~~1.821e5 .~~~1.05102e5)
    .~~~7.6998e4

    > (sub:rq .~~~1.821e5 .~~~-1.05102e5)
    .~~~2.87202e5

++mul:rq

Multiply

Produces the product of a times b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  mul  ~/  %mul
        |=  [[email protected] [email protected]]  ^-  @rq
        ~_  leaf+"rq-fail"
        (mul:ma a b)

Examples

    > (mul:rq .~~~1.821e5 .~~~-1.05102e5)
    .~~~-1.91390742e10

div:rq

Divide

Produces the product of a divided by b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  div  ~/  %div
        |=  [[email protected] [email protected]]  ^-  @rq
        ~_  leaf+"rq-fail"
        (div:ma a b)

examples

    > (div:rq .~~~1.821e5 .~~~1.05102e3)
    .~~~1.732602614602957127361991208540275e2

fma:rq

Fused multiply-add

Produces the sum of c plus the product of a multiplied by b; (a * b) + c.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

c is a @rq.

Produces

A @rq.

Source

      ++  fma  ~/  %fma
        |=  [[email protected] [email protected] [email protected]]  ^-  @rq
        ~_  leaf+"rq-fail"
        (fma:ma a b c)

Examples

    > (fma:rq .~~~1.821e5 .~~~-1.05102e2 .~~~6.2044e7)
    .~~~4.29049258e7

Source

Square root

Produces the square root of a.

Accepts

a is a @rq, a quad-precision float.

Produces

A @rq.

Source

      ++  sqt  ~/  %sqt
        |=  [[email protected]]  ^-  @rq
        ~_  leaf+"rq-fail"
        (sqt:ma a)

Source

    > (sqt:rq .~~~6.2044e7)
    .~~~7.876801381271461258959876570289002e3

++lth:rq

Less than

Tests whether a is less than b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  lth  ~/  %lth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rq-fail"
        (lth:ma a b)

Examples

    > (lth:rq .~~~1.2044e7 (mul:rq .~~~9.02e2 .~~~7.114e3))
    %.n

    > (lth:rq .~~~1.2044e7 (mul:rq .~~~9.02e3 .~~~7.114e3))
    %.y

lte:rq

Less than or equal

Tests whether a is less than or equal to b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  lte  ~/  %lte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rq-fail"
        (lte:ma a b)

Examples

    > (lte:rq .~~~1.2044e7 (mul:rq .~~~9.02e2 .~~~7.114e3))
    %.n

    > (lte:rq .~~~1.2044e7 (mul:rq .~~~9.02e3 .~~~7.114e3))
    %.y

    > (lte:rq .~~~1.2044e7 .~~~1.2044e7)
    %.y

++equ:rq

Equals

Tests whether a is equal to b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  equ  ~/  %equ
        |=  [[email protected] [email protected]]
        ~_  leaf+"rq-fail"
        (equ:ma a b)

Examples

    > (equ:rq .~~~1.2044e7 .~~~1.2044e7)
    %.y

    > (equ:rq .~~~2.2044e7 .~~~1.2044e7)
    %.n

++gte:rq

Greater than or equal

Tests whether a is greater than or equal to b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  gte  ~/  %gte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rq-fail"
        (gte:ma a b)

Examples

    > (gte:rq .~~~1.2044e7 .~~~1.2044e7)
    %.y

    > (gte:rq .~~~2.2044e7 .~~~1.2044e7)
    %.y

    > (gte:rq .~~~1.2044e7 .~~~2.2044e7)
    %.n

++gth:rq

Tests whether a is greater than b.

Accepts

a is a @rq, a quad-precision float.

b is a @rq.

Produces

A @rq.

Source

      ++  gth  ~/  %gth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rq-fail"
        (gth:ma a b)

Examples

    > (gth:rq .~~~1.2044e7 .~~~1.2044e7)
    %.n

    > (gth:rq .~~~2.2044e7 .~~~1.2044e7)
    %.y

    > (gth:rq .~~~1.2044e7 .~~~2.2044e7)
    %.n

++sun:rq

Unsigned integer to @rq

Converts @ from an unsigned integer to @rq.

Accepts

a is a @u, an unsigned integer.

Produces

A @rq, a quad-precision float.

Source

      ++  sun  |=  [[email protected]]  ^-  @rq  (sun:ma a)

Examples

    > (sun:rq 205)
    .~~~2.05e2

++san:rq

Signed integer to rq

Converts @ from a signed integer to @rq.

Accepts

a is a @s, a signed integer.

Produces

A @rq, a quad-precision float.

Source

      ++  san  |=  [[email protected]]  ^-  @rq  (san:ma a)

Examples

    > (san:rq -205)
    .~~~-2.05e2

++sig:rq

Get sign

Produces the sign of a.

Accepts

a is a @rq, a quad-precision float.

Produces

A flag.

Source

      ++  sig  |=  [[email protected]]  ^-  ?  (sig:ma a)

Examples

    > (sig:rq .~~~-2.05e2)
    %.n

++exp:rq

Get exponent

Gets the exponent of a.

Accepts

a is a @rq, a quad-precision float.

Produces

A @s, a signed integer.

Source

      ++  exp  |=  [[email protected]]  ^-  @s  (exp:ma a)

Examples

    > (exp:rq .~~~-2.05e2)
    --7

toi:rq

Round to integer

Rounds a to the nearest integer.

Accepts

a is a @rq, a quad-precision float.

Produces

A unit of @s.

Source

      ++  toi  |=  [[email protected]]  ^-  (unit @s)  (toi:ma a)

Examples

    > (toi:rq .~~~-2.085e2)
    [~ u=-208]

    > (toi:rq .~~~-2.08e2)
    [~ u=-208]

++drg:rq

@rq to decimal float

Produces the decimal form of a using the Dragon4 algorithm. Guarantees accurate results for rounded floats.

Accepts

a is a @rq, a quad-precision float.

Produces

A dn.

Source

      ++  drg  |=  [[email protected]]  ^-  dn  (drg:ma a)              ::  @rq to decimal float

Examples

    > (drg:rq .~~~-2.085e2)
    [%d s=%.n e=-1 a=2.085]

    > (drg:rq .~~~-2.08e2)
    [%d s=%.n e=--0 a=208]

++grd:rq

Decimal float to @rq

Converts a from dn to @rq.

Accepts

a is dn.

a is a @rq.

Produces

A @rq, a quad-precision float.

Source

      ++  grd  |=  [a=dn]  ^-  @rq  (grd:ma a)
      --

Examples

    > (grd:rq [%d s=%.n e=--0 a=343])
    .~~~-3.43e2

++rh

Half-precision fp

A container core for operations related to half-precision binary floats.

++rh has four rounding modes: round to nearest ($n), round up ($u), round down ($d), and round to zero ($z).

Source

    ++  rh
      ~%  %rh  +>  ~
      ^?
      |_  r=$?($n $u $d $z)

++ma:rh

Initialize ff

Instantiates the core ff, giving values to its samples based on the configuration of the rh core.

Source

      ++  ma
        %*(. ff w 5, p 10, b --15, r r)

++sea:rh

@rh to fn

Converts a from @rh to fn.

Accepts

a is a @rh, a half-precision float.

Produces

An fn.

Source

      ++  sea
        |=  [[email protected]]  (sea:ma a)

Examples

    > (sea:rh .~~1.22e-5)
    [%f s=%.y e=-24 a=205]

++bit:rh

fn to @rh

Converts a from fn to @rh.

Accepts

a is an fn.

Produces

A @rh, a half-precision float.

Source

      ++  bit
        |=  [a=fn]  ^-  @rh  (bit:ma a)

Examples

    > (bit:rh [%f s=%.y e=-24 a=205])
    .~~1.22e-5

++add:rh

Produces the sum of a plus b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  add  ~/  %add
        |=  [[email protected] [email protected]]  ^-  @rh
        ~_  leaf+"rh-fail"
        (add:ma a b)

Examples

    > (add:rh .~~1.82e2 .~~1.02e2)
    .~~2.84e2

++sub:rh

Subtract

Produces the difference of a minus b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  sub  ~/  %sub
        |=  [[email protected] [email protected]]  ^-  @rh
        ~_  leaf+"rh-fail"
        (sub:ma a b)

Examples

    > (sub:rh .~~1.821e2 .~~1.051e2)
    .~~7.7e1

    > (sub:rh .~~1.821e2 .~~6.051e2)
    .~~-4.228e2

++mul:rh

Multiply

Produces the product of a times b.

Accepts

a is a @rh, a quad-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  mul  ~/  %mul
        |=  [[email protected] [email protected]]  ^-  @rh
        ~_  leaf+"rh-fail"
        (mul:ma a b)

Examples

    > (mul:rh .~~1.821e1 .~~-1.05102e2)
    .~~-1.913e3

div:rh

Divide

Produces the product of a divided by b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  div  ~/  %div
        |=  [[email protected] [email protected]]  ^-  @rh
        ~_  leaf+"rh-fail"
        (div:ma a b)

examples

    > (div:rh .~~1.821e3 .~~1.05102e2)
    .~~1.731e1

fma:rh

Fused multiply-add

Produces the sum of c plus the product of a multiplied by b; (a * b) + c.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

c is a @rh.

Produces

A @rh.

Source

      ++  fma  ~/  %fma
        |=  [[email protected] [email protected] [email protected]]  ^-  @rh
        ~_  leaf+"rh-fail"
        (fma:ma a b c)

Examples

    > (fma:rh .~~1.821e4 .~~-1.05102e2 .~~6.2044e3)
    .~~-6.55e4

Source

Square root

Produces the square root of a.

Accepts

a is a @rh, a half-precision float.

Produces

A @rh.

Source

      ++  sqt  ~/  %sqt
        |=  [[email protected]]  ^-  @rh
        ~_  leaf+"rh-fail"
        (sqt:ma a)

Source

    > (sqt:rh .~~6.24e4)
    .~~2.498e2

++lth:rh

Less than

Tests whether a is less than b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  lth  ~/  %lth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rh-fail"
        (lth:ma a b)

Examples

    > (lth:rh .~~1.2e5 (mul:rh .~~9.02e2 .~~7.114e2))
    %.n

    > (lth:rh .~~1.2e3 (mul:rh .~~9.02e1 .~~7.114e2))
    %.y

lte:rh

Less than or equal

Tests whether a is less than or equal to b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  lte  ~/  %lte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rh-fail"
        (lte:ma a b)

Examples

    > (lth:rh .~~1.2e5 (mul:rh .~~9.02e2 .~~7.114e2))
    %.n

    > (lth:rh .~~1.2e3 (mul:rh .~~9.02e1 .~~7.114e2))
    %.y

    > (lte:rh .~~1.2e3 .~~1.2e3)
    %.y

++equ:rh

Equals

Tests whether a is equal to b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  equ  ~/  %equ
        |=  [[email protected] [email protected]]
        ~_  leaf+"rh-fail"
        (equ:ma a b)

Examples

    > (equ:rh .~~1.24e4 .~~1.24e4)
    %.y

    > (equ:rh .~~2.24e4 .~~1.24e4)
    %.n

++gte:rh

Greater than or equal

Tests whether a is greater than or equal to b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  gte  ~/  %gte
        |=  [[email protected] [email protected]]
        ~_  leaf+"rh-fail"
        (gte:ma a b)

Examples

    > (gte:rh .~~1.24e4 .~~1.24e4)
    %.y

    > (gte:rh .~~2.24e4 .~~1.24e4)
    %.y

    > (gte:rh .~~1.24e4 .~~2.24e4)
    %.n

++gth:rh

Tests whether a is greater than b.

Accepts

a is a @rh, a half-precision float.

b is a @rh.

Produces

A @rh.

Source

      ++  gth  ~/  %gth
        |=  [[email protected] [email protected]]
        ~_  leaf+"rh-fail"
        (gth:ma a b)

Examples

    > (gth:rh .~~1.24e4 .~~1.244e4)
    %.n

    > (gth:rh .~~2.24e4 .~~1.24e4)
    %.y

    > (gth:rh .~~1.24e4 .~~2.24e4)
    %.n

++sun:rh

Unsigned integer to @rh

Converts @ from an unsigned integer to @rh.

Accepts

a is a @u, an unsigned integer.

Produces

A @rh, a half-precision float.

Source

      ++  sun  |=  [[email protected]]  ^-  @rh  (sun:ma a)

Examples

    > (sun:rh 205)
    .~~2.05e2

++san:rh

Signed integer to @rh

Converts @ from a signed integer to @rh.

Accepts

a is a @s, a signed integer.

Produces

A @rh, a half-precision float.

Source

      ++  san  |=  [[email protected]]  ^-  @rh  (san:ma a)

Examples

    > (san:rh -205)
    .~~-2.05e2

++sig:rh

Get sign

Produces the sign of a.

Accepts

a is a @rh, a half-precision float.

Produces

A flag.

Source

      ++  sig  |=  [[email protected]]  ^-  ?  (sig:ma a)

Examples

    > (sig:rh .~~-2.05e2)
    %.n

++exp:rh

Get exponent

Gets the exponent of a.

Accepts

a is a @rh, a half-precision float.

Produces

A @s, a signed integer.

Source

      ++  exp  |=  [[email protected]]  ^-  @s  (exp:ma a)

Examples

    > (exp:rh .~~-2.05e2)
    --7

toi:rh

Round to integer

Rounds a to the nearest integer.

Accepts

a is a @rh, a half-precision float.

Produces

A unit of @s.

Source

      ++  toi  |=  [[email protected]]  ^-  (unit @s)  (toi:ma a)

Examples

    > (toi:rh .~~-2.085e2)
    [~ u=-208]

    > (toi:rh .~~-2.08e2)
    [~ u=-208]

++drg:rh

@rh to decimal float

Produces the decimal form of a using the Dragon4 algorithm. Guarantees accurate results for rounded floats.

Accepts

a is a @rh, a half-precision float.

Produces

A dn.

Source

      ++  drg  |=  [[email protected]]  ^-  dn  (drg:ma a)

Examples

    > (drg:rh .~~-2.085e2)
    [%d s=%.n e=-1 a=2.085]

    > (drg:rh .~~-2.08e2)
    [%d s=%.n e=--0 a=208]

++grd:rh

Decimal float to @rh

Converts a from dn to @rh.

Accepts

a is dn.

a is a @rh.

Produces

A @rh, a a half-precision float.

Source

      ++  grd  |=  [a=dn]  ^-  @rh  (grd:ma a)
      --

Examples

    > (grd:rh [%d s=%.n e=--0 a=343])
    .~~-3.43e2