float_to_list question

Kent Boortz kent@REDACTED
Sun Dec 31 02:25:54 CET 2000


> > I must be missing something but here is what I get from the float_to_list
> > built-in function:
> ...
> >  13> float_to_list(1.1).
> >  "1.10000000000000008882e+00"
> > 
> > Oh Oh. I was expecting:
> > "1.10000000000000000000e+00"
> 
> 1.1 and 1.2 are not representable with the standard floating point
> formats.  The strings you get are (hopefully) the decimal representations 
> of the floats closest to 1.1 and 1.2.

Yes, this is true but we should maybe do better. We rely on the C call

        sprintf(buf, "%.20e", fp)

to do the conversion. I think there are standard C libraries (glibc2?)
that implement sprintf() to give shorter string representation with
the same precision but many (most?) don't.

There is an algorithm called "Dragon4" and there may be newer algorithms
to print floats.

kent


Ref:

   "How to Print Floating-Point Numbers Accurately" by
    * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].

   http://www.kric.ac.kr:8080/pubs/articles/proceedings/pldi/93542/p112-steele/p112-steele.pdf

   http://rexx.hursley.ibm.com/decimal/decimal.htm

   http://www.codiciel.fr/netlib/ampl/solvers/dtoa.c

   Mozilla uses some code similar to this.
   http://rdf.mozilla.org/docs/refList/refNSPR/prdtoa.html

   http://puffin.external.hp.com/lxr/source/gcc/libio/floatconv.c

   SICStus Prolog has some code to print floats as short as possible.



More information about the erlang-questions mailing list