# 8. Math library and system library built-in functions

Functions come in two varieties. They can be defined by the user or built in as part of the compiler package. As we have seen, user-defined functions have to be declared at the top of the file. Built-in functions, however, are declared in header files using the `#include` directive at the top of the program file, e.g. for common mathematical calculations we include the file cmath with the `#include <cmath>` directive which contains the function prototypes for the mathematical functions in the cmath library

### Mathematical functions

Math library functions allow the programmer to perform a number of common mathematical calculations:

 Function Description sqrt(x) square root sin(x) trigonometric sine of x (in radians) cos(x) trigonometric cosine of x (in radians) tan(x) trigonometric tangent of x (in radians) exp(x) exponential function log(x) natural logarithm of x (base e) log10(x) logarithm of x to base 10 fabs(x) absolute value (unsigned) ceil(x) rounds x up to nearest integer floor(x) rounds x down to nearest integer pow(x,y) x raised to power y

### Random numbers

Other header files which contain the function prototypes of commonly used functions include cstdlib and time. These contain functions for generating random numbers and for manipulating time and dates respectively.

The function random() randomly generates an integer between 0 and the maximum value which can be stored as an integer. Every time the function is called:

```   randomNumber = random();
```

a different number will be assigned to the variable randomNumber. Each number is supposed to have an equal chance of being chosen each time the function is called. The details of how the function achieves this will not be discussed here.

Before a random number generator is used for the first time it must be initialised by giving it a number called the seed. Each seed will result in a different sequence of numbers. The function srandom() is used to provide a seed to initialise the random number generator, random(). It must be called with an arbitrary integer parameter (i.e. the seed) which can be conveniently generated by using the value returned by the system clock function time() with the actual parameter NULL. This returns the calendar time in seconds, converted to an integer value. The following call, which is usually used only once, can be used to initialise the random number generator:

```   srandom(time(NULL));
```

The following program uses these system functions and defines a function to simulate rolling a six-sided die. The die is rolled N times (using a for loop) and the proportion of times the value 6 appears as the outcome is calculated.

(Double click on the icon with the file name RollDice.cc. Compile and run the program.)

```// RollDice.cc
// Program to simulate rolling a die with 6 faces N times.
// Output is generated by random number generator and converted to range.
// Fraction of times the number 6 appears is calculated.

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int RollDie();

int main()
{
int i, outcome, N=0, count_six=0, count_other=0;
float fraction_six, fraction_other;

// Initialise random number generator with value of system time.
srandom(time(NULL));

// Get user input in correct range.
while(N<1 || N>1000)
{
cout << "Input the number of experiments (1-1000): ";
cin >> N;
}

// Perform N experiments.
// Call RollDie() N times and record number of sixes.
for(i=0; i< N; i++)
{
outcome = RollDie();
cout << outcome << endl;
if(outcome==6) count_six++;
else count_other++;
}

//Integer variables must be converted (cast) for correct division
fraction_six = static_cast<float>(count_six)/N;
fraction_other = static_cast<float>(count_other)/N;

// Output results
cout << "Fraction of outcomes in which 6 was rolled: "
<< fraction_six << endl;
cout << "Fraction of outcomes in which other numbers were rolled: "
<< fraction_other << endl;
return 0;
}

```
```// Function to simulate rolling a single 6-sided die.

// Function takes no arguments but returns an integer.
// Each call will randomly return a different integer between 1 and 6.

int RollDie()
{
int randomNumber, die;

randomNumber = random();
die = 1 + (randomNumber % 6);
return die;
}
```