Floating point I/O in GCC for MSP430

Nov 08, 2004 3 Replies

Greetings. I am using GCC v3.3 compiler for MSP430. I can't get uprintf() to work for floating point variables. Here is example code:



float i, k, m; i = 20.125f; k = 20.125F; m = 2.0125E+1;



uprintf( serial_out, "%F \r\n", i ); uprintf( serial_out, "%F \r\n", k ); uprintf( serial_out, "%2.2E \r\n", m ); uprintf( serial_out, "%g \r\n", m );



Compiler messages:



analog9.c:259: warning: double format, float arg (arg 3) analog9.c:261: warning: double format, float arg (arg 3) analog9.c:263: warning: double format, float arg (arg 3) analog9.c:265: warning: double format, float arg (arg 3)



The people who did the port for the MSP430 say; that floating point is a work in progress but I don't know if my problem is due to missing facilities. I can perform floating point arithmetic and view the results using GDB, but it won't print. The msp-gcc manual says floating point operations work for type float but not type double. By declaring the variables as float and using the f suffix, I think the variables must be type float, but the compiler messages suggest that they are type double. I am puzzled. Help and suggestions appreciated. JC



I am not using GCC, but I suspect that you may need to wait until doubles are fixed. Standard C operation with the printf family (I am not familiar with uprintf), with variable number of parameters, is to do default promotion of parameter types, which includes converting float parameters to doubles. The warnings above appear to be about those normal promotions.

I suspect you need to wait until the code for the floating point to decimal converter is fixed, or write your own.

Thad

'Sounds painful, but since my application is restricted - no negative numbers and limited range - it might be doable. Some pages such as

formatting link
may give me enough explanation to do it. Thanks. JC

If the range is narrow enough, you can convert the number to integers for both the whole and fractional parts:

#include #include

float f; int fi,ff;

fi = f; ff = abs((f-fi)*10000); printf ("f=%d.%04d\n", fi, ff);

That would work for values [INT_MIN].9999 to [INT_MAX].9999

Thad

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required