[GRASS-dev] trouble compiling v.in.ogr + math.h (all branches)

Hi,

when I try to compile a fresh check out of 6.4.3svn on an older
system (glibc 2.3.6) I get this error from v.in.ogr:

main.c: In function 'main':
main.c:1208: error: implicit declaration of function 'log2'
main.c:1208: warning: incompatible implicit declaration of built-in function 'log2'

I thought it was because #include <math.h> was missing (for pow()
and log10() too), but after adding that I still get the error.

It turns out I need to add -std=c99 to the gcc line to get it
to work, but the glibc man page for log2() has it conforming to
SVr4, 4.3BSD, C89.

maybe I could replace it with a log()/log() trick, but would
pow() and log10() also be broken?

??

thanks,
Hamish

Hamish wrote:

when I try to compile a fresh check out of 6.4.3svn on an older
system (glibc 2.3.6) I get this error from v.in.ogr:

main.c: In function 'main':
main.c:1208: error: implicit declaration of function 'log2'
main.c:1208: warning: incompatible implicit declaration of built-in function 'log2'

I thought it was because #include <math.h> was missing (for pow()
and log10() too), but after adding that I still get the error.

It turns out I need to add -std=c99 to the gcc line to get it
to work, but the glibc man page for log2() has it conforming to
SVr4, 4.3BSD, C89.

Huh? On my system, the log2 manual page says:

  CONFORMING TO
         C99, POSIX.1-2001. The variant returning double also conforms
         to SVr4, 4.3BSD.

maybe I could replace it with a log()/log() trick, but would
pow() and log10() also be broken?

pow() and log10() are C89. As is exp2(), FWIW.

But if you're planning on replacing this:

  new_snap = log2(xmax) - 52;
  new_snap = pow(2, new_snap);

I'd suggest using:

  int exp;
  new_snap = frexp(xmax, &exp);
  exp -= 52;
  new_snap = ldexp(new_snap, exp);

frexp() and ldexp() are C89, don't introduce rounding errors, and
handle zero correctly (they're also likely to be more efficient, but
that's a trivial detail).

--
Glynn Clements <glynn@gclements.plus.com>

On Mon, Jun 10, 2013 at 3:11 PM, Glynn Clements
<glynn@gclements.plus.com> wrote:

I'd suggest using:

        int exp;
        new_snap = frexp(xmax, &exp);
        exp -= 52;
        new_snap = ldexp(new_snap, exp);

frexp() and ldexp() are C89, don't introduce rounding errors, and
handle zero correctly (they're also likely to be more efficient, but
that's a trivial detail).

Thanks for the suggestion, done in all branches.

Markus M