el_pup_le
el_pup_le

Reputation: 12179

C++ int float casting

Why is m always = 0? The x and y members of someClass are integers.

float getSlope(someClass a, someClass b)
{           
    float m = (a.y - b.y) / (a.x - b.x);
    cout << " m = " << m << "\n";
    return m;
}

Upvotes: 50

Views: 327604

Answers (10)

ujjwal_mani
ujjwal_mani

Reputation: 14

You can use ios manipulators fixed(). It will allow you to print floating point values.

Upvotes: -1

Prince Garg
Prince Garg

Reputation: 101

you can cast both numerator and denominator by multiplying with (1.0) .

Upvotes: 10

BoltClock
BoltClock

Reputation: 723598

Integer division occurs, then the result, which is an integer, is assigned as a float. If the result is less than 1 then it ends up as 0.

You'll want to cast the expressions to floats first before dividing, e.g.

float m = static_cast<float>(a.y - b.y) / static_cast<float>(a.x - b.x);

Upvotes: 62

Jesse Moore
Jesse Moore

Reputation: 1

When doing integer division, the result will always be a integer unless one or more of the operands are a float. Just type cast one/both of the operands to a float and the compiler will do the conversion. Type casting is used when you want the arithmetic to perform as it should so the result will be the correct data type.

float m = static_cast<float>(a.y - b.y) / (a.x - b.x);

Upvotes: 0

Kiril Kirov
Kiril Kirov

Reputation: 38163

You need to use cast. I see the other answers, and they will really work, but as the tag is C++ I'd suggest you to use static_cast:

float m = static_cast< float >( a.y - b.y ) / static_cast< float >( a.x - b.x );

Upvotes: 78

Vineet G
Vineet G

Reputation: 195

You are performing calculations on integers and assigning its result to float. So compiler is implicitly converting your integer result into float

Upvotes: 0

Tony Delroy
Tony Delroy

Reputation: 106096

You should be aware that in evaluating an expression containing integers, the temporary results from each stage of evaluation are also rounded to be integers. In your assignment to float m, the value is only converted to the real-number capable float type after the integer arithmetic. This means that, for example, 3 / 4 would already be a "0" value before becoming 0.0. You need to force the conversion to float to happen earlier. You can do this by using the syntax float(value) on any of a.y, b.y, a.x, b.x, a.y - b.y, or a.x - b.x: it doesn't matter when it's done as long as one of the terms is a float before the division happens, e.g.

float m = float(a.y - b.y) / (a.x - b.x); 
float m = (float(a.y) - b.y) / (a.x - b.x); 
...etc...

Upvotes: 2

Dumitrescu Bogdan
Dumitrescu Bogdan

Reputation: 7267

Because (a.y - b.y) is probably less then (a.x - b.x) and in your code the casting is done after the divide operation so the result is an integer so 0.

You should cast to float before the / operation

Upvotes: 0

Prince John Wesley
Prince John Wesley

Reputation: 63698

if (a.y - b.y) is less than (a.x - b.x), m is always zero.

so cast it like this.

float m = ((float)(a.y - b.y)) / ((float)(a.x - b.x));

Upvotes: -2

Ronny Brendel
Ronny Brendel

Reputation: 4845

he does an integer divide, which means 3 / 4 = 0. cast one of the brackets to float

 (float)(a.y - b.y) / (a.x - b.x);

Upvotes: -1

Related Questions