Converting Float to unsigned short and Back

A

avsrk

Hello Folks ,

General C data types question , more geared up towards embedded folks .

I have a positive float quantity with a fractional part (one decimal
point) which occupies
4 bytes . Now i want to stuff it in to a two byte quantity like
unsigned short and then
reconvert it back to float .
We can use any method like type casting or directly doing low level
operations on the bytes ,
or any other way you can think of ..
The question is , is it possible to get the floating quantity back
including its fractional part .

Ex

float fval = 52.3 ;

unsigned short sval = (unsigned short ) fval ;

float fvalnew = (float) sval ;


will the fvalnew be 52.3 either by the above way( i know it is not we
lose the fractional part) or
any other way .

Thanks
subra
 
J

John Devereux

Hello Folks ,

General C data types question , more geared up towards embedded folks .

I have a positive float quantity with a fractional part (one decimal
point) which occupies
4 bytes . Now i want to stuff it in to a two byte quantity like
unsigned short and then
reconvert it back to float .
We can use any method like type casting or directly doing low level
operations on the bytes ,
or any other way you can think of ..
The question is , is it possible to get the floating quantity back
including its fractional part .

Ex

float fval = 52.3 ;

unsigned short sval = (unsigned short ) fval ;

float fvalnew = (float) sval ;


will the fvalnew be 52.3 either by the above way( i know it is not we
lose the fractional part) or
any other way .

Well you could "pre-multiply" by 10, so that you keep the first digit
after the decimal point.

float fval = 52.3 ;

unsigned short sval = (unsigned short) (10*fval) ;

/* sval == 523 */

float fvalnew = (float) sval / 10 ;
 
V

Vladimir Oka

(e-mail address removed) opined:
Hello Folks ,

General C data types question , more geared up towards embedded folks
.

I have a positive float quantity with a fractional part (one decimal
point) which occupies
4 bytes . Now i want to stuff it in to a two byte quantity like
unsigned short and then
reconvert it back to float .
We can use any method like type casting or directly doing low level
operations on the bytes ,
or any other way you can think of ..
The question is , is it possible to get the floating quantity back
including its fractional part .

Ex

float fval = 52.3 ;

unsigned short sval = (unsigned short ) fval ;

float fvalnew = (float) sval ;


will the fvalnew be 52.3 either by the above way( i know it is not we
lose the fractional part) or
any other way .

It seems what you're really after is fixed point arithmetic. If you use
it, you can get rid of floating point variables altogether. Just
choose a suitable multiplication factor, and use integer arithmetics
throughout. Since you say you only have one decimal place to care
about, 10 sounds OK, but if your range allows, a 100 may be better
especially if you do a lot of calculations.

You may even find ready-made libraries to deal with fixed point
numbers. GMP/bignum may be one, but you may want something leaner for
embedded use. Depending on what you need it may be better to roll your
own.
 
F

Flash Gordon

Hello Folks ,

General C data types question , more geared up towards embedded folks .

I have a positive float quantity with a fractional part (one decimal
point) which occupies
4 bytes . Now i want to stuff it in to a two byte quantity like
unsigned short and then
reconvert it back to float .

When you can fit a quart in to a pint pot you can guarantee to do it.
Until then it depends on the possible range. If 10*float will fit in to
an unsigned short (which also means the float must be positive) you can
do it, but in that case why are you using a float in the first place?
We can use any method like type casting or directly doing low level
operations on the bytes ,
or any other way you can think of ..
The question is , is it possible to get the floating quantity back
including its fractional part .

Ex

float fval = 52.3 ;

unsigned short sval = (unsigned short ) fval ;

float fvalnew = (float) sval ;


will the fvalnew be 52.3 either by the above way( i know it is not we
lose the fractional part) or
any other way .

It would be better if you told us the problem you are actually trying to
solve.
 
C

CBFalconer

.... snip ...

I have a positive float quantity with a fractional part (one
decimal point) which occupies 4 bytes . Now i want to stuff it
in to a two byte quantity like unsigned short and then reconvert
it back to float . We can use any method like type casting or
directly doing low level operations on the bytes , or any other
way you can think of .. The question is , is it possible to get
the floating quantity back including its fractional part .

If you have a gallon of fuel (4 liters) can you put it in a one
quart (one liter) can, transport it somewhere, and then fill
another gallon can from it? To quote Hercule Poirot, apply the
little gray brain cells.

--
"If you want to post a followup via groups.google.com, don't use
the broken "Reply" link at the bottom of the article. Click on
"show options" at the top of the article, then click on the
"Reply" at the bottom of the article headers." - Keith Thompson
More details at: <http://cfaj.freeshell.org/google/>
Also see <http://www.safalra.com/special/googlegroupsreply/>
 
J

Joe Smith

Vladimir Oka said:
(e-mail address removed) opined:


It seems what you're really after is fixed point arithmetic. If you use
it, you can get rid of floating point variables altogether. Just
choose a suitable multiplication factor, and use integer arithmetics
throughout. Since you say you only have one decimal place to care
about, 10 sounds OK, but if your range allows, a 100 may be better
especially if you do a lot of calculations.

You may even find ready-made libraries to deal with fixed point
numbers. GMP/bignum may be one, but you may want something leaner for
embedded use. Depending on what you need it may be better to roll your
own.
Won't machine epsilon become an issue if he wants to reach too far down on
those floats? joe
 
V

Vladimir Oka

said:
Won't machine epsilon become an issue if he wants to reach too far down on
those floats? joe

Well, you win some, you lose some.

With fixed point you have to be even more careful than with floating
point when it comes to precision. If OP really has to squeeze that last
bit of size/performance from an embedded system, it may be worth the
extra (algorithmic) effort.
 
J

Joe Smith

"Vladimir Oka" >
Well, you win some, you lose some.

With fixed point you have to be even more careful than with floating
point when it comes to precision. If OP really has to squeeze that last
bit of size/performance from an embedded system, it may be worth the
extra (algorithmic) effort.
I hope OP does clarify what he's after in such a manner that survives the
"buckets of water" objection. I rather doubt somebody is paying him to do
something so Sysypheun (sp?) joe
 
V

Vladimir Oka

Joe said:
"Vladimir Oka" >
I hope OP does clarify what he's after in such a manner that survives the
"buckets of water" objection. I rather doubt somebody is paying him to do
something so Sysypheun (sp?) joe

If OP's sure his values can fit in a 16 bit unsigned value (multiplied
by 10), I'd still advise him to stick to fixed point. It's always
possible to temporarily expand the width during calculations if he's
worried about lack of precision (e.g. use 32 bits with scaling factor
of 1000 or more for all calculations). This strategy may fail if he
needs to do some complicated maths on it (like sine or suchlike).
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,013
Latest member
KatriceSwa

Latest Threads

Top