<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">Me, I'd have taken Cowlishaw's reference implementation in C or the</div><div class="gmail_default" style="font-family:monospace,monospace">Intel library <a href="https://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library">https://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library</a> and wrapped a NIF around it.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">If I needed it.  z/Series and POWER have decimal FP in their</div><div class="gmail_default" style="font-family:monospace,monospace">instruction sets, but on other machines it's emulation or nothing.</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace">Erlang/OTP is very much influenced by its users' needs.</div><div class="gmail_default" style="font-family:monospace,monospace">(It doesn't always move *fast*, you understand, but when you</div><div class="gmail_default" style="font-family:monospace,monospace">want to develop long-lived systems that can be a good thing.)<br></div><div class="gmail_default" style="font-family:monospace,monospace">Why not write up an EEP?</div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div><div class="gmail_default" style="font-family:monospace,monospace"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, 17 Mar 2019 at 21:18, Bryan Paxton <<a href="mailto:starbelly@pobox.com">starbelly@pobox.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF">
    <p>A library that implements IEEE-754:  <a class="gmail-m_-7290200277344277770moz-txt-link-freetext" href="http://speleotrove.com/decimal/" target="_blank">http://speleotrove.com/decimal/</a>
    </p>
    <p>Example implementations in Erlang:<br>
    </p>
    <p><a class="gmail-m_-7290200277344277770moz-txt-link-freetext" href="https://github.com/tim/erlang-decimal" target="_blank">https://github.com/tim/erlang-decimal</a><br>
    </p>
    <p><a class="gmail-m_-7290200277344277770moz-txt-link-freetext" href="https://github.com/egobrain/decimal" target="_blank">https://github.com/egobrain/decimal</a></p>
    <p><br>
    </p>
    <div class="gmail-m_-7290200277344277770moz-cite-prefix">On 3/17/19 1:29 AM, Richard O'Keefe
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">
        <div class="gmail_default" style="font-family:monospace,monospace">What do you mean by "a
          decimal lib"?<br>
        </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Sun, 17 Mar 2019 at 06:35,
          Bryan Paxton <<a href="mailto:starbelly@pobox.com" target="_blank">starbelly@pobox.com</a>> wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
          <div bgcolor="#FFFFFF">
            <p> All of this begs the question of why there is no decimal
              lib in otp... I'm sure there's a good reason... ?</p>
            <p><br>
            </p>
            <div class="gmail-m_-7290200277344277770gmail-m_555742592463524003moz-cite-prefix">On
              3/16/19 12:31 PM, Bob Ippolito wrote:<br>
            </div>
            <blockquote type="cite">
              <div dir="ltr">While it's more code, the most
                straightforward way would be to parse the whole float
                for that spec into its constituent parts and reassemble
                (with defaults where necessary) to parse with
                float_to_list.
                <div><br>
                </div>
                <div>
                  <div><br>
                  </div>
                  <div><br>
                  </div>
                </div>
              </div>
              <br>
              <div class="gmail_quote">
                <div dir="ltr" class="gmail_attr">On Sat, Mar 16, 2019
                  at 4:32 AM Hugo Mills <<a href="mailto:hugo@carfax.org.uk" target="_blank">hugo@carfax.org.uk</a>>
                  wrote:<br>
                </div>
                <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">   Hi, Bob,<br>
                  <br>
                  On Fri, Mar 15, 2019 at 05:32:54PM -0700, Bob Ippolito
                  wrote:<br>
                  > If you dive into the implementation it's
                  effectively a wrapper around<br>
                  > strtod from C with a validation pass that is more
                  strict than the strtod<br>
                  > standard.<br>
                  > <br>
                  > <a href="https://github.com/erlang/otp/blob/OTP-21.3/erts/emulator/sys/win32/sys_float.c#L54" rel="noreferrer" target="_blank">https://github.com/erlang/otp/blob/OTP-21.3/erts/emulator/sys/win32/sys_float.c#L54</a><br>
                  > <a href="https://github.com/erlang/otp/blob/OTP-21.3/erts/emulator/sys/unix/sys_float.c#L732" rel="noreferrer" target="_blank">https://github.com/erlang/otp/blob/OTP-21.3/erts/emulator/sys/unix/sys_float.c#L732</a><br>
                  > <br>
                  > So as far as a regex goes it would be something
                  like this:<br>
                  > <br>
                  > [+-]?\d+[.,]\d+([eE][+-]?\d+)<br>
                  > <br>
                  > The major differences between this and other
                  popular float grammars are:<br>
                  > <br>
                  > * At least one digit is required in each part<br>
                  > * Both integer and fractional parts are required,
                  even if there's an<br>
                  > exponent part (so "1", ".1", "1e-1" would not be
                  valid)<br>
                  > * The decimal separator is either , or . (the
                  implementation will try the<br>
                  > other if necessary to compensate for a different
                  locale)<br>
                  <br>
                     Thanks for the confirmation. That's more or less
                  what I discovered<br>
                  while playing around with list_to_float. It's the
                  first two cases that<br>
                  are the problems for me, because the spec I'm working
                  to(*) says that<br>
                  "1." and ".3" are valid floats, for example, as is
                  "1e-1".<br>
                  <br>
                     Just for the record, here's the code I'm using to
                  convert a Turtle<br>
                  double or decimal (the former in scientific notation;
                  the latter<br>
                  without the E) into a form suitable for
                  list_to_float/1:<br>
                  <br>
                      [...]<br>
                      % W3C's description of a float is wider than
                  erlang's. We need to<br>
                      % split up the number into a few parts to add
                  extra characters<br>
                      % where necessary so that list_to_float/1 will
                  work right.<br>
                      F = case string:lexemes(Text, "eE") of<br>
                          [M, E] -><br>
                              fixup_decimal(M) ++ "e" ++ E;<br>
                          [M] -><br>
                              fixup_decimal(M)<br>
                      end,<br>
                      O = lagra_model:new_literal(list_to_float(F)),<br>
                      [...]<br>
                  <br>
                  -spec fixup_decimal(string()) -> string().<br>
                  fixup_decimal(M) -><br>
                      case string:lexemes(M, ".") of<br>
                          [I] -><br>
                              I++".0";<br>
                          [I, ""] -><br>
                              I++".0";<br>
                          ["", J] -><br>
                              "0."++J;<br>
                          [I, J] -><br>
                              M<br>
                      end.<br>
                  <br>
                     Hugo.<br>
                  <br>
                  (*) W3C's Turtle recommendation.<br>
                  <br>
                  <br>
                  > On Fri, Mar 15, 2019 at 3:52 PM Hugo Mills <<a href="mailto:hugo@carfax.org.uk" target="_blank">hugo@carfax.org.uk</a>>
                  wrote:<br>
                  > <br>
                  > >    Where in the manual is the set of
                  allowable string representations<br>
                  > > of floating point numbers documented? I'd
                  have expected it to be here:<br>
                  > ><br>
                  > > <a href="http://erlang.org/doc/reference_manual/data_types.html" rel="noreferrer" target="_blank">http://erlang.org/doc/reference_manual/data_types.html</a><br>
                  > ><br>
                  > > ... but apparently not.<br>
                  > ><br>
                  > >    Specifically, I'm trying to use
                  list_to_float/1, and I've been<br>
                  > > trying to reverse engineer it:<br>
                  > ><br>
                  > > 1> list_to_float("-1").<br>
                  > > ** exception error: bad argument<br>
                  > >      in function  list_to_float/1<br>
                  > >         called as list_to_float("-1")<br>
                  > > 2> list_to_float("-1.0").<br>
                  > > -1.0<br>
                  > > 3> list_to_float("-1.0e-23").<br>
                  > > -1.0e-23<br>
                  > > 4> list_to_float("-1e-23").<br>
                  > > ** exception error: bad argument<br>
                  > >      in function  list_to_float/1<br>
                  > >         called as list_to_float("-1e-23")<br>
                  > > 5> list_to_float(".3").<br>
                  > > ** exception error: bad argument<br>
                  > >      in function  list_to_float/1<br>
                  > >         called as list_to_float(".3")<br>
                  > ><br>
                  > >    An actual written specification would be
                  really handy here. Even<br>
                  > > just a regex or EBNF for them. I'm writing a
                  parser for something<br>
                  > > where the definition of floating point
                  literals isn't quite the same<br>
                  > > as Erlang's, and it's a bit painful.<br>
                  > ><br>
                  > >    Hugo.<br>
                  > ><br>
                  <br>
                  -- <br>
                  Hugo Mills             | Nostalgia isn't what it used
                  to be.<br>
                  hugo@... <a href="http://carfax.org.uk" rel="noreferrer" target="_blank">carfax.org.uk</a> |<br>
                  <a href="http://carfax.org.uk/" rel="noreferrer" target="_blank">http://carfax.org.uk/</a> 
                  |<br>
                  PGP: E2AB1DE4          |<br>
                  -----BEGIN PGP SIGNATURE-----<br>
                  Version: GnuPG v1.4.12 (GNU/Linux)<br>
                  <br>
iQIcBAEBAgAGBQJcjN62AAoJEFheFHXiqx3kiPAP/3V2SC+mFVSIjRw0moQC6keJ<br>
x8A+005H7+SO030G5/a0TYXEe9wxn1KEtQEEyG2yt6A1XASeERRFuAPeeFMEhti+<br>
trr1oYJmbSTUgvRs1i5jhSH7KmUEt09I+JgS3u0Xs92LkmNyfFde8K3z6uA1XKwp<br>
7tIHihrXYpk/jMamWXTNGYPlHtxcVxAToNK8ajQTz6dElurZYdHwHtnFv7Ya7jcf<br>
7w9fKG4XcIoQZHMBrnZF8g2UQIgWiMpz7eo5lko91Zbjetgv1qkKaiNonA+rai4b<br>
CVIXJ+YIT1dHNEQ76uVqJQuuklUB0M5B+FCX/zuS5Zd7mta9ljzBHefGLzQYT+EE<br>
Y4En5n+YvL5OUCqw0EBBXBTYcsdn8rP0+jSy3nFiX6zV4Ty49NrKCSN0LGQJVpkz<br>
wv1Sl05QBC2JcyCYqrCoMdudPNdcgK/TvB+H7KYcZDy3mgoZJ55U12Ys6Ng80tIa<br>
3eUis3W4vZLdS9Gfn8GY4A42APvv6X3W9bVN5JEISUlF3CdKui/RItZiQ8whx4iF<br>
6E+KzkO6AgmgyGKbAXK5N8S0MWuNT3g/V/tm7siY3GDG6cDIQNZRxevMXhAZ9nIv<br>
S3kAiz1JBUKIMWv3RCz77+gKPI7AiUBHlfmXsjudSbnJ9r6nxhbCjbbypmHOzZYx<br>
                  5uMAhklJZ0OnQgmxOfVU<br>
                  =0Eaq<br>
                  -----END PGP SIGNATURE-----<br>
                </blockquote>
              </div>
              <br>
              <fieldset class="gmail-m_-7290200277344277770gmail-m_555742592463524003mimeAttachmentHeader"></fieldset>
              <pre class="gmail-m_-7290200277344277770gmail-m_555742592463524003moz-quote-pre">_______________________________________________
erlang-questions mailing list
<a class="gmail-m_-7290200277344277770gmail-m_555742592463524003moz-txt-link-abbreviated" href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a>
<a class="gmail-m_-7290200277344277770gmail-m_555742592463524003moz-txt-link-freetext" href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a></pre>
            </blockquote>
            <p><br>
            </p>
            <p>--</p>
            <p>Bryan Paxton<br>
            </p>
            <blockquote type="cite"> </blockquote>
          </div>
          _______________________________________________<br>
          erlang-questions mailing list<br>
          <a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
          <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
        </blockquote>
      </div>
    </blockquote>
  </div>

</blockquote></div>