4

Suppose I want to divide two integer variables and put the result into a float. In order to prevent integer division do I have to program like this:

    int i = 6312;
    int j = 258;
    float f;
    f = i;
    f = i/j;

Or can I straightforward program like below and the compiler makes sure it is handled the 'proper' way:

    f = i/j;
PimV
  • 443
  • 1
  • 4
  • 12

2 Answers2

4

Cast the integers to float before doing the calculation.

float f = float(i) / float(j);

or

float f = (float) i / (float) j;

Always be clear how the calculation should be done, so the compiler will do what you want it to do.

Jot
  • 3,276
  • 1
  • 14
  • 21
1

As Arduino is C++, you should really use a static cast, to be technically accurate. However, for Arduino code it probably doesn't really matter.

So either

float f = static_cast< float >(i) / static_cast< float >(j);

or

float f = static_cast< float >(i) / j;

Note: Using a static cast on each operand, rather than just one, is useful to quiet any warnings about the loss of precision with int to float, which typically needs to form a rounded float for large int values.

See C++ int float casting for more info.


Just to add to Jot's answer: Strictly speaking, it should be pointed out that (float) is C, whereas float() is C++.


Also, as you had meant to write in your question:

int i = 6312;
int j = 258;
float f;
f = i;
f = f/j;

Yes, that would work. However, even though it seems quite elegant, it could cause confusion later in time, when someone else examines the code - unless you added a comment explaining why.

it is probably best to keep the code simple and obvious (for debugging purposes) unless you are deliberately intending to obfuscate the code.

Greenonline
  • 3,152
  • 7
  • 36
  • 48