where int/float remains a float. How ever if I change it to
kilometers = 1.609 * (miles + yards / 1760);
where int/int returns 0. Where 385/1760 = .218.. which if this was declared of type int I understand the 0 result.
However kilometers is a float, so I figured all values whether whole or fractional could be handle. So is there a order of operations to data types? Or is it that compiler determines that 1760 is of type int. Where int/int remains an int.
It prints fine however given the 2 different formulas it prints 2 different results.
kilometers = 1.609 * (miles + yards / 1760.0);
end result = A marathon is 42.185970 kilometers.
kilometers1 = 1.609 * (miles + yards / 1760);
end result = A marathon is 41.834000 kilometers.
From what I gather when yards is divided by a float it results in a float.
When yards is divided by an int it results in a int
As a float 385/1760 = .218
As an int .218 = 0
and the precedence rules of C you have the following operations:
yards / 1760.0 (int / float) yields a float
miles + previous (int + float) yields a float
1.609 * previous (float * float) yileds a float.
kilometers = previous (float = float) no conversion needed; result is a float
but with:
kilometers1 = 1.609 * (miles + yards / 1760);
you have:
yards / 1760 (int / int) yields int
miles + previous (int + int) yields int
1.609 * previous (float * int) yields float
kilometers1 = previous (float = float) no conversion needed; result is a float
So the results you are seeing is exactly what is expected in the C language.
The type of the object that will be assigned the result of a calculation doesn't matter until you perform the assignment operation (= in this case). So, for example kilometers = 1/2 + 3/4; produces a floating point 0.0 in kilometers because 1/2 is 0 and 3-4 is 0, 0 + 0 is 0 and (int) 0 converted to a float by the assignment is (float)0.0. On the other hand miles = 1./2 + 3/4. produces an integer 1 because 1./2 is 0.5, 3/4. is 0.75, 0.5+.75 is 1.25, and 1.25 converted to an int by the assigment to an int is (int)1.25 which has 1 as its integer value.
Ok been at this most of the day. The book I am reading stated that this was a bug.
Given a binary arithmetic operator, and arguments of different types, the compiler will treat both as if they're of the higher precision.
Remember that each operator in an expression is a separate evaulation. Compliments of jon.kiparsky from Dreaming In Code.
To me seems a very important aspect to remember and understand. I asked about the insides to what was happening because I can fore see when dealing with queries dealing with different numerical data types, this could cause many wasted hours on unwanted results. Thanks all for the time an explanations