397,631 Members | 1,772 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 397,631 IT Pros & Developers. It's quick & easy.

Removing GCC compiler warnings from fabsf(), sqrtf()...

Charlie Zender
P: n/a
Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm

(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype

_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.
Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?

Thanks to all who have answered my previous three posts!
You've helped me de-lint 90% of my code...if I can fix this
present problem then compiling it with -Werror should work
and thus make catching new bugs at compile time much easier.

Any help appreciated,
Charlie
--
Charlie Zender, surname@uci.edu, (949) 824-2987, Department of Earth
System Science, University of California, Irvine CA 92697-3100
Visiting NCAR 12/13/03--1/17/04: ***********************************
Voice/FAX: (303) 497-1724/1348, Office: Mesa Lab 259b **************
Nov 14 '05 #1
Share this Question
Share on Google+
8 Replies


Kevin Goodsell
P: n/a
Charlie Zender wrote:
Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm
This appears to be a gcc issue, not a C issue, which makes it off-topic
in comp.lang.c.

(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype
This warning appears to be a result of the -Wconversion option. You
should probably read up on what the options you are using do.
-Wconversion doesn't look like a good one to use in general (and may be
completely useless in c99 mode).

_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.
The correct prototype is in <math.h>. You should almost never provide
prototypes for standard functions.
Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?


That would seem to be impossible. -Wconversion will result in a warning
for absolutely any code that calls a function that takes a 'float' (or
'short' or 'char'), if I understand correctly.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
Nov 14 '05 #2

Kevin Goodsell
P: n/a
Kevin Goodsell wrote:

The correct prototype is in <math.h>. You should almost never provide
prototypes for standard functions.


I should clarify this. You should almost never provide prototypes for
standard functions any way other than by #including the correct standard
header.

-Kevin
--
My email address is valid, but changes periodically.
To contact me please use the address from a recent posting.
Nov 14 '05 #3

Fred L. Kleinschmidt
P: n/a


Charlie Zender wrote:

Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm

(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype

_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.
Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?

Thanks to all who have answered my previous three posts!
You've helped me de-lint 90% of my code...if I can fix this
present problem then compiling it with -Werror should work
and thus make catching new bugs at compile time much easier.

Any help appreciated,
Charlie
--
Charlie Zender, surname@uci.edu, (949) 824-2987, Department of Earth
System Science, University of California, Irvine CA 92697-3100
Visiting NCAR 12/13/03--1/17/04: ***********************************
Voice/FAX: (303) 497-1724/1348, Office: Mesa Lab 259b **************


When you write
float func1(float);

float ff, gg;
...
ff = func1(gg);

the compiler will probably still promote gg to a double in the call to
func1 unless your compiler has a switch that specifies not to perform
such promotions.

I have long ago decided never to use floats in a C program - much
simpler and less hassle to always use doubles.
--
Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Technical Architect, Common User Interface Services
M/S 2R-94 (206)544-5225
Nov 14 '05 #4

Charlie Zender
P: n/a
Thanks for the insight. This is very consistent with what's happening.
If true, then there is probably no viable workaround for me.

Charlie
When you write
float func1(float);

float ff, gg;
...
ff = func1(gg);

the compiler will probably still promote gg to a double in the call to
func1 unless your compiler has a switch that specifies not to perform
such promotions.

I have long ago decided never to use floats in a C program - much
simpler and less hassle to always use doubles.

--
Charlie Zender, surname@uci.edu, (949) 824-2987, Department of Earth
System Science, University of California, Irvine CA 92697-3100
Visiting NCAR 12/13/03--1/17/04: ***********************************
Voice/FAX: (303) 497-1724/1348, Office: Mesa Lab 259b **************
Nov 14 '05 #5

Barry Schwarz
P: n/a
On Fri, 2 Jan 2004 23:39:11 GMT, "Fred L. Kleinschmidt"
<fred.l.kleinschmidt@nospam_boeing.com> wrote:


Charlie Zender wrote:

Hi,

First, this may be a GCC or Linux-specific problem, I'm not sure.

I am unable to compile a large body of code with extremely pedantic
compile time checks activate, so that warnings cause errors.
With GCC 3.3.1, I do this with

gcc -I/usr/local/include -g -O2 -std=c99 -pedantic -pedantic
-D_BSD_SOURCE -Wall -Wunused -W -Wmissing-prototypes -Wconversion
-Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings
bug.c -o bug -lm

(This is basically what GSL recommendsd for scientific codes.)

The current problem I have is that the following code (bug.c)

#include <stdio.h>
#include <math.h>
int main()
{
/* float fabsf(float); */
float foo,bar=-9;
foo=fabsf(bar);
fprintf(stdout,"foo = %g\n",foo);
}

produces this warning:

bug.c:7: warning: passing arg 1 of `fabsf' as `float' rather than
`double' due to prototype

_regardless_ of whether the correct fabsf() prototype
(float fabsf(float);) is commented out or not.
Yes, my GNU/Linux system does have fabsf() etc. in libm.a.
Yes, the intrinsics powf(), fabsf(), sqrtf()... cause the same warning.

1. How do I use powf(), fabsf(), sqrtf() etc. with causing compiler
warnings with the above compiler switches?

Thanks to all who have answered my previous three posts!
You've helped me de-lint 90% of my code...if I can fix this
present problem then compiling it with -Werror should work
and thus make catching new bugs at compile time much easier.

Any help appreciated,
Charlie
--
Charlie Zender, surname@uci.edu, (949) 824-2987, Department of Earth
System Science, University of California, Irvine CA 92697-3100
Visiting NCAR 12/13/03--1/17/04: ***********************************
Voice/FAX: (303) 497-1724/1348, Office: Mesa Lab 259b **************
When you write
float func1(float);

float ff, gg;
...
ff = func1(gg);

the compiler will probably still promote gg to a double in the call to
func1 unless your compiler has a switch that specifies not to perform
such promotions.


It better not. The only time floats are implicitly converted to
doubles is for variadic functions.

I have long ago decided never to use floats in a C program - much
simpler and less hassle to always use doubles.


<<Remove the del for email>>
Nov 14 '05 #6

Ben Pfaff
P: n/a
Barry Schwarz <schwarzb@deloz.net> writes:
It better not. The only time floats are implicitly converted to
doubles is for variadic functions.


Expressions: 1.0f + 1;
Initializations: double foo = 1.0f;
Assignments: foo = 1.0f;
etc.
Nov 14 '05 #7

Peter Nilsson
P: n/a
"Ben Pfaff" <blp@cs.stanford.edu> wrote in message
news:874qvda7ob.fsf@pfaff.stanford.edu...
Barry Schwarz <schwarzb@deloz.net> writes:
It better not. The only time floats are implicitly converted to
doubles is for variadic functions.
Expressions: 1.0f + 1;


This expression has type float.
Initializations: double foo = 1.0f;
Assignments: foo = 1.0f;
etc.


--
Peter
Nov 14 '05 #8

Ben Pfaff
P: n/a
"Peter Nilsson" <airia@acay.com.au> writes:
"Ben Pfaff" <blp@cs.stanford.edu> wrote in message
news:874qvda7ob.fsf@pfaff.stanford.edu...
Barry Schwarz <schwarzb@deloz.net> writes:
It better not. The only time floats are implicitly converted to
doubles is for variadic functions.


Expressions: 1.0f + 1;


This expression has type float.


Excuse me, I meant 1.0f + 1.0.
--
A competent C programmer knows how to write C programs correctly,
a C expert knows enough to argue with Dan Pop, and a C expert
expert knows not to bother.
Nov 14 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.