[erlang-questions] String representations of floating point numbers

Bob Ippolito bob@REDACTED
Sat Mar 16 18:31:59 CET 2019


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.




On Sat, Mar 16, 2019 at 4:32 AM Hugo Mills <hugo@REDACTED> wrote:

>    Hi, Bob,
>
> On Fri, Mar 15, 2019 at 05:32:54PM -0700, Bob Ippolito wrote:
> > If you dive into the implementation it's effectively a wrapper around
> > strtod from C with a validation pass that is more strict than the strtod
> > standard.
> >
> >
> https://github.com/erlang/otp/blob/OTP-21.3/erts/emulator/sys/win32/sys_float.c#L54
> >
> https://github.com/erlang/otp/blob/OTP-21.3/erts/emulator/sys/unix/sys_float.c#L732
> >
> > So as far as a regex goes it would be something like this:
> >
> > [+-]?\d+[.,]\d+([eE][+-]?\d+)
> >
> > The major differences between this and other popular float grammars are:
> >
> > * At least one digit is required in each part
> > * Both integer and fractional parts are required, even if there's an
> > exponent part (so "1", ".1", "1e-1" would not be valid)
> > * The decimal separator is either , or . (the implementation will try the
> > other if necessary to compensate for a different locale)
>
>    Thanks for the confirmation. That's more or less what I discovered
> while playing around with list_to_float. It's the first two cases that
> are the problems for me, because the spec I'm working to(*) says that
> "1." and ".3" are valid floats, for example, as is "1e-1".
>
>    Just for the record, here's the code I'm using to convert a Turtle
> double or decimal (the former in scientific notation; the latter
> without the E) into a form suitable for list_to_float/1:
>
>     [...]
>     % W3C's description of a float is wider than erlang's. We need to
>     % split up the number into a few parts to add extra characters
>     % where necessary so that list_to_float/1 will work right.
>     F = case string:lexemes(Text, "eE") of
>         [M, E] ->
>             fixup_decimal(M) ++ "e" ++ E;
>         [M] ->
>             fixup_decimal(M)
>     end,
>     O = lagra_model:new_literal(list_to_float(F)),
>     [...]
>
> -spec fixup_decimal(string()) -> string().
> fixup_decimal(M) ->
>     case string:lexemes(M, ".") of
>         [I] ->
>             I++".0";
>         [I, ""] ->
>             I++".0";
>         ["", J] ->
>             "0."++J;
>         [I, J] ->
>             M
>     end.
>
>    Hugo.
>
> (*) W3C's Turtle recommendation.
>
>
> > On Fri, Mar 15, 2019 at 3:52 PM Hugo Mills <hugo@REDACTED> wrote:
> >
> > >    Where in the manual is the set of allowable string representations
> > > of floating point numbers documented? I'd have expected it to be here:
> > >
> > > http://erlang.org/doc/reference_manual/data_types.html
> > >
> > > ... but apparently not.
> > >
> > >    Specifically, I'm trying to use list_to_float/1, and I've been
> > > trying to reverse engineer it:
> > >
> > > 1> list_to_float("-1").
> > > ** exception error: bad argument
> > >      in function  list_to_float/1
> > >         called as list_to_float("-1")
> > > 2> list_to_float("-1.0").
> > > -1.0
> > > 3> list_to_float("-1.0e-23").
> > > -1.0e-23
> > > 4> list_to_float("-1e-23").
> > > ** exception error: bad argument
> > >      in function  list_to_float/1
> > >         called as list_to_float("-1e-23")
> > > 5> list_to_float(".3").
> > > ** exception error: bad argument
> > >      in function  list_to_float/1
> > >         called as list_to_float(".3")
> > >
> > >    An actual written specification would be really handy here. Even
> > > just a regex or EBNF for them. I'm writing a parser for something
> > > where the definition of floating point literals isn't quite the same
> > > as Erlang's, and it's a bit painful.
> > >
> > >    Hugo.
> > >
>
> --
> Hugo Mills             | Nostalgia isn't what it used to be.
> hugo@REDACTED carfax.org.uk |
> http://carfax.org.uk/  |
> PGP: E2AB1DE4          |
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.12 (GNU/Linux)
>
> iQIcBAEBAgAGBQJcjN62AAoJEFheFHXiqx3kiPAP/3V2SC+mFVSIjRw0moQC6keJ
> x8A+005H7+SO030G5/a0TYXEe9wxn1KEtQEEyG2yt6A1XASeERRFuAPeeFMEhti+
> trr1oYJmbSTUgvRs1i5jhSH7KmUEt09I+JgS3u0Xs92LkmNyfFde8K3z6uA1XKwp
> 7tIHihrXYpk/jMamWXTNGYPlHtxcVxAToNK8ajQTz6dElurZYdHwHtnFv7Ya7jcf
> 7w9fKG4XcIoQZHMBrnZF8g2UQIgWiMpz7eo5lko91Zbjetgv1qkKaiNonA+rai4b
> CVIXJ+YIT1dHNEQ76uVqJQuuklUB0M5B+FCX/zuS5Zd7mta9ljzBHefGLzQYT+EE
> Y4En5n+YvL5OUCqw0EBBXBTYcsdn8rP0+jSy3nFiX6zV4Ty49NrKCSN0LGQJVpkz
> wv1Sl05QBC2JcyCYqrCoMdudPNdcgK/TvB+H7KYcZDy3mgoZJ55U12Ys6Ng80tIa
> 3eUis3W4vZLdS9Gfn8GY4A42APvv6X3W9bVN5JEISUlF3CdKui/RItZiQ8whx4iF
> 6E+KzkO6AgmgyGKbAXK5N8S0MWuNT3g/V/tm7siY3GDG6cDIQNZRxevMXhAZ9nIv
> S3kAiz1JBUKIMWv3RCz77+gKPI7AiUBHlfmXsjudSbnJ9r6nxhbCjbbypmHOzZYx
> 5uMAhklJZ0OnQgmxOfVU
> =0Eaq
> -----END PGP SIGNATURE-----
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20190316/ce4f92cd/attachment.htm>


More information about the erlang-questions mailing list