xref: /illumos-gate/usr/src/man/man3lib/libm.3lib (revision dd72704bd9e794056c558153663c739e2012d721)
te
Copyright (c) 2006, Sun Microsystems, Inc. All Rights Reserved.
Copyright 2020 Joyent, Inc.
The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
LIBM 3LIB "December 29, 2021"
NAME
libm - C math library
SYNOPSIS
c99 [ flag... ] file... -lm [ library... ]
DESCRIPTION
Functions in this library provide common elementary mathematical functions and floating point environment routines defined by System V, ANSI C, POSIX, and so on. See standards(7). Additional functions in this library provide extended support for handling floating point exceptions.
INTERFACES
The shared object libm.so.2 provides the public interfaces defined below. See Intro(3) for additional information on shared object interfaces.
acos acosf
acosh acoshf
acoshl acosl
asin asinf
asinh asinhf
asinhl asinl
atan atan2
atan2f atan2l
atanf atanh
atanhf atanhl
atanl cabs
cabsf cabsl
cacos cacosf
cacosh cacoshf
cacoshl cacosl
carg cargf
cargl casin
casinf casinh
casinhf casinhl
casinl catan
catanf catanh
catanhf catanhl
catanl cbrt
cbrtf cbrtl
ccos ccosf
ccosh ccoshf
ccoshl ccosl
ceil ceilf
ceill cexp
cexpf cexpl
cimag cimagf
cimagl clog
clogf clogl
conj conjf
conjl copysign
copysignf copysignl
cos cosf
cosh coshf
coshl cosl
cpow cpowf
cpowl cproj
cprojf cprojl
creal crealf
creall csin
csinf csinh
csinhf csinhl
csinl csqrt
csqrtf csqrtl
ctan ctanf
ctanh ctanhf
ctanhl ctanl
erf erfc
erfcf erfcl
erff erfl
exp exp2
exp2f exp2l
expf expl
expm1 expm1f
expm1l fabs
fabsf fabsl
fdim fdimf
fdiml feclearexcept
fegetenv fegetexceptflag
fegetround feholdexcept
feraiseexcept fesetenv
fesetexceptflag fesetround
fetestexcept feupdateenv
fex_get_handling fex_get_log
fex_get_log_depth fex_getexcepthandler
fex_log_entry fex_merge_flags
fex_set_handling fex_set_log
fex_set_log_depth fex_setexcepthandler
floor floorf
floorl fma
fmaf fmal
fmax fmaxf
fmaxl fmin
fminf fminl
fmod fmodf
fmodl frexp
frexpf frexpl
gamma gamma_r
gammaf gammaf_r
gammal gammal_r
hypot hypotf
hypotl ilogb
ilogbf ilogbl
isnan j0
j0f j0l
j1 j1f
j1l jn
jnf jnl
ldexp ldexpf
ldexpl lgamma
lgamma_r lgammaf
lgammaf_r lgammal
lgammal_r llrint
llrintf llrintl
llround llroundf
llroundl log
log10 log10f
log10l log1p
log1pf log1pl
log2 log2f
log2l logb
logbf logbl
logf logl
lrint lrintf
lrintl lround
lroundf lroundl
matherr modf
modff modfl
nan nanf
nanl nearbyint
nearbyintf nearbyintl
nextafter nextafterf
nextafterl nexttoward
nexttowardf nexttowardl
pow powf
powl remainder
remainderf remainderl
remquo remquof
remquol rint
rintf rintl
round roundf
roundl scalb
scalbf scalbl
scalbln scalblnf
scalblnl scalbn
scalbnf scalbnl
signgam signgamf
signgaml significand
significandf significandl
sin sincos
sincosf sincosl
sinf sinh
sinhf sinhl
sinl sqrt
sqrtf sqrtl
tan tanf
tanh tanhf
tanhl tanl
tgamma tgammaf
tgammal trunc
truncf truncl
y0 y0f
y0l y1
y1f y1l
yn ynf
ynl

The following interfaces are unique to the x86 and amd64 versions of this library:

fegetprec fesetprec
ACCURACY
ISO/IEC 9899:1999, also known as C99, specifies the functions listed in the following tables and states that the accuracy of these functions is "implementation-defined". The information below characterizes the accuracy of these functions as implemented in libm.so.2. For each function, the tables provide an upper bound on the largest error possible for any argument and the largest error actually observed among a large sample of arguments. Errors are expressed in "units in the last place", or ulps, relative to the exact function value for each argument (regarding the argument as exact). Ulps depend on the precision of the floating point format: if y is the exact function value, x and x' are adjacent floating point numbers such that x < y < x', and x'' is the computed function value, then provided x, x', and x'' all lie in the same binade, the error in x'' is |y - x''| / |x - x'| ulps. In particular, when the error is less than one ulp, the computed value is one of the two floating point numbers adjacent to the exact value.

The bounds and observed errors listed below apply only in the default floating point modes. Specifically, on SPARC, these bounds assume the rounding direction is round-to-nearest and non-standard mode is disabled. On x86, the bounds assume the rounding direction is round-to-nearest and the rounding precision is round-to-64-bits. Moreover, on x86, floating point function values are returned in a floating point register in extended double precision format, but the bounds below assume that the result value is then stored to memory in the format corresponding to the function's type. On amd64, the bounds assume the rounding direction in both the x87 floating point control word and the MXCSR is round-to-nearest, the rounding precision in the x87 control word is round-to-64-bits, and the FTZ and DAZ modes are disabled.

The error bounds listed below are believed to be correct, but smaller bounds might be proved later. The observed errors are the largest ones currently known, but larger errors might be discovered later. Numbers in the notes column refer to the notes following the tables.

"Real Functions"
"Single precision real functions (SPARC, x86, and amd64)"
error bound largest error
function (ulps) observed (ulps) notes
acosf 1.0 < 1
acoshf 1.0 < 1
asinf 1.0 < 1
asinhf 1.0 < 1
atanf 1.0 < 1
atan2f 1.0 < 1
atanhf 1.0 < 1
cbrtf 1.0 < 1
cosf 1.0 < 1
coshf 1.0 < 1
erff 1.0 < 1
erfcf 1.0 < 1
expf 1.0 < 1
exp2f 1.0 < 1
expm1f 1.0 < 1
hypotf 1.0 < 1
lgammaf 1.0 < 1
logf 1.0 < 1
log10f 1.0 < 1
log1pf 1.0 < 1
log2f 1.0 < 1
powf 1.0 < 1
sinf 1.0 < 1
sinhf 1.0 < 1
sqrtf 0.5 0.500 [1]
tanf 1.0 < 1
tanhf 1.0 < 1
tgammaf 1.0 < 1
"Double precision real functions (SPARC and amd64)"
error bound largest error
function (ulps) observed (ulps) notes
acos 1.0 < 1
acosh 4.0 1.878
asin 1.0 < 1
asinh 7.0 1.653
atan 1.0 <1
atan2 2.5 1.475
atanh 4.0 1.960
cbrt 1.0 < 1
cos 1.0 < 1
cosh 3.0 1.168
erf 4.0 0.959
erfc 6.0 2.816
exp 1.0 < 1
exp2 2.0 1.050
expm1 1.0 < 1
hypot 1.0 < 1
lgamma 61.5 5.629 [2]
log 1.0 < 1
log10 3.5 1.592
log1p 1.0 < 1
log2 1.0 < 1
pow 1.0 < 1
sin 1.0 < 1
sinh 4.0 2.078
sqrt 0.5 0.500 [1]
tan 1.0 < 1
tanh 3.5 2.136
tgamma 1.0 < 1
"Double precision real functions (x86)"
error bound largest error
function (ulps) observed (ulps) notes
acos 1.0 < 1
acosh 4.0 1.694
asin 1.0 < 1
asinh 7.0 1.493
atan 1.0 < 1
atan2 1.0 < 1
atanh 4.0 1.445
cbrt 1.0 < 1
cos 1.0 < 1
cosh 3.0 1.001
erf 4.0 0.932
erfc 6.0 2.728
exp 1.0 < 1
exp2 1.0 < 1
expm1 1.0 < 1
hypot 1.0 < 1
lgamma 61.5 2.654 [2]
log 1.0 < 1
log10 1.0 < 1
log1p 1.0 < 1
log2 1.0 < 1
pow 1.0 < 1
sin 1.0 < 1
sinh 4.0 1.458
sqrt 0.5003 0.500 [1]
tan 1.0 < 1
tanh 3.5 1.592
tgamma 1.0 < 1
"Quadruple precision real functions (SPARC)"
error bound largest error
function (ulps) observed (ulps) notes
acosl 3.5 1.771
acoshl 8.0 1.275
asinl 4.0 2.007
asinhl 9.0 1.823
atanl 1.0 < 1
atan2l 2.5 1.102
atanhl 4.0 1.970
cbrtl 1.0 < 1
cosl 1.0 < 1
coshl 3.5 0.985
erfl 2.0 0.779
erfcl 68.5 13.923
expl 1.0 < 1
exp2l 2.0 0.714
expm1l 2.0 1.020
hypotl 1.0 < 1
lgammal 18.5 2.916 [2]
logl 1.0 < 1
log10l 3.5 1.156
log1pl 2.0 1.216
log2l 3.5 1.675
powl 1.0 < 1
sinl 1.0 < 1
sinhl 4.5 1.589
sqrtl 0.5 0.500 [1]
tanl 4.5 2.380
tanhl 4.5 1.692
tgammal 1.0 < 1
"Extended precision real functions (x86 and amd64)"
error bound largest error
function (ulps) observed (ulps) notes
acosl 3.0 1.868
acoshl 8.0 2.352
asinl 3.0 1.716
asinhl 9.0 2.346
atanl 1.0 < 1
atan2l 1.0 < 1
atanhl 4.0 2.438
cbrtl 1.0 < 1
cosl 1.0 < 1
coshl 3.5 1.288
erfl 1.0 < 1
erfcl 78.5 13.407
expl 3.5 1.291
exp2l 1.5 0.807
expm1l 4.0 1.936
hypotl 3.5 2.087
lgammal 22.5 4.197 [2]
logl 2.0 0.881
log10l 2.0 1.284
log1pl 5.0 2.370
log2l 1.0 < 1
powl 32770.0 4478.132
sinl 1.0 < 1
sinhl 4.5 2.356
sqrtl 0.5 0.500 [1]
tanl 4.5 2.366
tanhl 4.5 2.417
tgammal 1.0 < 1
"Notes:"

[1]

On SPARC and amd64, sqrtf, sqrt, and sqrtl are correctly rounded in accordance with IEEE 754. On x86, sqrtl is correctly rounded, sqrtf is correctly rounded provided the result is narrowed to single precision as discussed above, but sqrt might not be correctly rounded due to "double rounding": when the intermediate value computed to extended precision lies exactly halfway between two representable numbers in double precision, the result of rounding the intermediate value to double precision is determined by the round-ties-to-even rule. If this rule causes the second rounding to round in the same direction as the first, the net rounding error can exceed 0.5 ulps. (The error is bounded instead by 0.5*(1 + 2^-11) ulps.)

[2]

Error bounds for lgamma and lgammal apply only for positive arguments.

"Complex functions"
The real-valued complex functions cabsf, cabs, cabsl, cargf, carg, and cargl are equivalent to the real functions hypotf, hypot, hypotl, atan2f, atan2, and atan2l, respectively. The error bounds and observed errors given above for the latter functions also apply to the former.

The complex functions listed below are complex-valued. For each function, the error bound shown applies separately to both the real and imaginary parts of the result. (For example, both the real and imaginary parts of cacosf(z) are accurate to within 1 ulp regardless of their magnitudes.) Similarly, the largest observed error shown is the largest error found in either the real or the imaginary part of the result.

"Single precision complex functions (SPARC and amd64)"
error bound largest error
function (ulps) observed (ulps) notes
cacosf, cacoshf 1 < 1 [1]
casinf, casinhf 1 < 1
catanf, catanhf 6 < 1
ccosf, ccoshf 10 2.012
cexpf 3 2.239
clogf 3 < 1
cpowf \(em < 1 [2]
csinf, csinhf 10 2.009
csqrtf 4 < 1
ctanf, ctanhf 13 6.987
"Single precision complex functions (x86)"
error bound largest error
function (ulps) observed (ulps) notes
cacosf, cacoshf 1 < 1 [1]
casinf, casinhf 1 < 1
catanf, catanhf 6 < 1
ccosf, ccoshf 10 1.984
cexpf 3 1.984
clogf 3 < 1
cpowf \(em < 1 [2]
csinf, csinhf 10 1.973
csqrtf 4 < 1
ctanf, ctanhf 13 4.657
"Double precision complex functions (SPARC and amd64)"
error bound largest error
function (ulps) observed (ulps) notes
cacos, cacosh 9 3.831 [1]
casin, casinh 9 3.732
catan, catanh 6 4.179
ccos, ccosh 10 3.832
cexp 3 2.255
clog 3 2.870
cpow - - [2]
csin, csinh 10 3.722
csqrt 4 3.204
ctan, ctanh 13 7.143
"Double precision complex functions (x86)"
error bound largest error
function (ulps) observed (ulps) notes
cacos, cacosh 9 3.624 [1]
casin, casinh 9 3.624
catan, catanh 6 2.500
ccos, ccosh 10 2.929
cexp 3 2.147
clog 3 1.927
cpow - - [2]
csin, csinh 10 2.918
csqrt 4 1.914
ctan, ctanh 13 4.630
"Quadruple precision complex functions (SPARC)"
error bound largest error
function (ulps) observed (ulps) notes
cacosl, cacoshl 9 3 [1]
casinl, casinhl 9 3
catanl, catanhl 6 3
ccosl, ccoshl 10 3
cexpl 3 2
clogl 3 2
cpowl - - [2]
csinl, csinhl 10 3
csqrtl 4 3
ctanl, ctanhl 13 5
"Extended precision complex functions (x86 and amd64)"
error bound largest error
function (ulps) observed (ulps) notes
cacosl, cacoshl 9 2 [1]
casinl, casinhl 9 2
catanl, catanhl 6 2
ccosl, ccoshl 10 3
cexpl 3 2.699
clogl 3 1
cpowl - - [2]
csinl, csinhl 10 3
csqrtl 4 1.452
ctanl, ctanhl 13 5
"Notes:"

[1]

The complex hyperbolic trigonometric functions are equivalent by symmetries to their circular trigonometric counterparts. Because the implementations of these functions exploit these symmetries, corresponding functions have the same error bounds and observed errors.

[2]

For large arguments, the results computed by cpowf, cpow, and cpowl can have unbounded relative error. It might be possible to give error bounds for specific domains, but no such bounds are currently available. The observed errors shown are for the domain {(z,w) : max(|Re z|, |Im z|, |Re w|, |Im w|) <= 1}.

FILES

/lib/libm.so.2

shared object

/lib/64/libm.so.2

64-bit shared object

ATTRIBUTES
See attributes(7) for descriptions of the following attributes:
ATTRIBUTE TYPE ATTRIBUTE VALUE
MT-Level Safe with exceptions

As described on the lgamma(3M) manual page, gamma() and lgamma() and their float and long double counterparts are Unsafe. All other functions in libm.so.2 are MT-Safe.

SEE ALSO
Intro (3), math.h (3HEAD), lgamma (3M), attributes (7), standards (7)