150 likes | 272 Views
Representation of data types. Integers (int) are represented as a signed binary number. Ex. (5) 10 = (0101) 2 (-5) 10 = (?) 2 Take the 1-complement of 0101, That is 1010, and add 1 which gives 1011. 1011 is the representation of -5 The left-most bit is named the sign bit.
E N D
Representation of data types Integers (int) are represented as a signed binary number. Ex. (5)10 = (0101)2 (-5)10 = (?)2 Take the 1-complement of 0101, That is 1010, and add 1 which gives 1011. 1011 is the representation of -5 The left-most bit is named the sign bit. Normally an integer is stored in a memory ”cell” that contains 16 bits. I.e. INT_MAX is 215 = 32767 and INT_MIN is -215 = -32768 TDBA66, VT-03 Lecture Ch 3
Representation of double • real number = mantissa*2exponent • Mantissa stored in finite number of bits and its value is between 0.5 and 1.0 or between -1.0 and -0.5 • Round-off error and accuracy • The minimum range of double is approximately 10-37 to 1037 • Check DBL_MIN and DBL_MAX in file float.h • See Appendix B in text book TDBA66, VT-03 Lecture Ch 3
Finite arithmetic can fail • Cancellation error: adding values of very different magnitudes might not give the expected result (out-shift) • Another cancellation error can occur when two similar values are subtracted (loosing precision) • Arithmetic underflow and overflow: underflow when the value of an expression (in absolute value) is less than DBL_MIN overflow when a value exceeds DBL_MAX TDBA66, VT-03 Lecture Ch 3
peppar:~/c/Book-Figs> cat fig3_02V2.c /* Modification of program in Fig. 3.2 * Find implementation's ranges for positive numeric data */ #include <stdio.h> #include <limits.h> /* definition of INT_MAX */ #include <float.h> /* definitions of DBL_MIN, DBL_MAX */ #include <math.h> /* definition of pow() */ int main(void) { int max_number; printf("Range of integer values of type int: %d . . %d\n", INT_MIN, INT_MAX); /* Compute 2 raised to 63 and compare */ max_number = pow(2,63)-1; printf("\n2 raised to 63 minus 1 equals %d\n", max_number); printf("Range of positive values of type double: %e . . %e\n", DBL_MIN, DBL_MAX); return (0); } TDBA66, VT-03 Lecture Ch 3
Compile, link and load Note! –lm makes the mathematical library to be loaded gcc -o fig3_02V2 fig3_02V2.c –lm peppar:~/c/Book-Figs> ./fig3_02V2 Range of integer values of type int: -2147483648 . . 2147483647 2 raised to 63 minus 1 equals 2147483647 Range of positive values of type double: 2.225074e-308 . . 1.797693e+308 peppar:~/c/Book-Figs> Output from program fig3_02V2.c TDBA66, VT-03 Lecture Ch 3
Evaluation of arithmetic expressions • Integer arithmetic Ex.1: 7/5*5 equals 1*5 (division) Ex.2: 7%5*5 equals 2*5 (reminder) The same for variables of int type. • Real arithmetic Ex.3: 8.0/5.0 equals 1.6 (as expected) Mixed mode 8.0/5 also equals 1.6 TDBA66, VT-03 Lecture Ch 3
Mixed type assignment • Ex.1: double x, y; int tal; y=tal/5+6; /* expression of type int */ But the value of y is stored as a double Ex.2: tal=x*y-4; /* expression is of type double*/ But the value of tal is stored as an int (the integral part of the expression) TDBA66, VT-03 Lecture Ch 3
Casting • A value of an expression can be explictly cast to another data type Ex.3: y=(double)tal/5+6; /* prevent from integer division */ Note the difference when writing Ex.4: y=(double)(tal/5+6); Here expression is evaluated using integer divide and the whole expression is cast to double TDBA66, VT-03 Lecture Ch 3
Figure 3.7 Using Casts to Prevent Integer Division /* Computes a test average*/ #include <stdio.h> int main(void) { int total_score, num_students; double average; printf("Enter sum of students' scores> "); scanf("%d", &total_score); printf("Enter number of students> "); scanf("%d", &num_students); average = (double)total_score / (double)num_students; printf("Average score is %.2f\n", average); return (0); } Enter sum of students' scores> 1822 Enter number of students> 25 Average score is 72.88 TDBA66, VT-03 Lecture Ch 3
Priority of operators • See Appendix C in text book • If the same priority the evaluation goes from left to right Ex.1: (a+b)/c is evaluated as ((a+b)/c) Ex.2: a+b/c is evaluated as (a+(b/c)) Ex.3: a*b/z is evaluated as ((a*b)/z) Ex.4: y-b/x-a is evaluated as ((y-(b/x))-a) Ex.5: (y-b)/(x-a) is eval. as ((y-b)/(x-a)) TDBA66, VT-03 Lecture Ch 3
Predefined math functions • See page 98 in text book • Ex. write program to simulate one toss with an ordinary die ON THE WHITEBOARD TDBA66, VT-03 Lecture Ch 3
peppar:~/c/Ckod> cat slumpa.c #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> int main(void) { int i, n, die_1, die_2, two_sum; srand(time(NULL)); /* nitialize the random number generator */ printf("\n%s\n%s", "Simulate throwing two dice a number of times.", "How many throws? "); scanf("%d", &n); for (i = 0; i < n; ++i) { if (i % 20 == 0) putchar('\n'); die_1= (int) floor(rand()/(double)RAND_MAX*6.0)+1; die_2= (int) floor(rand()/(double)RAND_MAX*6.0)+1; two_sum = die_1+ die_2; printf("%3d", two_sum); } printf("\n\n"); return 0; } TDBA66, VT-03 Lecture Ch 3
Simple user-written functions • Functions without parameters (neither input nor output) • See Fig. 3.15 TDBA66, VT-03 Lecture Ch 3
Figure 3.15 Program with a User-Defined Function /* Performs three square root computations */ #include <stdio.h> /* definitions of printf, scanf */ #include <math.h> /* definition of sqrt */ void instruct(void); /* Displays user instructions */ int main(void) { double first, second, /* input - two data values */ first_sqrt, /* output - square root of first input value */ second_sqrt, /* output - square root of second input */ sum_sqrt; /* output - square root of sum */ /* Display instructions. */ instruct(); /*************Call of function instruct **************/ /* Get a number and display its square root. */ printf("Enter a number> "); scanf("%lf", &first); first_sqrt = sqrt(first); printf("The square root of the number is %.2f\n", first_sqrt); /* Get second number and display its square root. */ printf("Enter a second number> "); scanf("%lf", &second); second_sqrt = sqrt(second); printf("The square root of the second number is %.2f\n",second_sqrt); TDBA66, VT-03 Lecture Ch 3
Fig. 3.15 cont. /* Display the square root of the sum of the two numbers. */ sum_sqrt = sqrt(first + second); printf( "The square root of the sum of the two numbers is %.2f\n", sum_sqrt); return (0); } /* Displays user instructions*/ void instruct(void) { printf("This program demonstrates the use of the \n"); printf("math library function sqrt (square root).\n"); printf("You will be asked to enter two numbers --\n"); printf("the program will display the square root of \n"); printf("each number and the square root of their sum.\n\n"); } TDBA66, VT-03 Lecture Ch 3