Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I compare and add a floating-point number to an integer in C?

Tags:

Can I compare a floating-point number to an integer?

Will the float compare to integers in code?

float f;     // f has a saved predetermined floating-point value to it  
if (f >=100){__asm__reset...etc}

Also, could I...

float f;
int x = 100;
x+=f;

I have to use the floating point value f received from an attitude reference system to adjust a position value x that controls a PWM signal to correct for attitude.

like image 630
sevenboarder Avatar asked Apr 17 '09 04:04

sevenboarder


People also ask

Can you compare float and int in C?

Casting the int to a float explicitly will do absolutely nothing. The int will be promoted to a float for purposes of comparison anyway.

Can we compare float with int in if statement?

Yes. We can compare float with integer, while doing comparison integer value will get promoted to float, 10.00.

What will happen if you cast a float to an integer?

Casting a float to an integer truncates the value, so if you have 3.999998 , and you cast it to an integer , you get 3 . The way to prevent this is to round the result.

Why do we never use == to compare floating point numbers?

Why does this problem occur? In the case of floating-point numbers, the relational operator (==) does not produce correct output, this is due to the internal precision errors in rounding up floating-point numbers.


3 Answers

The first one will work fine. 100 will be converted to a float, and IEE754 can represent all integers exactly as floats, up to about 223.

The second one will also work but will be converted into an integer first, so you'll lose precision (that's unavoidable if you're turning floats into integers).

like image 138
paxdiablo Avatar answered Sep 23 '22 10:09

paxdiablo


Since you've identified yourself as unfamiliar with the subtleties of floating point numbers, I'll refer you to this fine paper by David Goldberg: What Every Computer Scientist Should Know About Floating-Point Arithmetic (reprint at Sun).

After you've been scared by that, the reality is that most of the time floating point is a huge boon to getting calculations done. And modern compilers and languages (including C) handle conversions sensibly so that you don't have to worry about them. Unless you do.

The points raised about precision are certainly valid. An IEEE float effectively has only 24 bits of precision, which is less than a 32-bit integer. Use of double for intermediate calculations will push all rounding and precision loss out to the conversion back to float or int.

like image 36
RBerteig Avatar answered Sep 23 '22 10:09

RBerteig


Mixed-mode arithmetic (arithmetic between operands of different types and/or sizes) is legal but fragile. The C standard defines rules for type promotion in order to convert the operands to a common representation. Automatic type promotion allows the compiler to do something sensible for mixed-mode operations, but "sensible" does not necessarily mean "correct."

To really know whether or not the behavior is correct you must first understand the rules for promotion and then understand the representation of the data types. In very general terms:

  • shorter types are converted to longer types (float to double, short to int, etc.)
  • integer types are converted to floating-point types
  • signed/unsigned conversions favor avoiding data loss (whether signed is converted to unsigned or vice-versa depends on the size of the respective types)

Whether code like x > y (where x and y have different types) is right or wrong depends on the values that x and y can take. In my experience it's common practice to prohibit (via the coding standard) implicit type conversions. The programmer must consider the context and explicitly perform any type conversions necessary.

like image 8
Michael Carman Avatar answered Sep 27 '22 10:09

Michael Carman