ice at mama.indstate.edu
Fri Sep 6 06:26:06 UTC 2002
Chuck Martin <nrocinu at myrealbox.com> wrote:
> On Thu, Sep 05, 2002 at 12:36:39PM -0500, Steve Baker wrote:
> > It seems perplexing, but the problem is that round is not prototyped in
> > math.h, or anywhere for that matter. This is clearly a glibc maintainer
> > issue. Add to your program at the top:
> > double round(double);
> Thank you! This works. Do you happen to know why rint() works without
> doing this? I can't seem to find a prototype for it anywhere, including
Augh... I _always_ forget about features.h. round() is defined after all,
but only if you have _ISOC99_SOURCE defined at the very very top of your C
file before any #includes (or _GNU_SOURCE, which turns on other things as
well). If you look in /usr/include/features.h you'll find all the "features"
you can select from.
rint() is a BSD'ism thus it is enabled by default. round() is a C99 feature
thus you must enable its use.
I was using cpp to see if round was being defined, but didn't see it thus I
assumed it wasn't defined anywhere, but was in fact, only #defined out of
existence. I overlooked it while rgrep'ing for it because all math.h function
calls are prototyped like:
__MATHCALL (round,, (_Mdouble_ __x));
They don't make it easy to track down, but there you go. Stick:
At the very top of your C file and you're C99 ready.
> Now this brings me to the other question I asked when I started this
> thread. How portable is this? The man page says it conforms to C99,
> but I'm not up on all of the standards and where they're all used.
> Will using this instead of my own rounding routine cause problems in
> portability, and if so, to what extent?
Any system that conforms to C99 should be OK, and most should, so I imagine
it's portable. You may have to jump through a hoop or two like this to get it
to work though.
More information about the linuxCprogramming