CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Floats & Ints

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Gordon23



Joined: 17 Feb 2024
Posts: 6
Location: UK

View user's profile Send private message

Floats & Ints
PostPosted: Sun Mar 03, 2024 3:59 am     Reply with quote

Hi,

I am struggling to get to grips with Ints and float when doing calcualtions and then printf's.

I have:- (just an example)

unsigned int8 rData[6] = {0};
unsigned int16 tcomb;

tcomb = rdata[0] * 256 + rdata[1];

tcalc1=175*(tcomb/65535);

printf("%Lu\r",tcomb);
printf("%Lu\r",tcalc1);

This does not work, just 0.00. If i change tcomb to:-

float tcomb;
printf("%.2f\r",tcalc1);

Then i get what appears to be good data. My question is, does this look the best way to get the result from tcalc1? I find if difficult to understand "Casting".

I need to do more to the calculation, the result will then end up needing to being a signed float, as:-

float finalresult;
finalresult= -45+tcalc1;
printf("%3.2f\r",finalresult);

Am i doing this correctly?

Thanks,
Jerson



Joined: 31 Jul 2009
Posts: 122
Location: Bombay, India

View user's profile Send private message Visit poster's website

PostPosted: Sun Mar 03, 2024 7:23 am     Reply with quote

The value in tcomb will range from 0 till 65535.

Thus, using the native integer math of the processor, tcomb/65535 will result either in a 0 for values less than 65535 or 1 when it is equal. Fractions have no significance in integer math.

So, 175*(tcomb/65535) is going to yield either 0 or 175

if you typecast the operation, you will do it this way

tcalc = 175 * ( (float) tcomb / 65535 )

This forces the value in tcomb to be changed to a floating point number, then divided and later multiplied. This will give a proper mathematical result.

The usual way would be to declare tcomb, tcalc1 as floats and perform all calculations.

If you are optimizing use of code space, other techniques can be used, but, depends on what is acceptable to your application.
Ttelmah



Joined: 11 Mar 2010
Posts: 19233

View user's profile Send private message

PostPosted: Sun Mar 03, 2024 10:25 am     Reply with quote

Some comments:

First, you display a common error on your format numbers for the
printf. In C, the number in front of the decimal point in the format, is the
'total field width'. This is all the characters to output. Includes thiings
like the decimal point. Now your number looks as if it'll have at least
a couple of digits in front of the decimal point, so %5.2f, which supports
numbers like xx.xx - five characters, two after the decimal.
Now on your original calculation:

tcalc1=175*(tcomb/65535);

Why the brackets????. You are asking it to solve tcomb/65535, and
then multiply the result by 175. The division would be done using
int16 maths, since everything inside the bracket is no larger than an
int16. Result therefore is 0/1, then multipled by 175.

If instead you removed the brackets and did the first multiply with
int32 arithmetic, and only the final division in float, this is quicker than
using float throughout, and will give the same result. So:

tcalc1=175LL*tcomb/65535.0;

Now this makes the first multiply use int32 arithmetic (by declaring
175 as being a 'long long', which is an int32 type), and then performs
a floating point division by 65535 (be declaring the divisor here as
65535.0), which is a floating point value.

Key is to get your head around that the maths type used on each sum,
is the type of the largest/most complex item involved. So:

int8*int8 -> int8 maths
int16*int8 -> int16 maths
int16*int32 -> int32 maths
int32*float -> float maths
etc for other types and operations

Now a 'cast', allows you to simply tell the compiler to treat a value
as being of a different type. So

int8val -> treated as int8
(int16)int8val -> treated as int16
(float)int8val -> treated as a float value.
etc. for other types.

As I show, you can also set a type for a value using'key letters and
formats.Any numeric constand containing a decimal point in a floating
point value. A number over 255, or followed by 'L' is an int16. A number
over 65535, or followed by 'LL' is an int32.
Gordon23



Joined: 17 Feb 2024
Posts: 6
Location: UK

View user's profile Send private message

PostPosted: Sun Mar 03, 2024 12:46 pm     Reply with quote

Jerson & Ttelman,

Makes sense now - thank you for taking the time to explain so well.

Thanks.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group