Introduction to C programming/Simple math

C mathematical operations are functions in standard library of the C programming language implementing basic mathematical functions.All functions use numbers in one manner or another. Different C standards provide different sets of functions. Most of these functions are also available in the C++ standard library.

Overview of functions

edit

Most of the mathematical functions are defined in math.h (cmath header in C++). The functions that operate on integers, such as abs, labs, div, and ldiv, are instead defined in the stdlib.h header (cstdlib header in C++).

Any functions that operate on angles use radians as the unit of angle instead of using degree like in normal practise.[1]


Function Description
abs
labs
llabs
computes absolute value of an integer value
fabs computes absolute value of a floating point value
div
ldiv
lldiv
computes the quotient and remainder of integer division
fmod remainder of the floating point division operation
remainder signed remainder of the division operation
remquo signed remainder as well as the three last bits of the division operation
fma fused multiply-add operation
fmax larger of two floating point values
fmin smaller of two floating point values
fdim positive difference of two floating point values
nan
nanf
nanl
returns a not-a-number (NaN)
Exponential
functions
exp returns e raised to the given power
exp2 returns 2 raised to the given power
expm1 returns e raised to the given power, minus one
log computes natural algorithm (to base e)
log2 computes binary algorithm (to base 2)
log10 computes common algorithm (to base 10)
log1p computes natural logarithm (to base e) of 1 plus the given number
ilogb extracts exponent of the number
logb extracts exponent of the number
Power
functions
sqrt computes square root
cbrt computes cubic root
hypot computes square root of the sum of the squares of two given numbers
pow raises a number to the given power[2]
Trigonometric
functions
sin computes sine
cos computes cosine
tan computes tangent
asin computes arc sine
acos computes arc cosine
atan computes arc tangent
atan2 computes arc tangent, using signs to determine quadrants
Hyperbolic
functions
sinh computes hyperbolic sine
cosh computes hyperbolic cosine
tanh computes hyperbolic tangent
asinh computes hyperbolic arc sine
acosh computes hyperbolic arc cosine
atanh computes hyperbolic arc tangent
Error and
gamma
functions
erf computes error function
erfc computes complementary error function
lgamma computes natural logarithm of the absolute value of the gamma language
tgamma computes gamma function
Nearest
integer
floating
point
operations
ceil returns the nearest integer not less than the given value
floor returns the nearest integer not greater than the given value
trunc returns the nearest integer not greater in magnitude than the given value
round
lround
llround
returns the nearest integer, rounding away from zero in halfway cases
nearbyint returns the nearest integer using current rounding mode
rint
lrint
llrint
returns the nearest integer using current rounding mode with exception if the result differs
Floating
point
manipulation
functions
frexp decomposes a number into significand and a power of 2
ldexp multiplies a number by 2 raised to a power
modf decomposes a number into integer and fractional parts
scalbn
scalbln
multiplies a number by FLT_RADIX raised to a power
nextafter
nexttoward
returns next representable floating point value towards the given value
copysign copies the sign of a floating point value
Classification fpclassify categorizes the given floating point value
isfinite checks if the given number has finite value
isinf checks if the given number is infinite
isnan checks if the given number is NaN
isnormal checks if the given number is normal
signbit checks if the given number is negative

Floating point environment

edit

What is the FPU?

The FPU (Floating-Point Unit) is a unit within the CPU set up to perform math in floating point numbers. The reason this is done is, due to the different representations in memory, integral and floating-point numbers need a different physical operation to do math on them. An FPU should be able to addition, subtraction, multiplication and division (but not a modulo, due to problems with accuracy), among other operations, within a very small error margin.

Math with FPU

C99 adds several functions and types for fine-grained control of floating point environment.[3] These functions can be used to control a variety of settings that affect floating-point computations, for example, the rounding mode, on what conditions exceptions occur, when numbers are flushed to zero, etc. The floating point environment functions and types are defined in fenv.h header (cfenv in C++).

Function Description
feclearexcept clears exceptions (C99)
fegetenv stores current floating-point environment (C99)
fegetexceptflag stores current status flags (C99)
fegetround retrieves current rounding direction (C99)
feholdexcept saves current floating-point environment and clears all exceptions (C99)
feraiseexcept raises a floating-point exception (C99)
fesetenv sets current floating-point environment (C99)
fesetexceptflag sets current status flags (C99)
fesetround sets current rounding direction (C99)
fetestexcept tests whether certain exceptions have been raised (C99)
feupdateenv restores floating-point environment, but keeps current exceptions (C99)

Complex numbers

edit

C99 adds a new _Complex keyword (and complex convenience macro) that provides support for complex numbers. Any floating point type can be modified with complex, and is then defined as a pair of floating point numbers. Note that C99 and C++ do not implement complex numbers in a code-compatible way - the latter instead provides the class Template:Cpp.

All operations on complex numbers are defined in complex.h header. As with the real-valued functions, an f or l suffix denotes the float complex or long double complex variant of the function.

Function Description
Basic
operations
cabs computes [[[w:Absolute value#Complex numbers|absolute value]] (C99)
carg computes argument of a complex number (C99)
cimag computes imaginary part of a complex number (C99)
creal computes real part of a complex number (C99)
Template:Man computes complex conjugate (C99)
cproj computes complex projection into the Riemann sphere (C99)
Exponentiation
operations
cexp computes complex exponential (C99)
clog computes complex logarithm (C99)
csqrt computes complex square root (C99)
cpow computes complex power (C99)
Trigonometric
operations
csin computes complex sine (C99)
ccos computes complex cosine (C99)
ctan computes complex tangent (C99)
casin computes complex arc sine (C99)
cacos computes complex arc cosine (C99)
catan computes complex arc tangent (C99)
Hyperbolic
operations
csinh computes complex hyperbolic sine (C99)
ccosh computes complex hyperbolic cosine (C99)
ctanh computes complex hyperbolic tangent (C99)
casinh computes complex hyperbolic arc sine (C99)
cacosh computes complex hyperbolic arc cosine (C99)
catanh computes complex hyperbolic arc tangent (C99)

A few more complex functions are "reserved for future use in C99".[4] Implementations are provided by open-source projects that are not part of the standard library.

Function Description
Error functions cerf computes the complex error function (C99)
cerfc computes the complex complementary error function (C99)

Type-generic functions

edit

The header tgmath.h defines a type-generic macro for each mathematical function defined in math.h and complex.h. This adds a limited support for function overloading of the mathematical functions: the same function name can be used with different types of parameters; the actual function will be selected at compile-time according to the types of the parameters.

Each type-generic macro that corresponds to a function that is defined for both real and complex numbers encapsulates a total of 6 different functions: float, double and long double, and their complex variants. The type-generic macros that correspond to a function that is defined for only real numbers encapsulates a total of 3 different functions: float, double and long double variants of the function.

The C++ language includes native support for function overloading and thus does not provide the tgmath.h header even as a compatibility feature.

Random number generation

edit

The header stdlib.h (cstdlib in C++) defines several functions that can be used for statistically random number generation.[5]

Function Description
rand generates a pseudo-random number between 0 and RAND_MAX.
srand initializes a pseudo-random number generator
arc4random generates a pseudo-random number between 0 and UINT32_MAX, usually using a better algorithm than rand
arc4random_uniform generates a pseudo-random number between 0 and a maximum value.
arc4random_buf fill a buffer with a pseudo-random bitstream.
arc4random_stir initializes a pseudo-random number generator.

The arc4random family of random number functions are not defined in POSIX standard, but is found in some common libc implementations. It used to refer to the keystream generator of a leaked version of RC4 cipher (hence "alleged RC4"), but different algorithms, usually from other ciphers like ChaCha20, have been implemented since using the same name.

The quality of randomness from rand are usually too weak to be even considered statistically random, and it requires explicit seeding. It is usually advised to use arc4random instead of rand when possible. Some C libraries implement rand using arc4random_uniform internally.

Example

edit
/*
PROGRAM : BIRTHDAY CALCULATOR
PROGRAMMER : MD. SALAH UDDIN
EMAIL : salahuddinlovelu@gmail.com
*/

#include <stdio.h>
#include <time.h>

/* checks whether the given input is leap year feb or not */
int lYear(int year, int mon) {
int flag = 0;
if (year % 100 == 0) {
if (year % 400 == 0) {
if (mon == 2) {
flag = 1;
}
}
} else if (year % 4 == 0) {
if (mon == 2) {
flag = 1;
}
}
return (flag);
}

int main() {
/* days in months */
int dInM[] = {31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31};
int days, month, year;
char dob[100];
time_t ts;
struct tm *ct;

/* get the date of birth from the user */
printf("Enter your days of birth [day/month/year]: ");
fgets(dob, 100, stdin);
sscanf(dob, "%d/%d/%d", &days, &month, &year);
ts = time(NULL);
ct = localtime(&ts);
/* scan the year, month and year from the input string */
printf("\nCurrent Date: %d/%d/%d\n",
ct->tm_mday, ct->tm_mon + 1, ct->tm_year + 1900);

days = dInM[month - 1] - days + 1;

/* checking whether month is leap year feb - 29 days*/
if (lYear(year, month)) {
days = days + 1;
}

/* calculating the no of days, years and months */
days = days + ct->tm_mday;
month = (12 - month) + (ct->tm_mon);
year = (ct->tm_year + 1900) - year - 1;

/* checking for leap year feb - 29 days */
if (lYear((ct->tm_year + 1900), (ct->tm_mon + 1))) {
if (days >= (dInM[ct->tm_mon] + 1)) {
days = days - (dInM[ct->tm_mon] + 1);
month = month + 1;
}
} else if (days >= dInM[ct->tm_mon]) {
days = days - (dInM[ct->tm_mon]);
month = month + 1;
}

if (month >= 12) {
year = year + 1;
month = month - 12;
}

/* print the result */
printf("\nYour age: %d year %d months and %d days\n\n",year, month, days);
printf("THANKS FOR USE THIS SOFT\n\n MD.SALAH UDDIN LOVELU\n\n LECTURER KURERPAR ADARSHA COLLEGE\n\n MURADNAGOR, COMILLA.");
return 0;
}

Reference

edit
  1. Cite error: Invalid <ref> tag; no text was provided for refs named c99
  2. Notationally, it may seem convenient to use pow(x,2) or pow(x,3) to compute squares or cubes. However, this is not advisable in time-critical code. Unless an implementation takes special care of these cases at compile time, x*x or x*x*x will execute much faster. Also, sqrt(x) and cbrt(x) should be preferred over pow(x,.5) or pow(x,1./3).
  3. Cite error: Invalid <ref> tag; no text was provided for refs named c_primer_c99
  4. man cerf(3), man cerfc(3), see e.g. http://linux.die.net/man/3/cerf.
  5. "GNU C Library -- Mathematics". Archived from the original on 20 August 2011. Retrieved 2 November 2011.