# Using Math Libraries with IA-32 Systems

Most of the routines in libm.a for IA-32 have
been optimized for special use with the Intel®
Pentium®
4 and Xeon(TM) processors. Generic
versions are used when running on an IA-32 processor generation prior
to Pentium 4 processor family.

To use your own version of the standard math functions without unresolved
external errors, you must disable the automatic inline expansion by compiling
your program with the

-nolib_inline option, as described in __Inline Expansion of Library Functions__.

### Caution

A change of the default precision control
or rounding mode (for example, by using the

-pc32 flag or by user intervention) may affect the results returned
by some of the mathematical functions.

## Optimized Math Library Primitives

The optimized math libraries contain a package of functions, called
primitives. The Intel Fortran Compiler calls these functions to implement
numerous floating-point intrinsics and exponentiation. About half of the
functions in the library from Intel are written in assembly language and
optimized for program execution speed on an IA-32 architecture processor.

**Note**

The library primitives are not Fortran intrinsics. They are standard library
calls used by the compiler to implement Intel Fortran language features.

Following is a list of math library primitives
that have been optimized.

acos |
cos |
log10 |
sinh |

asin |
cosh |
pow |
sqrt |

atan |
exp |
powf |
tan |

atan2 |
log |
sin |
tanh |

The math library also provides the following non-optimized primitives.

acosh |
copysign |
fmod |
gamma |

asinh |
erf |
fmodf |
remainder |

atanh |
fabs |
hypot |
rint |

cbrt |
fabsf |
j0 |
y0 |

ceil |
floor |
j1 |
y1 |

ceilf |
floorf |
jn |
y2 |

## Programming with Math Library Primitives

Primitives adhere to standard calling conventions, thus you can call
them with other high-level languages as well as with assembly language.
For Intel Fortran Compiler programs, specify the appropriate Fortran intrinsic
name for arguments of type REAL and DOUBLE
PRECISION. The compiler calls the appropriate single- or double-precision
primitive based on the type of the argument you specify.

To use these functions, you have to write an INTERFACE
block that specifies the ALIAS name of the function.
The routine names in the math library are lower case.