On Wed, Feb 04, 2004 at 12:00:12PM -0800, Bob Miller wrote: > Jacob Meuser wrote: > > > Why does the following: > > > > [...] > > > > when compiled with: > > > > gcc -Wall -lm -o lrint lrint.c > > > > always complain: > > > > lrint.c: In function `main': > > lrint.c:9: warning: implicit declaration of function `lrint' > > > > ? > > > > Works fine though. > > lrint() is part of the C99 standard. If you add "-std=c99" or > "-std=gnu99" to your compile line, the warning won't happen. > > It works fine because the function is in libc whether or not the > compiler saw the declaration, so the linker works normally. Once upon > a time (circa 1975-1980), common C practice was to declare practically > nothing, and let the compiler and linker figure everything out. > Prior to ANSI C, there were no function prototypes, for example. > > > Also, what's the difference between lrint() and (long)rint()? I mean, > > why even have lrint? Faster because it's integer only? > > Take a look at <bits/mathinline.h>. If you can get the compiler flags > right, you can compile lrint() into a single instruction, fistpl. > That would seem to be faster than the two-or-more instruction sequence > of rounding the double, then converting to int. > > This compiler invocation will generate the fistpl instruction on my > compiler (gcc 3.2.3 gentoo), though it's far from fully optimized. > > gcc -o lrint -Wall -std=gnu99 lrint.c -O -lm > > C is truly portable assembler.
Thanks, Bob. I was looking into it because transcode uses lrint, but it is not in *BSD. Now I know how to handle it for *BSD, and make it a little better on Linux :) -- <[EMAIL PROTECTED]> _______________________________________________ EuG-LUG mailing list [EMAIL PROTECTED] http://mailman.efn.org/cgi-bin/listinfo/eug-lug
