43

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;
}
el_pup_le
  • 10,711
  • 22
  • 77
  • 130
  • 1
    Please review the answers you marked the wrong answer. `(float)` is no `C++` it is `C` style. – Jonas Stein Nov 24 '19 at 19:37
  • this is a classic issue among programming learners; one good thing about javascript is it avoids issues with nonsense "integer division" which should throw errors, rather than output incorrect numbers. Javascript all numbers are floating point – cmarangu May 08 '21 at 18:15

10 Answers10

68

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&lt float &gt( a.y - b.y ) / static_cast&lt float &gt( a.x - b.x );
Community
  • 1
  • 1
Kiril Kirov
  • 36,509
  • 22
  • 109
  • 183
58

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);
BoltClock
  • 665,005
  • 155
  • 1,345
  • 1,328
  • 7
    ..And watch out for division by zero! – GrahamS Mar 28 '11 at 09:18
  • 1
    @GrahamS - It's not that dangerous to divide by 0, when we're talking about floating point numbers. You could safely divide any float number by 0.0 or -0.0, will give you `inf`. But yes, if it's unexpected, it will cause problems. – Kiril Kirov Mar 28 '11 at 09:45
  • @Kiril Kirov: Yeah it won't cause an exception/crash like integer division-by-zero does, but it leaves you with either `+INF`, `-INF` or `NaN` which will probably cause the OP further problems when he tries to use `m`. – GrahamS Mar 28 '11 at 09:51
  • @BoltClock isn't it enough to cast any one of the elements of the expression to float? e.g. `(static_cast(a.y)-b.y)/(a.x-b.x)` – juanchopanza Mar 28 '11 at 10:08
  • You should use a C++-style cast instead of a C-style cast in C++. – S.S. Anne Dec 21 '19 at 18:06
  • @juanchopanza cast is useful to quiet a warning about the loss of precision with`int` to `float`, which typically needs to form a rounded `float` for large `int` values. – chux - Reinstate Monica Sep 13 '20 at 03:11
  • @BoltClock thanks for writing such a concise answer! – cmarangu May 08 '21 at 18:13
  • 1
    @S.S. Anne: I finally fixed my answer since it's stayed accepted all these years. Little over 10 years and a month... better late than never, right? (I think I wasn't very active at the time you commented so I may have missed it.) – BoltClock May 08 '21 at 18:16
  • I have a 30000 characters long Equation in my code, I can't be manually casting each term, is there a way to cast all ints to float in a that Equation ? (except using some python script to fix it, I already did that, but I am hoping for a proper way ?) – Tanishq-Banyal Jun 11 '21 at 09:58
2

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...
Tony Delroy
  • 99,066
  • 13
  • 167
  • 246
0

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

Dumitrescu Bogdan
  • 6,842
  • 2
  • 22
  • 31
0

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

Vineet G
  • 177
  • 1
  • 1
  • 8
0

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);
gsemac
  • 852
  • 7
  • 17
0

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

0

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

-1

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);
Ronny Brendel
  • 4,671
  • 5
  • 34
  • 54
-2

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));
Prince John Wesley
  • 60,780
  • 12
  • 83
  • 92