CSCI 6610: Review [2ex]Chapter 7: Numbers Chapter 8

Preview:

Citation preview

. . . 1/27

CSCI 6610: Review

Chapter 7: NumbersChapter 8: CharactersChapter 11 Pointers

Alice E. Fischer

February 1, 2016

. . . 2/27

Outline

The Trouble with Numbers

The char Data Types

Pointers

. . . 3/27

The Trouble with Numbers

I. The Trouble with Numbers

Integer overflow and wrapFloating point overflow

Floating point underflowFloating point precision and approximate calculation

Scale of Magnitude and limits on precision

. . . 4/27

The Trouble with Numbers

Integer overflow and wrap

If you keep making an integer larger, eventually it will wrap aroundto the smallest end.

Memorize these numbers if you can.

I short -32,767. . . 32,767

I unsigned short: 0. . . .65,535

I long: -2,147,483,647. . . 2,147,483,647

I unsigned long 0. . . 4,294,967,295

I Today, an int us usually the same as a long. 20 years ago, itwas the same as a short on some machines.

. . . 5/27

The Trouble with Numbers

Floating-Point Numbers

I A floating point number has a sign, an exponent, and amagnitude.

I The sign is the sign of the number.

I The exponent is a positive or negative base-2 numberrepresented in bias notation. A float has a bias-127 exponent:if it starts with a 1 bit, it represents a positive exponent, if itstarts with a 0 bit, the exponent is negative.

I The magnitude is always kept normalized. After everycalculation, the result is shifted left or right, until the first bitis a 1. The exponent is adjusted for each shift.

I During normalization, 1 bits can be shifted off the end of theregister or 0 bits can be brought in.

. . . 6/27

The Trouble with Numbers

Floating point precision and approximate calculation

I A float has 24 bits of magnitude, equivalent to 6+ decimaldigits of precision.

I A float can represent integers exactly, if the integer is shorterthan 24 bits and it is directly converted to type float.

I A double has 36 bits of magnitude, equivalent to 15+ decimaldigits of precision.

I A double can represent any integer exactly if it is directlyconverted to type double.

I However, most fractional values cannot be exactly representedbecause of the limited precision.

I Each time a computation is made, round-off error is possible.Over time, it adds up.

I So a double that is the result of computation is UNLIKELY toEVER exactly equal an integer.

. . . 7/27

The Trouble with Numbers

Floating point overflow

I When the exponent becomes 0 or too large to represent, thevalue becomes a NaN, that is, Not a Number. Some systemsdisplay a special character for Nan, others just show anonsense value. Please learn what your system does and learnto recognize Nan.

I The exponent of a float is 8 bits, able to represent base-10exponents of ±38

I The exponent of a double is 12 bits, able to represent base-10exponents of ±308

I If the exponent of a number grows beyond that, the numberbecomes a NaN.

I Any arithmetic done on a NaN gives the result NaN.

. . . 8/27

The Trouble with Numbers

Floating point underflow

Suppose, during a calculation, an exponent has been adjusted sothat it is at the limit but the magnitude is STILL not normalized.

I At that point, the limited precision of the float or double isdecreased.

I Some systems will let you continue to use that unnormalizednumber.

I Others will not.

. . . 9/27

The Trouble with Numbers

Fuzzy Comparisons

I Because the value of a float or double is usually not accuratein its last few bits, we never use == to compare anything tothe result of a floating computation.

I The method of comparison must include a fuzz factor.if ( fabs( answer - target )< fuzz ) // end loop.

I fabs() is floating point absolute value.

I fuzz is a float or double constant such as .0001 that isappropriate for the amount of precision that you need.

. . . 10/27

The Trouble with Numbers

Scale of Magnitude and limits on precision

When two floating values are added together,

I If they have the same exponents, they are just added andrenormalized.

I If the exponent is different, the smaller exponent must beadjusted by DE-normalizing the number. Then themagnitudes are added and the result is re-normalized.

I In the process of de-normalization, all of the information inthe smaller number can get shifted off the end and lost,leaving a 0 value.

I This happens when the exponents differ by too much.

. . . 11/27

The char Data Types

II. The char Data Types

. . . 12/27

The char Data Types

A dual-purpose type

A char is a dual-purpose data type:

I Representing characters like ’A’ and ’z’ and ’5’ and ’}’.

I Representing very small integers. Note: ’5’ != 5.

Note that single quotes are used for character literals, and doublequotes for strings. ’A’ is a char and "A" is a string and "This is

a string".

There are two char types: signed char, and unsigned char.Type char is the same as one or the other, whichever is native onyour hardware / OS.

. . . 13/27

The char Data Types

Signed and unsigned chars

Like other integer types, chars can be either signed or unsigned.

I Some operating systems use signed chars for characters,others use unsigned chars.

I Most of the time you don’t know and you don’t need to know.

I ASCII code can be stored in a signed char, since it is a 7-bitcode, the sign bit is not important.

I International ASCII is an 8-bit code and requires unsignedchar.

I Modern systems are moving to Unicode, a 16-bit characterrepresentation.

. . . 14/27

The char Data Types

Operations on chars

You can do some kinds of computations with characters.Copy them: (ch = ’A’)

Compare them: if (ch == ’A’ ‖ ch ==’a’)

Add an integer: nextLetter = ch + 1

Subtract a char to get an int: position = ch - ’A’;

Use as a subscript: counter[ch]++

Use in a switch: switch( ch ) {

case ’A’:. . .

. . . 15/27

The char Data Types

Reading and Writing Characters in C

I Use " %c" to read a character. Note the space between thequote and the percent. This skips leading whitespace, thenreads a single keystroke.

I Use "%c" to read the next keystroke WITHOUT skippingwhitespace.

I Use "%c" to write a character.

I Use "%i" to read a small integer into a char variable. Thiscould read a number with more than one keystroke. It doesascii to integer conversion.

I Use "%s" to read a to read a whitespace-delimited string.

Note: Using " %c" is the right way to eliminate whitespace at theend of a line when the next line starts with a char.

. . . 16/27

The char Data Types

Two Examples

char ch1, ch2 = ’\n’;

printf( "Please guess my secret character: " );

scanf( "%c", ch1 ); // Read the next keystroke.

printf( "Guess is %c, my secret is %c\n", ch1, ch2 );

printf( "Who was the first U.S. President?" );

printf( "W: Washington, A: Adams, J: Jefferson" );

scanf( " %c", &ch1 ); // Read one visible char.

if( response == ’W’ ) puts "Right; good job.");

else puts( "Wrong, try again.");

. . . 17/27

The char Data Types

Reading and Writing Characters in C++

I Use cin >> ch; to read a character. This skips leadingwhitespace, then reads a single keystroke.

I Use ch = cin.get() to read the next keystroke WITHOUTskipping whitespace.

I Use cout << ch; to write a character.

I Use cin >> str; to read a whitespace-delimited string.

. . . 18/27

The char Data Types

Two Examples in C++

char ch1, ch2 = ’@’;

cout <<"Please guess my secret character: ";

ch1 = cin.get(); // Read the next keystroke.

cout <<"Guess is " << ch1

<<" my secret is " <<ch2 << ".\n";

cout <<"Who was the first U.S. President?\n"

<<"W: Washington, A: Adams, J: Jefferson" <<endl;

cin >> ch1; // Read one visible char.

if( response == ’W’ ) cout <<"Right; good job.\n";

else cout <<"Wrong, try again.\n";

. . . 19/27

The char Data Types

The ctype library: Character Processing Functions

The ctype library contains functions for processing character data.

These can be used either in C or in C++:isalpha(ch) true for A. . . Z and a. . . z, false otherwiseisdigit(ch) true for 0. . . 9, false otherwiseisalnum(ch) same as isalpha() ‖ isdigit()

isspace(ch) true for a whitspace character, false otherwise(space, tab, newline, CR, vertical tab or formfeed)

islower(ch) true for a. . . z, false otherwiseisupper(ch) true for A. . . Z, false otherwisetolower(ch) If ch is A. . . Z, return a. . . z. Else return ch unchanged.toupper(ch) If ch is a. . . z, return A. . . Z. Else return ch unchanged.

. . . 20/27

Pointers

III. PointersDiagrams of pointers

Pointer operations

. . . 21/27

Pointers

Pointer Details

I A pointer is an address. We say it has star-level 1.

I An int has star-level 0. The address of an int has level 1.

I A pointer variable is a variable that stores an address.

I Pointers are used to process arrays. An array has star-level 1

I Pointers are used to return answers from functions.

int k = 5;

int ary[4] = {}; // An array: 4 slots initialized to 0

int* p1 = &k; // Star-level must match.

int* p2 = arr;

int* p3 = &arr[0]; // Same as line above.

int* q = nullptr; // In C, use NULL.

. . . 22/27

Pointers

int k = 5; int ary[4] = {}; int* p1 = &k; int* p2= arr; int* q = nullptr

arr [0] [1] [2] [[3]

0 0 0 0k 5

p1

p2q

. . . 23/27

Pointers

Pointer Semantics

I The name of an array is translated as a pointer to its slot 0.

I The slot 0 of an array is guaranteed to be at a lower addressthan slot 1.

I The following things make sense ONLY if pointers p and q arepointing into the same array. Pointer arithmetic works in unitsof array slots, not bytes.

I Point to the first byte that is NOT in the array.I Add int N to p to move p N slots toward end of the array.I Subtract q-p to find the # of array slots between p and qI Compare p==q to find if they point to the same array slotI Compare p > q to learn which one is at a larger subscript

. . . 24/27

Pointers

Pointer Semantics and Usage

I In the declaration, the * is part of the type, not part of thevariable name.

I In the code, *p means the contents of the variable p points at.

I In the code, p means the address that p points at.

I So p1 = p2 changes the address that p1 points at.

I So *p1 = *p2 changes something in the underlying array.

p1 = arr; // Point at head of the array.

p2 = arr+4; // Point at the first non-array slot.

q = p1; // q and p1 point at the same thing.

for (q=p1; q<p2; ++q). . . // process the whole array.

. . . 25/27

Pointers

p1 = arr; // This is a stationary head pointer.p2 = arr+4; // This is an offboard tail pointer. q = p1; // This is a scanning pointer. for (q=p1; q<p2; ++q). . .

arr [0] [1] [2] [[3]

0 0 0 0p1

p2q

?

. . . 26/27

Pointers

Array Parameters

I An array argument is ALWAYS passed by pointer. This savestime and space.

I In the function call, use the array name, without any & orsubscript.

I In the function, declare the parameter to be a pointer or anarray; it makes little difference.

I Inside the function, you can use subscripts, even if theparameter is a * type.

I The length of the array is NOT passed to the function as partof the array, so it must be passed separately.

. . . 27/27

Pointers

Pointer Parameters

I A pointer parameter can be used to return an answer from afunction.

I For example, to return a double, you might declare theparameter to be double* db.

I Inside the code, near the end, you would write*db = answer;

Recommended