problem with printing float

We’re having a problem with printing any floats in our program. We are performing a division of an integer casted to a float and another integer. Even if we assign a float varaible a constant 0.12345 it won’t print to the screen. Any help would be greatly appreciated! The file is attached.

One thing we have noticed is that our MPLAB compiler is configured for the PIC18F8722 and successfully compiles. However if we configure it to the PIC18F8520, it gives the following error.

MPLINK 3.90, Linker
Copyright (c) 2004 Microchip Technology Inc.
Error - processor types do not agree across all input files.
Errors : 1

BUILD FAILED: Mon Feb 11 18:40:58 2008

We are suspecting that this is the source of the problem.

Thanks,
Windell
#2477

custom_routines.c (5.53 KB)


custom_routines.c (5.53 KB)

printf does not support %f.
Something like printf("%ld", (long)(ratio * 1000) ); might work, though you’re likely to run into a lot of problems with floats.

You can avoid floats entirely by shifting the number up to store your decimal places, but in an integer type. Then in calculations, shift it back down.

For example:

long ratio;
ratio = (((long)p1_x)<<8 ) / S_PWM_SWING;

if(ratio>128 && magnitude_sum>MAX_SINGLE_MOT_MAG){
		RIGHT_WHEEL_PWM=NEUTRAL+MAX_SINGLE_MOT_MAG;
		LEFT_WHEEL_PWM=NEUTRAL-(((1<<8 - ratio) * MAX_SINGLE_MOT_MAG)>>8);
    }

Keep in mind that bit shifts only work on integers, so 0.5<<8 actually becomes 0<<8, so instead of 128, you get 0. You’ll have to enter any decimal constants yourself.

(In case you don’t already know, x<<8 = x*(2^8) and x>>8 = x/(2^8).)

I posted a floating point print routine last year. Available at http://www.chiefdelphi.com/forums/showthread.php?t=55105

Here’s an another alternative with just a little manipulation. You can turn something such as this into a utility function.


#define ACCURACY 1000  //How many decimal places are important to you
float f;
int i, i2;   // Might need to be longs if you have a lot of significant digits
 
f = 245.56;
 
/* Print float value */ 
i = (int) f;
i2 = (int) ((f-i)*ACCURACY);
[FONT=Times New Roman]printf("f = %d.%03d \r", i, i2); //e.g., f = 245.559[/FONT]