I'll give you an example:
Draw a line from (0,0) to (10,1).
With the slope function (and that includes your linear function) you'll get a slope of 1/10 = 0.1 in base 10 which is 0.199999999.... in base 16. Since you only have limited precision (and it doesn't matter how much precision you have at _all_ as long as there is a _finite_ number of digits) you'll always end up with a number that is smaller than 1/10 (e.g. by using IEEE 32 bit floats you'll get 0,099999904632568359375).
Now if you evaluate the pixel with x-position 5 using the slope code (and it is completely irrelevant whether you take the incremental variant or your linear function variant) you'll get a y-position of always smaller than 0.5 (for 32 bit floats you'll get 0,499999523162841796875) which after rounding becomes 0!
I'll do it explicitely for your linear function y = ax + b: a = 1/10 <-- a < 1/10 due to finite number of digits y = a*5 + 0 <-- y < 0.5 --> round(y) = 0
And, as D. Steward already pointed out, look at the reverse way: Draw a line from (10,1) to (0,0): a = -1/10 <-- a > -1/10 due to finite number of digits y = a*5 + 10 <-- y > 0.5 --> round(y) = 1