Math function with C

I have

 int miles, yards;
        float kilometers;
        float kilometers2;
        miles = 26;
        yards = 385;
        kilometers = 1.609 * (miles + yards / 1760.0);

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.

Are you printing it as a float...printf("%f\n", kilometers)

printf("\nA marathon is %f kilometers.\n\n", kilometers);

Dont know why it isnt printing the result as a float...get another compiler as this one is broken...btw what is your compiler type and version.

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

When you are performing operations on two integers, the result is an integer. So with:

int miles, yards;
float kilometers;
float kilometers2;
miles = 26;
yards = 385;
kilometers = 1.609 * (miles + yards / 1760.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.

3 Likes

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

Yup, what Don said.
It's called promotion and type casting.
be careful with it.