Visit Our UNIX and Linux User Community

Math function with C

Thread Tools Search this Thread
Top Forums Programming Math function with C
# 1  
Old 10-26-2012
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.
# 2  
Old 10-26-2012
Are you printing it as a float...printf("%f\n", kilometers)
# 3  
Old 10-26-2012

printf("\nA marathon is %f kilometers.\n\n", kilometers);
# 4  
Old 10-26-2012
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.
# 5  
Old 10-26-2012
Compiler is gcc 4.5.2 on Solaris11 Box

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
# 6  
Old 10-26-2012
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 examplekilometers = 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 handmiles = 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.
These 3 Users Gave Thanks to Don Cragun For This Post:
# 7  
Old 10-26-2012
What going on

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

Previous Thread | Next Thread
Test Your Knowledge in Computers #747
Difficulty: Medium
The Z80 uses 248 out of the available 256 codes as single byte opcodes.
True or False?

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers


i have file (my_file.txt) that looks like this: 000000000000010000 000000000000010000 000000000000005000 000000000000005000 000000000000005000 000000000000005000 000000000000005000 000000000000005000 000000000000005000 000000000000005000 all said and one, it should look... (11 Replies)
Discussion started by: lawsongeek
11 Replies

2. UNIX for Dummies Questions & Answers

Linux Math Help

I am struggling with scripting this challenge a friend and I have. You have file1 and its contents is a single number you have file 2 and its contents are a different number you want to add file1 to file2 and have the output be put into file3 (3 Replies)
Discussion started by: minkyboodle
3 Replies

3. Shell Programming and Scripting

Need help with AWK math

I am trying to do some math, so that I can compare the average of six numbers to a variable. Here is what it looks like (note that when I divide really big numbers, it isn't a real number): $ tail -n 6 named.stats | awk -F\, '{print$1}' 1141804 1140566 1139429 1134210 1084682 895045... (3 Replies)
Discussion started by: brianjb
3 Replies

4. Shell Programming and Scripting

math help

$ x=1 $ y=1.5 $ z=$((x*y)) bash: 1.5: syntax error: invalid arithmetic operator (error token is ".5") What's wrong? (2 Replies)
Discussion started by: rockbike
2 Replies

5. UNIX for Dummies Questions & Answers

math in unix

I have 2 variables a=2 b=1 i want to add a and b how do i do this in unix using just the echo command and by assigning it to a different variable like c? (13 Replies)
Discussion started by: khestoi
13 Replies

6. Programming

math.h in makefile

Hey all, How do I link the math library in a gnu make makefile? I have tried using -lm with the CFLAGS varibale - flags like -Wall and -ggdb work, but -lm does not. I am running gcc - 4.1.2 on a linux machine. (2 Replies)
Discussion started by: kermit
2 Replies

7. Programming

some math problems in C

I want to calculate secant method using C language That is a program----> #include<stdio.h> #include<math.h> #include<stdlib.h> main() { double fx(double x); double x0,x1,x2,f0,f1,f2,err; int n,i; printf("\n\n f(x) =x*x*x-5*x-7"); printf("\n\nEnter an interval in" ... (4 Replies)
Discussion started by: cdfd123
4 Replies

8. Programming

something about <math.h>

Hi, I got an easy problem for you but really difficult for me 'cause I am pretty new to this field I got header file <math.h> included in my .c file , then I write the code as below: k = sqrt(i); /* both variables k and i are int */ then I cc temp.c it says like this undefined... (4 Replies)
Discussion started by: blf0
4 Replies

9. Programming

math.h not working? o.0

Alright, umm i cant get this to work. im looking at some example and a book i have. when i try to compile my program i get an error message. ld: 0711-317 ERROR: Undefined symbol: .sqrt ld: 0711-345 Use the -bloadmap or -bnoquiet option to obtain more information. I did #include<math.h> after my... (2 Replies)
Discussion started by: primal
2 Replies

Featured Tech Videos