bug-gawk
[Top][All Lists]

## Re: Support of log10?

 From: Peng Yu Subject: Re: Support of log10? Date: Wed, 23 Jun 2021 20:19:01 -0500

```I am not sure why this is relevant to my question. I know log10(x)
from math.h is better than log(x)/log(10) to compute log based 10.

On Wed, Jun 23, 2021 at 6:07 PM Nelson H. F. Beebe <beebe@math.utah.edu> wrote:
>
> Peng Yu <pengyu.ut@gmail.com> reports this output:
>
> >> ...
> >> \$ seq 3 | awk -v 'OFS=\t' -v OFMT=%.20g -e 'function log10(x) { return
> >> log(x)/log(10); } { print "log10(" 10^\$1 ")", log10(10^\$1) }'
> >> log10(10)    1
> >> log10(100)   2
> >> log10(1000)  2.9999999999999995559
> >>
> >> I don't find a native support of log10(). But if I implement log10
> >> with log, I got the above problem. The result of log10(1000) should be
> >> exact 3. But it is not.
> >> ...
>
> Peng, you need to understand more about computer arithmetic: because
> it has finite precision and range, it is NOT the same as mathematical
> arithmetic.  Consider this simple C program:
>
> % cat foo.c
> #include <stdio.h>
> #include <stdlib.h>
> #include <math.h>
>
> int
> main()
> {
>     double x, y;
>     const double XMAX = 1.e15;
>
>     (void)printf("Test of log10(x)\n");
>     for (x = 1; x < XMAX; x*= 10)
>     {
>         y = log10(x);
>         (void)printf("%10.1e\t%.17g\t%a\n", x, y, y);
>     }
>
>     (void)printf("\n");
>     (void)printf("Test of log(x) / log(10)\n");
>
>     for (x = 1; x < XMAX; x*= 10)
>     {
>         y = log(x) / log(10);
>         (void)printf("%10.1e\t%.17g\t%a\n", x, y, y);
>     }
>
>     return (EXIT_SUCCESS);
> }
>
> Here is what it's output is on a CentOS 7.9 system on x86_64:
>
> % cc foo.2 -lm && ./a.out
> Test of log10(x)
>    1.0e+00      0       0x0p+0
>    1.0e+01      1       0x1p+0
>    1.0e+02      2       0x1p+1
>    1.0e+03      3       0x1.8p+1
>    1.0e+04      4       0x1p+2
>    1.0e+05      5       0x1.4p+2
>    1.0e+06      6       0x1.8p+2
>    1.0e+07      7       0x1.cp+2
>    1.0e+08      8       0x1p+3
>    1.0e+09      9       0x1.2p+3
>    1.0e+10      10      0x1.4p+3
>    1.0e+11      11      0x1.6p+3
>    1.0e+12      12      0x1.8p+3
>    1.0e+13      13      0x1.ap+3
>    1.0e+14      14      0x1.cp+3
>
> Test of log(x) / log(10)
>    1.0e+00      0       0x0p+0
>    1.0e+01      1       0x1p+0
>    1.0e+02      2       0x1p+1
>    1.0e+03      2.9999999999999996      0x1.7ffffffffffffp+1
>    1.0e+04      4       0x1p+2
>    1.0e+05      5       0x1.4p+2
>    1.0e+06      5.9999999999999991      0x1.7ffffffffffffp+2
>    1.0e+07      7       0x1.cp+2
>    1.0e+08      8       0x1p+3
>    1.0e+09      8.9999999999999982      0x1.1ffffffffffffp+3
>    1.0e+10      10      0x1.4p+3
>    1.0e+11      11      0x1.6p+3
>    1.0e+12      11.999999999999998      0x1.7ffffffffffffp+3
>    1.0e+13      12.999999999999998      0x1.9ffffffffffffp+3
>    1.0e+14      14      0x1.cp+3
>
> A careful implementation of log10(x) inside this system's -lm library
> gets the expected answers for the EXACTLY-REPRESENTABLE argument; the
> simple-minded division with log(x)/log(10) does not.
>
> Please consult any of several books and papers on computer arithmetic,
> recorded in
>
>         http://www.math.utah.edu/pub/tex/bib/fparith.html
>         http://www.math.utah.edu/pub/tex/bib/fparith.bib
>
> That file has more than 6800 references, which should give some idea
> that the subject is far from trivial.
>
> A second bibliography on elementary and special functions
>
>         http://www.math.utah.edu/pub/tex/bib/elefunt.html
>         http://www.math.utah.edu/pub/tex/bib/elefunt.bib
>
> collects almost 2400 references.
>
> If you want just a couple of freely-accessible documents on the
> subject, look at these two files:
>
>         http://www.math.utah.edu/~beebe/fp.pdf
>         http://www.math.utah.edu/~beebe/arith.pdf
>
> The second is an extension of the first.
>
> -------------------------------------------------------------------------------
> - Nelson H. F. Beebe                    Tel: +1 801 581 5254
> -
> - University of Utah                    FAX: +1 801 581 4148
> -
> - Department of Mathematics, 110 LCB    Internet e-mail: beebe@math.utah.edu
> -
> - 155 S 1400 E RM 233                       beebe@acm.org  beebe@computer.org
> -
> - Salt Lake City, UT 84112-0090, USA    URL: http://www.math.utah.edu/~beebe/
> -
> -------------------------------------------------------------------------------

--
Regards,
Peng

```