Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Casting integers to float.

Reply
Thread Tools

Casting integers to float.

 
 
Jonathan Fielder
Guest
Posts: n/a
 
      08-12-2003
Hi,

I have a 32 bit integer value and I wish to find the single precision
floating point value that is closest to but less than or equal to the
integer. I also have a similar case where I need to find the single
precision floating point value that is closest to but greater than or equal
to the integer. I believe that if I simply cast to a float, it may be
assigned the next higher or lower representable value, depending on
implementation.

I am aware that if I use double precision floating point values then I
shouldn't have a problem because 32 bit integers can be represented exactly,
but I really need to use float.

Is there a simple method using standard C to achieve my goal?

Many thanks,

Jon.


 
Reply With Quote
 
 
 
 
Christian Bau
Guest
Posts: n/a
 
      08-12-2003
In article <bhb5u3$4he$(E-Mail Removed)>,
"Jonathan Fielder" <(E-Mail Removed)> wrote:

> Hi,
>
> I have a 32 bit integer value and I wish to find the single precision
> floating point value that is closest to but less than or equal to the
> integer. I also have a similar case where I need to find the single
> precision floating point value that is closest to but greater than or equal
> to the integer. I believe that if I simply cast to a float, it may be
> assigned the next higher or lower representable value, depending on
> implementation.
>
> I am aware that if I use double precision floating point values then I
> shouldn't have a problem because 32 bit integers can be represented exactly,
> but I really need to use float.
>
> Is there a simple method using standard C to achieve my goal?


Interesting problem. I think this should give the required result on
most or all correct C implementations.

float int32_to_float_rounddown (long i) {

double d = (double) i;
double e = d;
float f;

while ((f = (float) e) > d)
e -= 1.0;

return f;
}

float int32_to_float_roundup (long i) {

double d = (double) i;
double e = d;
float f;

while ((f = (float) e)< d)
e += 1.0;

return f;
}

d and e must be double so that the conversions from 32 bit integer and
from float are exact.
 
Reply With Quote
 
 
 
 
Kevin Easton
Guest
Posts: n/a
 
      08-12-2003
Jonathan Fielder <(E-Mail Removed)> wrote:
> Hi,
>
> I have a 32 bit integer value and I wish to find the single precision
> floating point value that is closest to but less than or equal to the
> integer. I also have a similar case where I need to find the single
> precision floating point value that is closest to but greater than or equal
> to the integer. I believe that if I simply cast to a float, it may be
> assigned the next higher or lower representable value, depending on
> implementation.


Will this work?

float f = myint;

if (f > (double)myint) {
f -= FLT_EPSILON * myint;
}

- Kevin.

 
Reply With Quote
 
Tim Prince
Guest
Posts: n/a
 
      08-13-2003
Jonathan Fielder wrote:


>
> I have a 32 bit integer value and I wish to find the single precision
> floating point value that is closest to but less than or equal to the
> integer.

float f = myint -.25
> I also have a similar case where I need to find the single
> precision floating point value that is closest to but greater than or
> equal
> to the integer.

float f = myint +.25
> I believe that if I simply cast to a float, it may be
> assigned the next higher or lower representable value, depending on
> implementation.

Only for some of the values satisfying myint > 1/FLT_EPSILON, assuming a
sane implementation, such as any IEEE compliant one.

--
Tim Prince
 
Reply With Quote
 
Christian Bau
Guest
Posts: n/a
 
      08-13-2003
In article <Adg_a.1316$(E-Mail Removed) >,
Tim Prince <(E-Mail Removed)> wrote:

> Jonathan Fielder wrote:
>
>
> >
> > I have a 32 bit integer value and I wish to find the single precision
> > floating point value that is closest to but less than or equal to the
> > integer.

> float f = myint -.25


Wrong result if myint = 1

> > I also have a similar case where I need to find the single
> > precision floating point value that is closest to but greater than or
> > equal
> > to the integer.

> float f = myint +.25


Wrong result if myint = 1

> > I believe that if I simply cast to a float, it may be
> > assigned the next higher or lower representable value, depending on
> > implementation.

> Only for some of the values satisfying myint > 1/FLT_EPSILON, assuming a
> sane implementation, such as any IEEE compliant one.

 
Reply With Quote
 
Kevin Easton
Guest
Posts: n/a
 
      08-13-2003
Tim Prince <(E-Mail Removed)> wrote:
> Jonathan Fielder wrote:
>
>
>>
>> I have a 32 bit integer value and I wish to find the single precision
>> floating point value that is closest to but less than or equal to the
>> integer.

> float f = myint -.25


If myint = 1, that gives 0.75 as f. There are many values representable
in float that are closer to 1.0 than 0.75, whilst still being less than
or equal to 1.0.

- Kevin.

 
Reply With Quote
 
Kevin Easton
Guest
Posts: n/a
 
      08-13-2003
Christian Bau <(E-Mail Removed)> wrote:
> In article <bhb5u3$4he$(E-Mail Removed)>,
> "Jonathan Fielder" <(E-Mail Removed)> wrote:
>
>> Hi,
>>
>> I have a 32 bit integer value and I wish to find the single precision
>> floating point value that is closest to but less than or equal to the
>> integer. I also have a similar case where I need to find the single
>> precision floating point value that is closest to but greater than or equal
>> to the integer. I believe that if I simply cast to a float, it may be
>> assigned the next higher or lower representable value, depending on
>> implementation.
>>
>> I am aware that if I use double precision floating point values then I
>> shouldn't have a problem because 32 bit integers can be represented exactly,
>> but I really need to use float.
>>
>> Is there a simple method using standard C to achieve my goal?

>
> Interesting problem. I think this should give the required result on
> most or all correct C implementations.
>
> float int32_to_float_rounddown (long i) {
>
> double d = (double) i;
> double e = d;
> float f;
>
> while ((f = (float) e) > d)
> e -= 1.0;


Why do you think that 1.0 is the smallest amount you will have to
subtract from e to make it less than i ?

- Kevin.

 
Reply With Quote
 
Jirka Klaue
Guest
Posts: n/a
 
      08-13-2003
Kevin Easton wrote:
> Christian Bau <(E-Mail Removed)> wrote:
>>"Jonathan Fielder" <(E-Mail Removed)> wrote:

....
>>>I have a 32 bit integer value and I wish to find the single precision
>>>floating point value that is closest to but less than or equal to the
>>>integer. I also have a similar case where I need to find the single
>>>precision floating point value that is closest to but greater than or equal
>>>to the integer. I believe that if I simply cast to a float, it may be
>>>assigned the next higher or lower representable value, depending on
>>>implementation.
>>>
>>>I am aware that if I use double precision floating point values then I
>>>shouldn't have a problem because 32 bit integers can be represented exactly,
>>>but I really need to use float.
>>>
>>>Is there a simple method using standard C to achieve my goal?

>>
>>Interesting problem. I think this should give the required result on
>>most or all correct C implementations.
>>
>>float int32_to_float_rounddown (long i) {
>>
>> double d = (double) i;
>> double e = d;
>> float f;
>>
>> while ((f = (float) e) > d)
>> e -= 1.0;

>
> Why do you think that 1.0 is the smallest amount you will have to
> subtract from e to make it less than i ?


How about this?

float f = i;
double d = i;

while (f > (double)i) {
d -= 1;
f = d;
}

while (f + FLT_EPSILON != f && f + FLT_EPSILON < (double)i)
f += FLT_EPSILON;

Jirka

 
Reply With Quote
 
Christian Bau
Guest
Posts: n/a
 
      08-13-2003
In article <newscache$3p6kjh$xg3$(E-Mail Removed)>,
Kevin Easton <(E-Mail Removed)> wrote:

> Christian Bau <(E-Mail Removed)> wrote:
> > In article <bhb5u3$4he$(E-Mail Removed)>,
> > "Jonathan Fielder" <(E-Mail Removed)> wrote:
> >
> >> Hi,
> >>
> >> I have a 32 bit integer value and I wish to find the single precision
> >> floating point value that is closest to but less than or equal to the
> >> integer. I also have a similar case where I need to find the single
> >> precision floating point value that is closest to but greater than or
> >> equal
> >> to the integer. I believe that if I simply cast to a float, it may be
> >> assigned the next higher or lower representable value, depending on
> >> implementation.
> >>
> >> I am aware that if I use double precision floating point values then I
> >> shouldn't have a problem because 32 bit integers can be represented
> >> exactly,
> >> but I really need to use float.
> >>
> >> Is there a simple method using standard C to achieve my goal?

> >
> > Interesting problem. I think this should give the required result on
> > most or all correct C implementations.
> >
> > float int32_to_float_rounddown (long i) {
> >
> > double d = (double) i;
> > double e = d;
> > float f;
> >
> > while ((f = (float) e) > d)
> > e -= 1.0;

>
> Why do you think that 1.0 is the smallest amount you will have to
> subtract from e to make it less than i ?


This makes three assumptions: 1. All integers that fit almost into 32
bit can be stored exactly in a "double" variable. 2. Adding or
subtracting 1 to/from such a variable produces the correct result. 3.
The type float has the following property: There are two numbers fmin
and fmax such that all integers x, fmin <= x <= fmax can be represented
in a variable of type float, and no non-integer value less than fmin or
greater than fmax can be represented.

That would be the case for any simple floating point representation that
I have ever seen, and it wouldn't matter if it is binary, base 10, base
sixteen or whatever. (I know there are implementations of long double
that work differently).
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Up casting and down casting Sosuke C++ 2 12-20-2009 03:24 PM
Problem with depracated casting method (down casting) Wally Barnes C++ 3 11-20-2008 05:33 AM
casting unsigned integers techie C++ 4 10-13-2006 06:01 PM
Another question about inheritance (up-casting and down-casting) kevin Java 11 01-08-2005 07:11 PM
Integers only as generics? Acciduzzu VHDL 4 09-23-2003 12:45 AM



Advertisments