Society of Robots - Robot Forum

Software => Software => Topic started by: Admin on March 31, 2009, 11:36:15 AM

Title: doing math with float variable, isn't working
Post by: Admin on March 31, 2009, 11:36:15 AM
I've spent the last 5 hours trying to debug this darn thing . . . basically I want to store a float variable after doing some math, but it only stores as an int.

Programming in C with gcc, for Axon.

This below code either prints out +1.00000 if j=0 or +0.00000 for any other j value no greater than speed.
Code: [Select]
int j;
int speed;
float per_a;

per_a=(speed-j)/speed;

rprintfFloat(6, per_a);

And this below code only prints out +0.50000 no matter what, which makes sense.
Code: [Select]
int j;
int speed;
float per_a;

per_a=0.5;

rprintfFloat(6, per_a);

So the question is, what am I doing wrong in the first code example? I want it to give me a float value, not round it down as if it was an int variable . . .

Also, I tried this and various versions of it:
Code: [Select]
per_a=float((speed-j)/speed);
but always get this error:
error: expected expression before 'float'
Title: Re: doing math with float variable, isn't working
Post by: superchiku on March 31, 2009, 11:55:15 AM
typecasting wont work coz float is at a higher precedance than int ...ull alwayz lose the value..and that function wont work coz ur dividng int/int then typecasting it to float...int/int will give an int hence the casting will b a whole no

u need to make the division like this

eiher
float/float

or
float/int

or
int/float



then auto typecasting will be done... and ull get float
Title: Re: doing math with float variable, isn't working
Post by: chelmi on March 31, 2009, 11:59:42 AM
try
Code: [Select]
per_a=((float)(speed-j))/speed;
what it does is cast the speed-j to float. The rule is that if one operand is a float, the other operand is converted to a float.
Title: Re: doing math with float variable, isn't working
Post by: Webbot on March 31, 2009, 05:59:18 PM
Agree with previous posts but just to break it down a bit

Code: [Select]
int j;
int speed;
float per_a;

per_a=(speed-j)/speed;

rprintfFloat(6, per_a);


Look at the right of your equals sign. The variables are all 'int'. So it will do an integer division to obtain a result. Finally it realises you want to store the answer in a float so it will convert the answer into a float and then store it. But thats too late. You didn't want integer maths.

Code: [Select]
per_a=float((speed-j)/speed);
but always get this error:
error: expected expression before 'float'
The reason you have the error is you've effectively said 'per_a = float(something)'. There isn't a function called 'float' and so you get an error.

What you are trying to do is 'cast' a value to a float. A cast needs brackets around the type. So to cast to a float you need to say (float)(something).
So a 'sure fired solution' would be:
per_a = ((float)(speed-j)) / ((float)speed)

This also brings about the subject of constants like '1'. If you want to force such a constant to be a real number then enter it as '1.0' so that the compiler knows its is a floating point number.
Title: Re: doing math with float variable, isn't working
Post by: Admin on March 31, 2009, 10:22:04 PM
I knew it was a type casting issue! It works now.

A question . . . what happens if I have mixed cast types in an equation? For example, what if I have this:

float per_a;
long int speed=65000;
float j=3.5;
signed int neg = -30;

per_a = (speed-j) / speed + neg;

Is it best to just type cast it all? Can a float be negative?
Title: Re: doing math with float variable, isn't working
Post by: superchiku on April 01, 2009, 01:16:26 AM
the issue can be same as i fortold...

if u want to typecast ...the hierachy is maintained ..i mean a lower will be typecasted to hiher...

like division of float/int=float
                    int/int=int
                    int/float=float