文章目录
1. 前言
The GNU C Library Reference Manual for version 2.35
2. 数学
Mathematics
本章包含有关用于执行数学计算的函数的信息,例如三角函数。这些函数中的大多数都在头文件 math.h 中声明了原型。复数值函数在 complex.h 中定义。
所有接受浮点参数的数学函数都有三个变体,每个变体用于双精度、浮点和长双精度参数。双重版本主要在 ISO C89 中定义。 float 和 long double 版本来自 ISO C99 中 C 的数字扩展。
应使用函数的三个版本中的哪一个取决于具体情况。对于大多数计算,浮点函数是最快的。另一方面,long double 函数具有最高的精度。 double 介于两者之间。选择可以容纳数据的最窄类型通常是明智的。并非所有机器都有明显的 long double 类型;它可能与 double 相同。
GNU C 库还提供 _FloatN 和 _FloatNx 类型。这些类型在 ISO/IEC TS 18661-3 中定义,它扩展了 ISO C 并定义了不依赖于机器的浮点类型。当 GNU C 库支持此类类型(例如 _Float128)时,还为支持的类型提供了为 double、float 和 long double 提供的大多数数学函数的额外变体。在本手册中,这些函数的 _FloatN 和 _FloatNx 变体与 double、float 和 long double 变体一起描述,它们来自 ISO/IEC TS 18661-3,除非另有明确说明。
在所有平台上都为 _Float32、_Float64 和 _Float32x 提供了对 _FloatN 或 _FloatNx 类型的支持。它还为 powerpc64le(PowerPC 64 位 little-endian)、x86_64、x86、ia64、aarch64、alpha、mips64、riscv、s390 和 sparc 上的 _Float128 和 _Float64x 提供。
2.1. 预定义的数学常数
Predefined Mathematical Constants
头文件 math.h 定义了几个有用的数学常数。所有值都定义为以 M_ 开头的预处理器宏。提供的值为:
M_E
自然对数的底。
M_LOG2E
M_E 的以 2 为底的对数。
M_LOG10E
M_E 以 10 为底的对数。
M_LN2
2的自然对数。
M_LN10
10 的自然对数。
M_PI
Pi,圆的周长与其直径的比值。
M_PI_2
Pi 除以二。
M_PI_4
Pi 除以四。
M_1_PI
pi 的倒数 (1/pi)
M_2_PI
pi 倒数的两倍。
M_2_SQRTPI
pi 平方根倒数的两倍。
M_SQRT2
二的平方根。
M_SQRT1_2
2 的平方根的倒数(也是 1/2 的平方根)。
这些常量来自 Unix98 标准并且在 4.4BSD 中也可用;因此,仅当定义了 _XOPEN_SOURCE=500 或更通用的特征选择宏时才定义它们。默认功能集包括这些常量。请参阅功能测试宏。
所有值都是 double 类型。作为扩展,GNU C 库还定义了这些常量,其类型为 long double 和 float。 long double 宏有一个小写的“l”,而 float 宏的名称后面有一个小写的“f”:M_El、M_PIl 等等。这些仅在定义了 _GNU_SOURCE 时可用。
同样,如果 _GNU_SOURCE 已定义,GNU C 库也为启用了对此类类型的支持的机器定义了这些类型为 _FloatN 和 _FloatNx 的常量(请参阅数学)。如果可用,宏名称会附加“fN”或“fNx”,例如 _Float128 类型的“f128”。
注意:有些程序使用一个名为 PI 的常量,它的值与 M_PI 相同。这个常数不是标准的;它可能出现在一些旧的 AT&T 头文件中,并在 Stroustrup 的 C++ 书中提到。它侵犯了用户的命名空间,所以 GNU C 库没有定义它。修复编写期望它的程序很简单:将 PI 替换为 M_PI,或者在编译器命令行上放置“-DPI=M_PI”。
2.2. 三角函数
Trigonometric Functions
这些是熟悉的 sin、cos 和 tan 函数。所有这些函数的参数都以弧度为单位;回想一下 pi 弧度等于 180 度。
数学库通常将 M_PI 定义为 pi 的双重近似值。如果要求严格遵守 ISO 和/或 POSIX 标准,则未定义此常量,但您可以自己轻松定义:
#define M_PI 3.14159265358979323846264338327
您还可以使用表达式 acos (-1.0) 计算 pi 的值。
函数:
double sin (double x)
float sinf (float x)
long double sinl (long double x)
_FloatN sinfN (_FloatN x)
_FloatNx sinfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的正弦值,其中 x 以弧度表示。返回值在 -1 到 1 的范围内。
函数:
double cos (double x)
float cosf (float x)
long double cosl (long double x)
_FloatN cosfN (_FloatN x)
_FloatNx cosfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的余弦,其中 x 以弧度表示。返回值在 -1 到 1 的范围内。
函数:
double tan (double x)
float tanf (float x)
long double tanl (long double x)
_FloatN tanfN (_FloatN x)
_FloatNx tanfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的正切,其中 x 以弧度表示。
在数学上,正切函数在 pi/2 的奇数倍处具有奇点。如果参数 x 太接近这些奇点之一,则 tan 将发出溢出信号。
在许多使用 sin 和 cos 的应用中,需要同时使用相同角度的正弦和余弦。同时计算它们更有效,因此库提供了一个函数来做到这一点。
函数:
void sincos (double x, double *sinx, double *cosx)
void sincosf (float x, float *sinx, float *cosx)
void sincosl (long double x, long double *sinx, long double *cosx)
_FloatN sincosfN (_FloatN x, _FloatN *sinx, _FloatN *cosx)
_FloatNx sincosfNx (_FloatNx x, _FloatNx *sinx, _FloatNx *cosx)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 在 *sinx 中的正弦值和 x 在 *cosx 中的余弦值,其中 x 以弧度给出。 *sinx 和 *cosx 这两个值都在 -1 到 1 的范围内。
所有这些函数,包括 _FloatN 和 _FloatNx 变体,都是 GNU 扩展。便携式程序应准备好应对它们的缺席。
ISO C99 定义了对复数起作用的三角函数的变体。 GNU C 库提供了这些函数,但它们仅在您的编译器支持标准定义的新复杂类型时才有用。 (在撰写本文时,GCC 支持复数,但在实现中存在错误。)
函数:
complex double csin (complex double z)
complex float csinf (complex float z)
complex long double csinl (complex long double z)
complex _FloatN csinfN (complex _FloatN z)
complex _FloatNx csinfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的复正弦。复正弦的数学定义是
sin (z) = 1/(2*i) * (exp (z*i) - exp (-z*i))
函数:
complex double ccos (complex double z)
complex float ccosf (complex float z)
complex long double ccosl (complex long double z)
complex _FloatN ccosfN (complex _FloatN z)
complex _FloatNx ccosfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的复余弦。复余弦的数学定义是
cos (z) = 1/2 * (exp (z*i) + exp (-z*i))
函数:
complex double ctan (complex double z)
complex float ctanf (complex float z)
complex long double ctanl (complex long double z)
complex _FloatN ctanfN (complex _FloatN z)
complex _FloatNx ctanfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的复正切。复正切的数学定义是
tan (z) = -i * (exp (z*i) - exp (-z*i)) / (exp (z*i) + exp (-z*i))
复数切线在 pi/2 + 2n 处有极点,其中 n 是整数。如果 z 太靠近极点,ctan 可能会发出溢出信号。
2.3. 反三角函数
Inverse Trigonometric Functions
这些是通常的反正弦、反余弦和反正切函数,它们分别是正弦、余弦和正切函数的倒数。
函数:
double asin (double x)
float asinf (float x)
long double asinl (long double x)
_FloatN asinfN (_FloatN x)
_FloatNx asinfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 x 的反正弦值,即正弦值为 x 的值。该值以弧度为单位。在数学上,有无数个这样的值;实际返回的是介于 -pi/2 和 pi/2(含)之间的那个。
反正弦函数仅在域 -1 到 1 上进行数学定义。如果 x 在域之外,则 asin 表示域错误。
函数:
double acos (double x)
float acosf (float x)
long double acosl (long double x)
_FloatN acosfN (_FloatN x)
_FloatNx acosfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 x 的反余弦值,即余弦值为 x 的值。该值以弧度为单位。在数学上,有无数个这样的值;实际返回的是 0 和 pi(含)之间的那个。
反余弦函数仅在域 -1 到 1 上进行数学定义。如果 x 在域之外,acos 会发出域错误信号。
函数:
double atan (double x)
float atanf (float x)
long double atanl (long double x)
_FloatN atanfN (_FloatN x)
_FloatNx atanfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 x 的反正切,即 x 的正切值。该值以弧度为单位。在数学上,有无数个这样的值;实际返回的是介于 -pi/2 和 pi/2(含)之间的那个。
函数:
double atan2 (double y, double x)
float atan2f (float y, float x)
long double atan2l (long double y, long double x)
_FloatN atan2fN (_FloatN y, _FloatN x)
_FloatNx atan2fNx (_FloatNx y, _FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
此函数计算 y/x 的反正切,但两个参数的符号用于确定结果的象限,并且 x 允许为零。返回值以弧度给出,并且在 -pi 到 pi 的范围内,包括端点。
如果 x 和 y 是平面中某个点的坐标,则 atan2 返回从原点到该点的直线与 x 轴之间的带符号角。因此,atan2 可用于将笛卡尔坐标转换为极坐标。 (要计算径向坐标,请使用 hypot;请参阅指数和对数。)
如果 x 和 y 都为零,则 atan2 返回零。
ISO C99 定义了反三角函数的复杂版本。
函数:
complex double casin (complex double z)
complex float casinf (complex float z)
complex long double casinl (complex long double z)
complex _FloatN casinfN (complex _FloatN z)
complex _FloatNx casinfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 z 的复反正弦值,即正弦为 z 的值。返回的值以弧度为单位。
与实值函数不同,casin 是为 z 的所有值定义的。
函数:
complex double cacos (complex double z)
complex float cacosf (complex float z)
complex long double cacosl (complex long double z)
complex _FloatN cacosfN (complex _FloatN z)
complex _FloatNx cacosfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 z 的复反余弦值,即余弦为 z 的值。返回的值以弧度为单位。
与实值函数不同,cacos 是为 z 的所有值定义的。
函数:
complex double catan (complex double z)
complex float catanf (complex float z)
complex long double catanl (complex long double z)
complex _FloatN catanfN (complex _FloatN z)
complex _FloatNx catanfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 z 的复反正切,即与 z 相切的值。该值以弧度为单位。
2.4. 取幂和对数
Exponentiation and Logarithms
函数:
double exp (double x)
float expf (float x)
long double expl (long double x)
_FloatN expfN (_FloatN x)
_FloatNx expfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 e(自然对数的底)的 x 次幂。
如果结果的幅度太大而无法表示,则 exp 信号溢出。
函数:
double exp2 (double x)
float exp2f (float x)
long double exp2l (long double x)
_FloatN exp2fN (_FloatN x)
_FloatNx exp2fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 2 的 x 次幂。在数学上,exp2 (x) 与 exp (x * log (2)) 相同。
函数:
double exp10 (double x)
float exp10f (float x)
long double exp10l (long double x)
_FloatN exp10fN (_FloatN x)
_FloatNx exp10fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 10 的 x 次幂。在数学上,exp10 (x) 与 exp (x * log (10)) 相同。
exp10 函数来自 TS 18661-4:2015。
函数:
double log (double x)
float logf (float x)
long double logl (long double x)
_FloatN logfN (_FloatN x)
_FloatNx logfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数计算 x 的自然对数。 exp (log (x)) 等于 x,在数学中精确,在 C 中近似。
如果 x 为负,则 log 表示域错误。如果 x 为零,则返回负无穷大;如果 x 太接近于零,它可能表示溢出。
函数:
double log10 (double x)
float log10f (float x)
long double log10l (long double x)
_FloatN log10fN (_FloatN x)
_FloatNx log10fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的以 10 为底的对数。 log10 (x) 等于 log (x) / log (10)。
函数:
double log2 (double x)
float log2f (float x)
long double log2l (long double x)
_FloatN log2fN (_FloatN x)
_FloatNx log2fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的以 2 为底的对数。 log2 (x) 等于 log (x) / log (2)。
函数:
double logb (double x)
float logbf (float x)
long double logbl (long double x)
_FloatN logbfN (_FloatN x)
_FloatNx logbfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数提取 x 的指数并将其作为浮点值返回。如果 FLT_RADIX 为 2,则 logb 等于 floor (log2 (x)),但它可能更快。
如果 x 被去规范化,logb 返回 x 被规范化后的指数。如果 x 为无穷大(正或负),则 logb 返回 ∞。如果 x 为零,则 logb 返回 ∞。它不发出信号。
函数:
int ilogb (double x)
int ilogbf (float x)
int ilogbl (long double x)
int ilogbfN (_FloatN x)
int ilogbfNx (_FloatNx x)
long int llogb (double x)
long int llogbf (float x)
long int llogbl (long double x)
long int llogbfN (_FloatN x)
long int llogbfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数等效于相应的 logb 函数,只是它们返回有符号整数值。 ilogb、ilogbf 和 ilogbl 函数来自 ISO C99; llogb、llogbf、llogbl 函数来自 TS 18661-1:2014; ilogbfN、ilogbfNx、llogbfN 和 llogbfNx 函数来自 TS 18661-3:2015。
由于整数不能表示无穷大和 NaN,因此 ilogb 会返回一个整数,该整数不能是普通浮点数的指数。 math.h 定义了常量,因此您可以检查这一点。
宏:int FP_ILOGB0
如果 ilogb 的参数为 0,则返回此值。数值为 INT_MIN 或 -INT_MAX。
该宏在 ISO C99 中定义。
宏:long int FP_LLOGB0
如果 llogb 的参数为 0,则返回此值。数值为 LONG_MIN 或 -LONG_MAX。
此宏在 TS 18661-1:2014 中定义。
宏:int FP_ILOGBNAN
如果 ilogb 的参数为 NaN,则返回此值。数值是 INT_MIN 或 INT_MAX。
该宏在 ISO C99 中定义。
宏:long int FP_LLOGBNAN
如果其参数为 NaN,则 lllogb 返回此值。数值为 LONG_MIN 或 LONG_MAX。
此宏在 TS 18661-1:2014 中定义。
这些值是系统特定的。他们甚至可能是一样的。测试 ilogb 结果的正确方法如下:
i = ilogb (f);
if (i == FP_ILOGB0 || i == FP_ILOGBNAN)
{
if (isnan (f))
{
/* Handle NaN. */
}
else if (f == 0.0)
{
/* Handle 0.0. */
}
else
{
/* Some other value with large exponent,
perhaps +Inf. */
}
}
函数:
double pow (double base, double power)
float powf (float base, float power)
long double powl (long double base, long double power)
_FloatN powfN (_FloatN base, _FloatN power)
_FloatNx powfNx (_FloatNx base, _FloatNx power)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些是一般的幂函数,返回基数的幂。
在数学上,当 base 为负且 power 不是整数值时,pow 将返回一个复数。 pow 不能这样做,所以它会发出域错误的信号。 pow 也可能下溢或溢出目标类型。
函数:
double sqrt (double x)
float sqrtf (float x)
long double sqrtl (long double x)
_FloatN sqrtfN (_FloatN x)
_FloatNx sqrtfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的非负平方根。
如果 x 为负数,则 sqrt 表示域错误。从数学上讲,它应该返回一个复数。
函数:
double cbrt (double x)
float cbrtf (float x)
long double cbrtl (long double x)
_FloatN cbrtfN (_FloatN x)
_FloatNx cbrtfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的立方根。他们不能失败;每个可表示的实数值都有一个可表示的实立方根。
函数:
double hypot (double x, double y)
float hypotf (float x, float y)
long double hypotl (long double x, long double y)
_FloatN hypotfN (_FloatN x, _FloatN y)
_FloatNx hypotfNx (_FloatNx x, _FloatNx y)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 sqrt (xx + yy)。这是边长为 x 和 y 的直角三角形的斜边的长度,或点 (x, y) 到原点的距离。使用这个函数而不是直接公式是明智的,因为误差要小得多。另请参见 Absolute Value 中的功能 cabs。
函数:
double expm1 (double x)
float expm1f (float x)
long double expm1l (long double x)
_FloatN expm1fN (_FloatN x)
_FloatNx expm1fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回一个等于 exp (x) - 1 的值。即使 x 接近于零,它们的计算方式也是准确的——在这种情况下 exp (x) - 1 由于两个数字相减而变得不准确几乎相等。
函数:
double log1p (double x)
float log1pf (float x)
long double log1pl (long double x)
_FloatN log1pfN (_FloatN x)
_FloatNx log1pfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回一个与 log (1 + x) 等效的值。即使 x 接近于零,它们的计算方式也是准确的。
ISO C99 定义了一些幂函数和对数函数的复杂变体。
函数:
complex double cexp (complex double z)
complex float cexpf (complex float z)
complex long double cexpl (complex long double z)
complex _FloatN cexpfN (complex _FloatN z)
complex _FloatNx cexpfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 e(自然对数的底)的 z 次方。在数学上,这对应于值
exp (z) = exp (creal (z)) * (cos (cimag (z)) + I * sin (cimag (z)))
函数:
complex double clog (complex double z)
complex float clogf (complex float z)
complex long double clogl (complex long double z)
complex _FloatN clogfN (complex _FloatN z)
complex _FloatNx clogfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的自然对数。在数学上,这对应于值
log (z) = log (cabs (z)) + I * carg (z)
clog 在 0 处有一个极点,如果 z 等于或非常接近 0,则会发出溢出信号。对于 z 的所有其他值,它是明确定义的。
函数:
complex double clog10 (complex double z)
complex float clog10f (complex float z)
complex long double clog10l (complex long double z)
complex _FloatN clog10fN (complex _FloatN z)
complex _FloatNx clog10fNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回复数值 z 的以 10 为底的对数。在数学上,这对应于值
log10 (z) = log10 (cabs (z)) + I * carg (z) / log (10)
所有这些函数,包括 _FloatN 和 _FloatNx 变体,都是 GNU 扩展。
函数:
complex double csqrt (complex double z)
complex float csqrtf (complex float z)
complex long double csqrtl (complex long double z)
complex _FloatN csqrtfN (_FloatN z)
complex _FloatNx csqrtfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回参数 z 的复平方根。与实值函数不同,它们是为 z 的所有值定义的。
函数:
complex double cpow (complex double base, complex double power)
complex float cpowf (complex float base, complex float power)
complex long double cpowl (complex long double base, complex long double power)
complex _FloatN cpowfN (complex _FloatN base, complex _FloatN power)
complex _FloatNx cpowfNx (complex _FloatNx base, complex _FloatNx power)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数将基础提升到幂次。这相当于 cexp (y * clog (x))
2.5. 双曲函数
Hyperbolic Functions
本节中的函数与指数函数有关;见指数和对数。
函数:
double sinh (double x)
float sinhf (float x)
long double sinhl (long double x)
_FloatN sinhfN (_FloatN x)
_FloatNx sinhfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的双曲正弦,在数学上定义为 (exp (x) - exp (-x)) / 2。如果 x 太大,它们可能会发出溢出信号。
函数:
double cosh (double x)
float coshf (float x)
long double coshl (long double x)
_FloatN coshfN (_FloatN x)
_FloatNx coshfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的双曲余弦值,在数学上定义为 (exp (x) + exp (-x)) / 2。如果 x 太大,它们可能会发出溢出信号。
函数:
double tanh (double x)
float tanhf (float x)
long double tanhl (long double x)
_FloatN tanhfN (_FloatN x)
_FloatNx tanhfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的双曲正切,在数学上定义为 sinh (x) / cosh (x)。如果 x 太大,它们可能会发出溢出信号。
双曲函数有对应的复杂参数。
函数:
complex double csinh (complex double z)
complex float csinhf (complex float z)
complex long double csinhl (complex long double z)
complex _FloatN csinhfN (complex _FloatN z)
complex _FloatNx csinhfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的复双曲正弦,数学定义为 (exp (z) - exp (-z)) / 2。
函数:
complex double ccosh (complex double z)
complex float ccoshf (complex float z)
complex long double ccoshl (complex long double z)
complex _FloatN ccoshfN (complex _FloatN z)
complex _FloatNx ccoshfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的复双曲余弦,在数学上定义为 (exp (z) + exp (-z)) / 2。
函数:
complex double ctanh (complex double z)
complex float ctanhf (complex float z)
complex long double ctanhl (complex long double z)
complex _FloatN ctanhfN (complex _FloatN z)
complex _FloatNx ctanhfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的复双曲正切,在数学上定义为 csinh (z) / ccosh (z)。
函数:
double asinh (double x)
float asinhf (float x)
long double asinhl (long double x)
_FloatN asinhfN (_FloatN x)
_FloatNx asinhfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的反双曲正弦值,即双曲正弦值为 x 的值。
函数:
double acosh (double x)
float acoshf (float x)
long double acoshl (long double x)
_FloatN acoshfN (_FloatN x)
_FloatNx acoshfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的反双曲余弦值,即双曲余弦值为 x 的值。如果 x 小于 1,acosh 会发出域错误信号。
函数:
double atanh (double x)
float atanhf (float x)
long double atanhl (long double x)
_FloatN atanhfN (_FloatN x)
_FloatNx atanhfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 x 的反双曲正切,即双曲正切为 x 的值。如果 x 的绝对值大于 1,则 atanh 表示域错误;如果它等于 1,则 atanh 返回无穷大。
函数:
complex double casinh (complex double z)
complex float casinhf (complex float z)
complex long double casinhl (complex long double z)
complex _FloatN casinhfN (complex _FloatN z)
complex _FloatNx casinhfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的反复双曲正弦值,即复双曲正弦值为 z 的值。
函数:
complex double cacosh (complex double z)
complex float cacoshf (complex float z)
complex long double cacoshl (complex long double z)
complex _FloatN cacoshfN (complex _FloatN z)
complex _FloatNx cacoshfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的反复双曲余弦值,即复双曲余弦值为 z 的值。 与实值函数不同,z 的值没有限制。
函数:
complex double catanh (complex double z)
complex float catanhf (complex float z)
complex long double catanhl (complex long double z)
complex _FloatN catanhfN (complex _FloatN z)
complex _FloatNx catanhfNx (complex _FloatNx z)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这些函数返回 z 的反复双曲正切——复双曲正切为 z 的值。 与实值函数不同,z 的值没有限制。
2.6. 特殊功能
Special Functions
这些是一些更奇特的数学函数,有时很有用。目前他们只有实值版本。
函数:
double erf (double x)
float erff (float x)
long double erfl (long double x)
_FloatN erffN (_FloatN x)
_FloatNx erffNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
erf 返回 x 的误差函数。误差函数定义为
erf (x) = 2/sqrt(pi) * integral from 0 to x of exp(-t^2) dt
函数:
double erfc (double x)
float erfcf (float x)
long double erfcl (long double x)
_FloatN erfcfN (_FloatN x)
_FloatNx erfcfNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
erfc 返回 1.0 - erf(x),但在 x 很大时以避免舍入误差的方式计算。
函数:
double lgamma (double x)
float lgammaf (float x)
long double lgammal (long double x)
_FloatN lgammafN (_FloatN x)
_FloatNx lgammafNx (_FloatNx x)
Preliminary: | MT-Unsafe race:signgam | AS-Unsafe | AC-Safe | See POSIX Safety Concepts.
lgamma 返回 x 的 gamma 函数绝对值的自然对数。伽马函数定义为
gamma (x) = integral from 0 to ∞ of t^(x-1) e^-t dt
gamma 函数的符号存储在全局变量 signgam 中,该变量在 math.h 中声明。如果中间结果为正或为零,则为 1,如果为负,则为 -1。
要计算真正的 gamma 函数,您可以使用 tgamma 函数,也可以按如下方式计算值:
lgam = lgamma(x);
gam = signgam*exp(lgam);
伽马函数在非正整数处具有奇点。如果在奇点处评估,lgamma 将引发零除异常。
函数:
double lgamma_r (double x, int *signp)
float lgammaf_r (float x, int *signp)
long double lgammal_r (long double x, int *signp)
_FloatN lgammafN_r (_FloatN x, int *signp)
_FloatNx lgammafNx_r (_FloatNx x, int *signp)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
lgamma_r 就像 lgamma 一样,但是它将中间结果的符号存储在 signp 指向的变量中,而不是存储在全局 signgam 中。这意味着它是可重入的。
lgammafN_r 和 lgammafNx_r 函数是 GNU 扩展。
函数:
double gamma (double x)
float gammaf (float x)
long double gammal (long double x)
Preliminary: | MT-Unsafe race:signgam | AS-Unsafe | AC-Safe | See POSIX Safety Concepts.
这些函数是出于兼容性原因而存在的。它们等同于 lgamma 等。最好使用 lgamma,因为它的名称更好地反映了实际计算,而且 lgamma 在 ISO C99 中标准化,而 gamma 不是。
函数:
double tgamma (double x)
float tgammaf (float x)
long double tgammal (long double x)
_FloatN tgammafN (_FloatN x)
_FloatNx tgammafNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
tgamma 将 gamma 函数应用于 x。伽马函数定义为
gamma (x) = integral from 0 to ∞ of t^(x-1) e^-t dt
此功能是在 ISO C99 中引入的。 ISO/IEC TS 18661-3 中引入了 _FloatN 和 _FloatNx 变体。
函数:
double j0 (double x)
float j0f (float x)
long double j0l (long double x)
_FloatN j0fN (_FloatN x)
_FloatNx j0fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
j0 返回 x 的第一种 0 阶贝塞尔函数。如果 x 太大,它可能会发出下溢信号。
_FloatN 和 _FloatNx 变体是 GNU 扩展。
函数:
double j1 (double x)
float j1f (float x)
long double j1l (long double x)
_FloatN j1fN (_FloatN x)
_FloatNx j1fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
j1 返回 x 的第一类 1 阶 Bessel 函数。如果 x 太大,它可能会发出下溢信号。
_FloatN 和 _FloatNx 变体是 GNU 扩展。
函数:
double jn (int n, double x)
float jnf (int n, float x)
long double jnl (int n, long double x)
_FloatN jnfN (int n, _FloatN x)
_FloatNx jnfNx (int n, _FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
jn 返回 x 的第一类 n 阶 Bessel 函数。如果 x 太大,它可能会发出下溢信号。
_FloatN 和 _FloatNx 变体是 GNU 扩展。
函数:
double y0 (double x)
float y0f (float x)
long double y0l (long double x)
_FloatN y0fN (_FloatN x)
_FloatNx y0fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
y0 返回 x 的二阶 0 的 Bessel 函数。如果 x 太大,它可能会发出下溢信号。如果 x 为负,则 y0 表示域错误;如果为零,则 y0 表示溢出并返回 -∞。
_FloatN 和 _FloatNx 变体是 GNU 扩展。
函数:
double y1 (double x)
float y1f (float x)
long double y1l (long double x)
_FloatN y1fN (_FloatN x)
_FloatNx y1fNx (_FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
y1 返回 x 的二阶 1 的 Bessel 函数。如果 x 太大,它可能会发出下溢信号。如果 x 为负,则 y1 表示域错误;如果为零,则 y1 表示溢出并返回 -∞。
_FloatN 和 _FloatNx 变体是 GNU 扩展。
函数:
double yn (int n, double x)
float ynf (int n, float x)
long double ynl (int n, long double x)
_FloatN ynfN (int n, _FloatN x)
_FloatNx ynfNx (int n, _FloatNx x)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
yn 返回 x 的二阶 n 的 Bessel 函数。如果 x 太大,它可能会发出下溢信号。如果 x 为负,则 yn 表示域错误;如果为零,则 yn 表示溢出并返回 -∞。
_FloatN 和 _FloatNx 变体是 GNU 扩展。
2.7. 数学函数中已知的最大误差
Known Maximum Errors in Math Functions
本节列出了数学库中函数的已知错误。错误以“最后一位的单位”来衡量。这是相对误差的度量。对于表示为 d.d…d·2^e 的数字 z(我们假设 IEEE 浮点数以 2 为底),ULP 表示为
|d.d...d - (z / 2^e)| / 2^(p - 1)
其中 p 是浮点数表示的尾数中的位数。理想情况下,所有函数的误差在四舍五入模式下始终小于 0.5ulps。使用舍入位也是可能的,并且通常用于基本操作。除了某些函数,如 sqrt、fma 和 rint,其结果完全通过引用相应的 IEEE 754 浮点运算以及字符串和浮点之间的转换来指定,GNU C 库不针对函数中的正确舍入结果。数学库,并且不针对是否引发“不精确”异常的正确性。相反,没有完全指定结果的函数准确性目标如下:某些功能存在错误,这意味着它们在所有情况下都不能满足这些目标。将来,GNU C 库可能会以 crsin 等名称提供一些其他正确的舍入函数,以扩展 ISO C。
- 每个具有浮点结果的函数的行为就好像它计算一个无限精度的结果,该结果在函数的数学正确值的几个 ulp(实部和复数部分,对于具有复杂结果的函数)(与所讨论函数的 ISO C 或 POSIX 语义)作为输入传递的确切值。该值会根据 IEEE 754 / ISO C / POSIX 语义适当地引发异常,然后根据当前舍入方向舍入到返回给用户的结果。 errno 也可以设置(参见数学函数的错误报告)。 (“不精确”异常可能会引发或不引发,即使这与无限精度值不一致。)
- 对于在 PowerPC GNU/Linux 上使用的 IBM long double 格式,对于不能以 106 位精度精确表示的输入值,精度目标较弱;就好像输入值是实际传递的值的 0.5ulp 内的某个值,其中“ulp”被解释为固定精度的 106 位尾数,但不一定是实际传递的不连续尾数位的确切值。
- 对于 IBM long double 格式,其结果完全通过引用相应的 IEEE 754 浮点运算指定的函数具有与其他函数相同的精度目标,但误差范围与除法 (3ulp) 相同。此外,任何输入的所有函数都可能引发“不精确”和“下溢”异常,即使此类异常与返回值不一致,因为底层浮点运算具有该属性。
- 当且仅当这是数学上正确的无限精度结果时,函数的行为就好像计算出的无限精度结果为零、无穷大或 NaN。它们表现得好像计算出的无限精度结果总是与数学上正确的结果具有相同的符号。
- 如果数学结果比当前舍入方向的溢出阈值多几个 ulp,则返回的值是当前舍入方向的适当溢出值,并引发溢出异常。
- 如果数学结果的幅度远低于最小次正规幅度的一半,则返回值为零或最小次正规(在每种情况下,具有正确的符号),根据当前舍入方向并引发下溢异常。
- 在数学结果下溢(舍入之前)并且不能精确表示为浮点值的情况下,函数的行为不像计算出的无限精度结果是低于正常范围内的精确值。这意味着除了数学结果非常接近下溢阈值并且函数表现得好像它计算没有下溢的无限精度结果的情况之外,可能会引发下溢异常。 (因此,在下溢结果准确的情况下可能会出现虚假的下溢异常,但在不准确的情况下不会丢失下溢异常。)
- GNU C 库并不旨在让函数满足基础数学函数的其他属性,例如单调性,而上述目标并未暗示这些属性。
- 以上所有内容都适用于复杂功能的实部和复数部分。
因此数学库中的许多函数都有错误。 该表列出了测试套件中现有测试之一公开的每个函数的最大错误。 该表试图尽可能地涵盖并列出实际的最大误差(或至少是一个大概的数字),但由于搜索空间很大,这通常无法实现。
该表列出了不同架构的 ULP 值。 不同的架构有不同的结果,因为它们对浮点运算的硬件支持不同,现有的硬件支持也不同。 此表仅涵盖四舍五入模式。 未列出的函数没有已知错误。 x86_64 libmvec 库中函数的向量版本的最大误差为 4 ulps。
Function AArch64 ARC ARC soft-float ARM Alpha
acosf 1 1 1 1 1
acos 1 1 1 1 1
acosl 1 - - - 1
acosf128 - - - - -
acoshf 2 2 2 2 2
acosh 2 3 2 2 2
acoshl 4 - - - 4
acoshf128 - - - - -
add_ldoublef - - - - -
add_ldouble - - - - -
add_ldoublel - - - - -
add_ldoublef128 - - - - -
asinf 1 1 1 1 1
asin 1 1 1 1 1
asinl 1 - - - 1
asinf128 - - - - -
asinhf 2 2 2 2 2
asinh 2 3 2 2 2
asinhl 4 - - - 4
asinhf128 - - - - -
atanf 1 1 1 1 1
atan 1 1 1 1 1
atanl 1 - - - 1
atanf128 - - - - -
atan2f 1 2 2 2 2
atan2 - 7 - - -
atan2l 2 - - - 2
atan2f128 - - - - -
atanhf 2 2 2 2 2
atanh 2 2 2 2 2
atanhl 4 - - - 4
atanhf128 - - - - -
cabsf - 1 - - -
cabs 1 1 1 1 1
cabsl 1 - - - 1
cabsf128 - - - - -
cacosf 2 + i 2 2 + i 3 2 + i 2 2 + i 2 2 + i 2
cacos 1 + i 2 2 + i 5 1 + i 2 1 + i 2 1 + i 2
cacosl 2 + i 2 - - - 2 + i 2
cacosf128 - - - - -
cacoshf 2 + i 2 4 + i 2 2 + i 2 2 + i 2 2 + i 2
cacosh 2 + i 1 5 + i 2 2 + i 1 2 + i 1 2 + i 1
cacoshl 2 + i 2 - - - 2 + i 2
cacoshf128 - - - - -
cargf 1 2 1 1 1
carg 1 7 - - -
cargl 2 - - - 2
cargf128 - - - - -
casinf 1 + i 2 1 + i 4 1 + i 2 1 + i 2 1 + i 2
casin 1 + i 2 3 + i 5 1 + i 2 1 + i 2 1 + i 2
casinl 2 + i 2 - - - 2 + i 2
casinf128 - - - - -
casinhf 2 + i 1 4 + i 2 2 + i 1 2 + i 1 2 + i 1
casinh 2 + i 1 5 + i 3 2 + i 1 2 + i 1 2 + i 1
casinhl 2 + i 2 - - - 2 + i 2
casinhf128 - - - - -
catanf 1 + i 1 1 + i 3 1 + i 1 1 + i 1 1 + i 1
catan 1 + i 1 1 + i 3 1 + i 1 1 + i 1 1 + i 1
catanl 1 + i 1 - - - 1 + i 1
catanf128 - - - - -
catanhf 1 + i 1 4 + i 2 1 + i 1 1 + i 1 1 + i 1
catanh 1 + i 1 4 + i 1 1 + i 1 1 + i 1 1 + i 1
catanhl 1 + i 1 - - - 1 + i 1
catanhf128 - - - - -
cbrtf 1 1 1 1 1
cbrt 4 4 4 4 4
cbrtl 1 - - - 1
cbrtf128 - - - - -
ccosf 1 + i 1 3 + i 3 1 + i 1 1 + i 1 1 + i 1
ccos 1 + i 1 3 + i 3 1 + i 1 1 + i 1 1 + i 1
ccosl 1 + i 1 - - - 1 + i 1
ccosf128 - - - - -
ccoshf 1 + i 1 3 + i 3 1 + i 1 1 + i 1 1 + i 1
ccosh 1 + i 1 3 + i 3 1 + i 1 1 + i 1 1 + i 1
ccoshl 1 + i 1 - - - 1 + i 1
ccoshf128 - - - - -
cexpf 1 + i 2 3 + i 3 1 + i 2 1 + i 2 1 + i 2
cexp 2 + i 1 4 + i 4 2 + i 1 2 + i 1 2 + i 1
cexpl 1 + i 1 - - - 1 + i 1
cexpf128 - - - - -
clogf 3 + i 1 4 + i 2 3 + i 1 3 + i 1 3 + i 1
clog 3 + i 1 5 + i 7 3 + i 1 3 + i 1 3 + i 1
clogl 2 + i 1 - - - 2 + i 1
clogf128 - - - - -
clog10f 4 + i 2 5 + i 4 4 + i 2 4 + i 2 4 + i 2
clog10 3 + i 2 6 + i 8 3 + i 2 3 + i 2 3 + i 2
clog10l 2 + i 2 - - - 2 + i 2
clog10f128 - - - - -
cosf 1 1 1 1 1
cos 1 4 1 1 1
cosl 2 - - - 2
cosf128 - - - - -
coshf 2 3 2 2 2
cosh 2 3 2 2 2
coshl 2 - - - 2
coshf128 - - - - -
cpowf 5 + i 2 8 + i 6 5 + i 2 5 + i 2 5 + i 2
cpow 2 + i 0 9 + i 8 2 + i 0 2 + i 0 2 + i 0
cpowl 4 + i 1 - - - 4 + i 1
cpowf128 - - - - -
csinf 1 + i 0 3 + i 3 1 + i 0 1 + i 0 1 + i 0
csin 1 + i 0 3 + i 3 1 + i 0 1 + i 0 1 + i 0
csinl 1 + i 1 - - - 1 + i 1
csinf128 - - - - -
csinhf 1 + i 1 3 + i 3 1 + i 1 1 + i 1 1 + i 1
csinh 0 + i 1 3 + i 3 0 + i 1 0 + i 1 0 + i 1
csinhl 1 + i 1 - - - 1 + i 1
csinhf128 - - - - -
csqrtf 2 + i 2 3 + i 3 2 + i 2 2 + i 2 2 + i 2
csqrt 2 + i 2 4 + i 4 2 + i 2 2 + i 2 2 + i 2
csqrtl 2 + i 2 - - - 2 + i 2
csqrtf128 - - - - -
ctanf 1 + i 2 6 + i 2 1 + i 2 1 + i 2 1 + i 2
ctan 1 + i 2 4 + i 3 1 + i 2 1 + i 2 1 + i 2
ctanl 3 + i 3 - - - 3 + i 3
ctanf128 - - - - -
ctanhf 2 + i 1 2 + i 6 2 + i 2 2 + i 2 2 + i 2
ctanh 2 + i 2 3 + i 4 2 + i 2 2 + i 2 2 + i 2
ctanhl 3 + i 3 - - - 3 + i 3
ctanhf128 - - - - -
div_ldoublef - - - - -
div_ldouble - - - - -
div_ldoublel - - - - -
div_ldoublef128 - - - - -
erff 1 1 1 1 1
erf 1 1 1 1 1
erfl 1 - - - 1
erff128 - - - - -
erfcf 2 5 3 3 3
erfc 2 5 5 5 5
erfcl 4 - - - 4
erfcf128 - - - - -
expf 1 1 1 1 1
exp 1 1 1 1 1
expl 1 - - - 1
expf128 - - - - -
exp10f 1 1 1 1 1
exp10 2 4 2 2 2
exp10l 2 - - - 2
exp10f128 - - - - -
exp2f 1 1 - 1 1
exp2 1 1 1 1 1
exp2l 1 - - - 1
exp2f128 - - - - -
expm1f 1 2 1 1 1
expm1 1 2 1 1 1
expm1l 2 - - - 2
expm1f128 - - - - -
fmaf - - - - -
fma - - - - -
fmal - - - - -
fmaf128 - - - - -
fma_ldoublef - - - - -
fma_ldouble - - - - -
fma_ldoublel - - - - -
fma_ldoublef128 - - - - -
fmodf - - - - -
fmod - - - - -
fmodl - - - - -
fmodf128 - - - - -
gammaf 4 6 7 7 7
gamma 3 7 4 4 4
gammal 5 - - - 5
gammaf128 - - - - -
hypotf - 1 - - -
hypot 1 2 1 1 1
hypotl 1 - - - 1
hypotf128 - - - - -
j0f 9 9 9 9 9
j0 3 4 2 2 2
j0l 2 - - - 2
j0f128 - - - - -
j1f 9 9 9 9 9
j1 4 5 4 4 4
j1l 4 - - - 4
j1f128 - - - - -
jnf 4 8 4 4 4
jn 4 9 4 4 4
jnl 7 - - - 7
jnf128 - - - - -
lgammaf 4 6 7 7 7
lgamma 3 7 4 4 4
lgammal 5 - - - 5
lgammaf128 - - - - -
logf 1 1 - 1 1
log 1 1 - - -
logl 1 - - - 1
logf128 - - - - -
log10f 2 3 2 2 2
log10 2 2 2 2 2
log10l 2 - - - 2
log10f128 - - - - -
log1pf 1 1 1 1 1
log1p 1 1 1 1 1
log1pl 3 - - - 3
log1pf128 - - - - -
log2f 1 1 1 1 1
log2 1 2 2 2 2
log2l 3 - - - 3
log2f128 - - - - -
mul_ldoublef - - - - -
mul_ldouble - - - - -
mul_ldoublel - - - - -
mul_ldoublef128 - - - - -
powf 1 1 - 1 1
pow 1 1 1 1 1
powl 2 - - - 2
powf128 - - - - -
pow10f - - - - -
pow10 - - - - -
pow10l - - - - -
pow10f128 - - - - -
sinf 1 1 1 1 1
sin 1 7 1 1 1
sinl 2 - - - 2
sinf128 - - - - -
sincosf 1 1 1 1 1
sincos 1 1 1 1 1
sincosl 1 - - - 1
sincosf128 - - - - -
sinhf 2 3 2 2 2
sinh 2 3 2 2 2
sinhl 2 - - - 2
sinhf128 - - - - -
sqrtf - - - - -
sqrt - - - - -
sqrtl - - - - -
sqrtf128 - - - - -
sqrt_ldoublef - - - - -
sqrt_ldouble - - - - -
sqrt_ldoublel - - - - -
sqrt_ldoublef128- - - - -
sub_ldoublef - - - - -
sub_ldouble - - - - -
sub_ldoublel - - - - -
sub_ldoublef128 - - - - -
tanf 1 1 1 1 1
tan - 1 - - -
tanl 1 - - - 1
tanf128 - - - - -
tanhf 2 2 2 2 2
tanh 2 3 2 2 2
tanhl 2 - - - 2
tanhf128 - - - - -
tgammaf 8 9 8 8 8
tgamma 9 9 9 9 9
tgammal 4 - - - 4
tgammaf128 - - - - -
y0f 8 8 9 9 9
y0 2 3 3 3 3
y0l 3 - - - 3
y0f128 - - - - -
y1f 9 9 9 9 9
y1 3 7 3 3 3
y1l 5 - - - 5
y1f128 - - - - -
ynf 3 9 3 3 3
yn 3 9 3 3 3
ynl 5 - - - 5
ynf128 - - - - -
Function CSKY CSKY soft-float ColdFire Generic HPPA
acosf 1 1 - - 1
acos - - - - 1
acosl - - - - -
acosf128 - - - - -
acoshf 2 2 - - 2
acosh 2 2 - - 2
acoshl - - - - -
acoshf128 - - - - -
add_ldoublef - - - - -
add_ldouble - - - - -
add_ldoublel - - - - -
add_ldoublef128 - - - - -
asinf 1 1 - - 1
asin - - - - 1
asinl - - - - -
asinf128 - - - - -
asinhf 2 2 - - 2
asinh 2 2 - - 2
asinhl - - - - -
asinhf128 - - - - -
atanf 1 1 - - 1
atan - - - - 1
atanl - - - - -
atanf128 - - - - -
atan2f 1 1 1 - 2
atan2 - - - - -
atan2l - - - - -
atan2f128 - - - - -
atanhf 2 2 1 - 2
atanh 2 2 - - 2
atanhl - - - - -
atanhf128 - - - - -
cabsf - - - - -
cabs 1 1 - - 1
cabsl - - - - -
cabsf128 - - - - -
cacosf 2 + i 2 2 + i 2 - - 2 + i 2
cacos 1 + i 2 1 + i 2 - - 1 + i 2
cacosl - - - - -
cacosf128 - - - - -
cacoshf 2 + i 2 2 + i 2 0 + i 1 - 2 + i 2
cacosh 2 + i 1 2 + i 1 - - 2 + i 1
cacoshl - - - - -
cacoshf128 - - - - -
cargf 1 1 - - 1
carg - - - - -
cargl - - - - -
cargf128 - - - - -
casinf 1 + i 2 1 + i 2 1 + i 0 - 1 + i 2
casin 1 + i 2 1 + i 2 1 + i 0 - 1 + i 2
casinl - - - - 1 + i 0
casinf128 - - - - -
casinhf 2 + i 1 2 + i 1 1 + i 6 - 2 + i 1
casinh 2 + i 1 2 + i 1 5 + i 3 - 5 + i 3
casinhl - - - - 5 + i 3
casinhf128 - - - - -
catanf 1 + i 1 1 + i 1 0 + i 1 - 1 + i 1
catan 1 + i 1 1 + i 1 0 + i 1 - 1 + i 1
catanl - - - - 0 + i 1
catanf128 - - - - -
catanhf 1 + i 1 1 + i 1 - - 1 + i 1
catanh 1 + i 1 1 + i 1 4 + i 0 - 4 + i 1
catanhl - - - - 4 + i 0
catanhf128 - - - - -
cbrtf 1 1 - - 1
cbrt 4 4 1 - 4
cbrtl - - - - 1
cbrtf128 - - - - -
ccosf 1 + i 1 1 + i 1 1 + i 1 - 1 + i 1
ccos 1 + i 1 1 + i 1 1 + i 0 - 1 + i 1
ccosl - - - - 1 + i 0
ccosf128 - - - - -
ccoshf 1 + i 1 1 + i 1 1 + i 1 - 1 + i 1
ccosh 1 + i 1 1 + i 1 1 + i 0 - 1 + i 1
ccoshl - - - - 1 + i 0
ccoshf128 - - - - -
cexpf 1 + i 2 1 + i 2 1 + i 1 - 1 + i 2
cexp 2 + i 1 2 + i 1 - - 2 + i 1
cexpl - - - - -
cexpf128 - - - - -
clogf 3 + i 1 3 + i 1 1 + i 0 - 3 + i 1
clog 3 + i 0 3 + i 0 - - 3 + i 1
clogl - - - - -
clogf128 - - - - -
clog10f 4 + i 2 4 + i 2 1 + i 1 - 4 + i 2
clog10 3 + i 2 3 + i 2 0 + i 1 - 3 + i 2
clog10l - - - - 0 + i 1
clog10f128 - - - - -
cosf 1 1 1 - 1
cos 1 1 2 - 2
cosl - - - - 2
cosf128 - - - - -
coshf 2 2 - - 2
cosh 2 2 - - 2
coshl - - - - -
coshf128 - - - - -
cpowf 5 + i 2 5 + i 2 4 + i 2 - 5 + i 2
cpow 2 + i 0 2 + i 0 2 + i 2 - 2 + i 2
cpowl - - - - 2 + i 2
cpowf128 - - - - -
csinf 1 + i 0 1 + i 0 - - 1 + i 0
csin 1 + i 0 1 + i 0 - - 1 + i 0
csinl - - - - -
csinf128 - - - - -
csinhf 1 + i 1 1 + i 1 1 + i 1 - 1 + i 1
csinh 0 + i 1 0 + i 1 0 + i 1 - 0 + i 1
csinhl - - - - 0 + i 1
csinhf128 - - - - -
csqrtf 2 + i 2 2 + i 2 1 + i 0 - 2 + i 2
csqrt 2 + i 2 2 + i 2 - - 2 + i 2
csqrtl - - - - -
csqrtf128 - - - - -
ctanf 1 + i 2 1 + i 2 - - 1 + i 2
ctan 1 + i 2 1 + i 2 0 + i 1 - 1 + i 2
ctanl - - - - 0 + i 1
ctanf128 - - - - -
ctanhf 2 + i 2 2 + i 2 2 + i 1 - 2 + i 2
ctanh 2 + i 2 2 + i 2 1 + i 0 - 2 + i 2
ctanhl - - - - 1 + i 0
ctanhf128 - - - - -
div_ldoublef - - - - -
div_ldouble - - - - -
div_ldoublel - - - - -
div_ldoublef128 - - - - -
erff 1 1 - - 1
erf 1 1 1 - 1
erfl - - - - 1
erff128 - - - - -
erfcf 3 3 - - 3
erfc 5 5 1 - 5
erfcl - - - - 1
erfcf128 - - - - -
expf 1 1 - - 1
exp 1 1 - - 1
expl - - - - -
expf128 - - - - -
exp10f - - 2 - 2
exp10 2 2 6 - 6
exp10l - - - - 6
exp10f128 - - - - -
exp2f - 1 - - 1
exp2 1 1 - - 1
exp2l - - - - -
exp2f128 - - - - -
expm1f 1 1 1 - 1
expm1 1 1 1 - 1
expm1l - - - - 1
expm1f128 - - - - -
fmaf - - - - -
fma - - - - -
fmal - - - - -
fmaf128 - - - - -
fma_ldoublef - - - - -
fma_ldouble - - - - -
fma_ldoublel - - - - -
fma_ldoublef128 - - - - -
fmodf - - - - -
fmod - - - - -
fmodl - - - - -
fmodf128 - - - - -
gammaf 7 7 - - 7
gamma 4 4 - - 4
gammal - - - - -
gammaf128 - - - - -
hypotf - - 1 - 1
hypot 1 1 - - 1
hypotl - - - - -
hypotf128 - - - - -
j0f 8 8 2 - 9
j0 2 2 2 - 2
j0l - - - - 2
j0f128 - - - - -
j1f 9 9 2 - 9
j1 2 2 1 - 4
j1l - - - - 1
j1f128 - - - - -
jnf 4 4 4 - 5
jn 4 4 4 - 4
jnl - - - - 4
jnf128 - - - - -
lgammaf 7 7 2 - 7
lgamma 4 4 1 - 4
lgammal - - - - 1
lgammaf128 - - - - -
logf - 1 - - 1
log - - - - -
logl - - - - -
logf128 - - - - -
log10f 2 2 2 - 2
log10 2 2 1 - 2
log10l - - - - 1
log10f128 - - - - -
log1pf 1 1 1 - 1
log1p 1 1 - - 1
log1pl - - - - -
log1pf128 - - - - -
log2f 1 1 - - 1
log2 2 2 - - 2
log2l - - - - -
log2f128 - - - - -
mul_ldoublef - - - - -
mul_ldouble - - - - -
mul_ldoublel - - - - -
mul_ldoublef128 - - - - -
powf - 1 - - 1
pow 1 1 - - 1
powl - - - - -
powf128 - - - - -
pow10f - - - - -
pow10 - 2 - - -
pow10l - - - - -
pow10f128 - - - - -
sinf 1 1 - - 1
sin 1 1 - - 1
sinl - - - - -
sinf128 - - - - -
sincosf - 1 1 - 1
sincos 1 1 1 - 1
sincosl - - - - 1
sincosf128 - - - - -
sinhf 2 2 - - 2
sinh 2 2 - - 2
sinhl - - - - -
sinhf128 - - - - -
sqrtf - - - - -
sqrt - - - - -
sqrtl - - - - -
sqrtf128 - - - - -
sqrt_ldoublef - - - - -
sqrt_ldouble - - - - -
sqrt_ldoublel - - - - -
sqrt_ldoublef128- - - - -
sub_ldoublef - - - - -
sub_ldouble - - - - -
sub_ldoublel - - - - -
sub_ldoublef128 - - - - -
tanf 1 1 - - 1
tan - - 1 - 1
tanl - - - - 1
tanf128 - - - - -
tanhf 2 2 - - 2
tanh 2 2 - - 2
tanhl - - - - -
tanhf128 - - - - -
tgammaf 8 8 1 - 8
tgamma 9 9 1 - 9
tgammal - - - - 1
tgammaf128 - - - - -
y0f 8 8 1 - 9
y0 3 3 2 - 3
y0l - - - - 2
y0f128 - - - - -
y1f 2 2 2 - 9
y1 3 3 3 - 3
y1l - - - - 3
y1f128 - - - - -
ynf 3 3 2 - 3
yn 3 3 3 - 3
ynl - - - - 3
ynf128 - - - - -
Function IA64 M68k MIPS 32-bit MIPS 64-bit MicroBlaze
acosf - - 1 1 1
acos 1 - 1 1 -
acosl - - - 1 -
acosf128 1 - - - -
acoshf - 1 2 2 2
acosh 1 1 2 2 2
acoshl 1 1 - 4 -
acoshf128 4 - - - -
add_ldoublef - - - - -
add_ldouble - - - - -
add_ldoublel - - - - -
add_ldoublef128 - - - - -
asinf - - 1 1 1
asin - - 1 1 -
asinl - - - 1 -
asinf128 1 - - - -
asinhf - 1 2 2 1
asinh 1 1 2 2 1
asinhl - 1 - 4 -
asinhf128 4 - - - -
atanf - - 1 1 1
atan - - 1 1 -
atanl - - - 1 -
atanf128 1 - - - -
atan2f - 1 2 2 1
atan2 - - - - -
atan2l - 1 - 2 -
atan2f128 2 - - - -
atanhf - - 2 2 2
atanh - - 2 2 2
atanhl - - - 4 -
atanhf128 4 - - - -
cabsf - - - - -
cabs - 1 1 1 1
cabsl - 1 - 1 -
cabsf128 1 - - - -
cacosf 2 + i 2 2 + i 1 2 + i 2 2 + i 2 2 + i 2
cacos 1 + i 2 1 + i 1 1 + i 2 1 + i 2 1 + i 2
cacosl 1 + i 2 1 + i 2 - 2 + i 2 -
cacosf128 2 + i 2 - - - -
cacoshf 2 + i 2 1 + i 2 2 + i 2 2 + i 2 2 + i 2
cacosh 2 + i 1 1 + i 1 2 + i 1 2 + i 1 2 + i 1
cacoshl 2 + i 1 2 + i 1 - 2 + i 2 -
cacoshf128 2 + i 2 - - - -
cargf - 1 1 1 1
carg - - - - -
cargl - 1 - 2 -
cargf128 2 - - - -
casinf 1 + i 2 1 + i 1 1 + i 2 1 + i 2 1 + i 2
casin 1 + i 2 1 + i 1 1 + i 2 1 + i 2 1 + i 2
casinl 1 + i 2 1 + i 2 - 2 + i 2 -
casinf128 2 + i 2 - - - -
casinhf 2 + i 1 1 + i 1 2 + i 1 2 + i 1 2 + i 1
casinh 2 + i 1 1 + i 1 2 + i 1 2 + i 1 2 + i 1
casinhl 2 + i 1 2 + i 1 - 2 + i 2 -
casinhf128 2 + i 2 - - - -
catanf 0 + i 1 0 + i 1 1 + i 1 1 + i 1 1 + i 1
catan 1 + i 1 0 + i 1 1 + i 1 1 + i 1 1 + i 1
catanl 0 + i 1 1 + i 1 - 1 + i 1 -
catanf128 1 + i 1 - - - -
catanhf 1 + i 0 1 + i 0 1 + i 1 1 + i 1 1 + i 1
catanh 1 + i 1 1 + i 0 1 + i 1 1 + i 1 1 + i 1
catanhl 1 + i 0 1 + i 1 - 1 + i 1 -
catanhf128 1 + i 1 - - - -
cbrtf - 1 1 1 1
cbrt - 1 4 4 3
cbrtl - 1 - 1 -
cbrtf128 1 - - - -
ccosf 0 + i 1 - 1 + i 1 1 + i 1 1 + i 1
ccos 1 + i 1 - 1 + i 1 1 + i 1 1 + i 1
ccosl 1 + i 1 1 + i 1 - 1 + i 1 -
ccosf128 1 + i 1 - - - -
ccoshf 1 + i 1 - 1 + i 1 1 + i 1 1 + i 1
ccosh 1 + i 1 - 1 + i 1 1 + i 1 1 + i 1
ccoshl 0 + i 1 0 + i 1 - 1 + i 1 -
ccoshf128 1 + i 1 - - - -
cexpf 1 + i 2 - 1 + i 2 1 + i 2 1 + i 2
cexp 2 + i 1 - 2 + i 1 2 + i 1 2 + i 1
cexpl 1 + i 1 1 + i 1 - 1 + i 1 -
cexpf128 1 + i 1 - - - -
clogf 3 + i 0 2 + i 1 3 + i 1 3 + i 1 3 + i 1
clog 2 + i 1 3 + i 1 3 + i 1 3 + i 1 3 + i 0
clogl 2 + i 1 3 + i 1 - 2 + i 1 -
clogf128 2 + i 1 - - - -
clog10f 4 + i 1 2 + i 1 4 + i 2 4 + i 2 4 + i 2
clog10 3 + i 2 2 + i 1 3 + i 2 3 + i 2 3 + i 2
clog10l 2 + i 1 3 + i 2 - 2 + i 2 -
clog10f128 2 + i 2 - - - -
cosf 1 - 1 1 1
cos 1 1 1 1 -
cosl - - - 2 -
cosf128 2 - - - -
coshf - - 2 2 1
cosh - - 2 2 1
coshl - - - 2 -
coshf128 2 - - - -
cpowf 5 + i 2 3 + i 5 5 + i 2 5 + i 2 4 + i 2
cpow 2 + i 0 1 + i 0 2 + i 0 2 + i 0 2 + i 0
cpowl 3 + i 4 3 + i 1 - 4 + i 1 -
cpowf128 4 + i 1 - - - -
csinf 1 + i 1 - 1 + i 0 1 + i 0 1 + i 0
csin 1 + i 0 - 1 + i 0 1 + i 0 1 + i 0
csinl 1 + i 0 1 + i 0 - 1 + i 1 -
csinf128 1 + i 1 - - - -
csinhf 1 + i 1 - 1 + i 1 1 + i 1 1 + i 1
csinh 1 + i 1 - 0 + i 1 0 + i 1 0 + i 1
csinhl 1 + i 1 1 + i 0 - 1 + i 1 -
csinhf128 1 + i 1 - - - -
csqrtf 2 + i 2 1 + i 1 2 + i 2 2 + i 2 2 + i 2
csqrt 2 + i 2 1 + i 1 2 + i 2 2 + i 2 2 + i 2
csqrtl 2 + i 2 2 + i 2 - 2 + i 2 -
csqrtf128 2 + i 2 - - - -
ctanf 1 + i 1 1 + i 1 1 + i 2 1 + i 2 1 + i 1
ctan 1 + i 2 1 + i 1 1 + i 2 1 + i 2 1 + i 2
ctanl 2 + i 2 2 + i 2 - 3 + i 3 -
ctanf128 3 + i 3 - - - -
ctanhf 1 + i 1 1 + i 2 2 + i 2 2 + i 2 1 + i 2
ctanh 2 + i 2 1 + i 1 2 + i 2 2 + i 2 2 + i 2
ctanhl 1 + i 2 2 + i 2 - 3 + i 3 -
ctanhf128 3 + i 3 - - - -
div_ldoublef - - - - -
div_ldouble - - - - -
div_ldoublel - - - - -
div_ldoublef128 - - - - -
erff - 1 1 1 1
erf - - 1 1 1
erfl - 1 - 1 -
erff128 1 - - - -
erfcf - 1 3 3 2
erfc - - 5 5 3
erfcl - 2 - 4 -
erfcf128 4 - - - -
expf 1 - 1 1 1
exp - - 1 1 -
expl - - - 1 -
expf128 1 - - - -
exp10f 1 - 1 1 -
exp10 - - 2 2 2
exp10l - - - 2 -
exp10f128 2 - - - -
exp2f - - 1 1 1
exp2 1 1 1 1 1
exp2l 1 - - 1 -
exp2f128 1 - - - -
expm1f - - 1 1 1
expm1 1 - 1 1 1
expm1l 1 - - 2 -
expm1f128 2 - - - -
fmaf - - - - -
fma - - - - -
fmal - - - - -
fmaf128 - - - - -
fma_ldoublef - - - - -
fma_ldouble - - - - -
fma_ldoublel - - - - -
fma_ldoublef128 - - - - -
fmodf - - - - -
fmod - - - - -
fmodl - - - - -
fmodf128 - - - - -
gammaf 1 1 7 7 4
gamma - - 4 4 4
gammal - 2 - 5 -
gammaf128 - - - - -
hypotf - - - - -
hypot - 1 1 1 1
hypotl - 1 - 1 -
hypotf128 1 - - - -
j0f 9 2 9 9 2
j0 3 1 2 2 2
j0l 8 2 - 2 -
j0f128 2 - - - -
j1f 9 2 9 9 2
j1 4 - 4 4 1
j1l 6 1 - 4 -
j1f128 4 - - - -
jnf 4 2 4 4 4
jn 4 2 4 4 4
jnl 4 4 - 7 -
jnf128 7 - - - -
lgammaf 1 1 7 7 4
lgamma - - 4 4 4
lgammal - 2 - 5 -
lgammaf128 5 - - - -
logf - - 1 1 1
log - - - - -
logl - - - 1 -
logf128 1 - - - -
log10f - - 2 2 2
log10 - - 2 2 2
log10l - - - 2 -
log10f128 2 - - - -
log1pf - - 1 1 1
log1p - - 1 1 1
log1pl - - - 3 -
log1pf128 3 - - - -
log2f - - 1 1 1
log2 - - 2 2 2
log2l - - - 3 -
log2f128 3 - - - -
mul_ldoublef - - - - -
mul_ldouble - - - - -
mul_ldoublel - - - - -
mul_ldoublef128 - - - - -
powf - 7 1 1 1
pow - 1 1 1 -
powl - 9 - 2 -
powf128 2 - - - -
pow10f - - - - -
pow10 - - - - -
pow10l - - - - -
pow10f128 - - - - -
sinf - - 1 1 1
sin 1 1 1 1 -
sinl - - - 2 -
sinf128 2 - - - -
sincosf - - 1 1 1
sincos 1 - 1 1 -
sincosl - - - 1 -
sincosf128 1 - - - -
sinhf - - 2 2 2
sinh - - 2 2 2
sinhl - - - 2 -
sinhf128 2 - - - -
sqrtf - - - - -
sqrt - - - - -
sqrtl - - - - -
sqrtf128 - - - - -
sqrt_ldoublef - - - - -
sqrt_ldouble - - - - -
sqrt_ldoublel - - - - -
sqrt_ldoublef128- - - - -
sub_ldoublef - - - - -
sub_ldouble - - - - -
sub_ldoublel - - - - -
sub_ldoublef128 - - - - -
tanf - - 1 1 1
tan - - - - -
tanl 1 - - 1 -
tanf128 1 - - - -
tanhf - - 2 2 2
tanh - - 2 2 2
tanhl - - - 2 -
tanhf128 2 - - - -
tgammaf - 4 8 8 4
tgamma - 1 9 9 5
tgammal 1 9 - 4 -
tgammaf128 4 - - - -
y0f 8 1 9 9 1
y0 2 1 3 3 2
y0l 1 1 - 3 -
y0f128 3 - - - -
y1f 9 3 9 9 2
y1 3 1 3 3 3
y1l 5 2 - 5 -
y1f128 5 - - - -
ynf 3 3 3 3 2
yn 3 2 3 3 3
ynl 3 4 - 5 -
ynf128 5 - - - -
Function Nios II OpenRISC PowerPC PowerPC soft-float RISC-V
acosf 1 1 1 1 1
acos 1 1 1 1 -
acosl - - 1 1 1
acosf128 - - 1 - -
acoshf 2 2 2 2 2
acosh 2 2 2 2 2
acoshl - - 2 1 2
acoshf128 - - 4 - -
add_ldoublef - - 1 1 -
add_ldouble - - 1 1 -
add_ldoublel - - - - -
add_ldoublef128 - - - - -
asinf 1 1 1 1 1
asin 1 1 1 1 -
asinl - - 2 2 1
asinf128 - - 1 - -
asinhf 2 2 2 2 2
asinh 2 2 2 2 1
asinhl - - 2 2 3
asinhf128 - - 4 - -
atanf 1 1 1 1 1
atan 1 1 1 1 -
atanl - - 1 1 1
atanf128 - - 1 - -
atan2f 2 2 1 2 1
atan2 - - - - -
atan2l - - 2 2 1
atan2f128 - - 2 - -
atanhf 2 2 2 2 2
atanh 2 2 2 2 2
atanhl - - 2 2 3
atanhf128 - - 4 - -
cabsf - - - - -
cabs 1 1 1 1 1
cabsl - - 1 1 1
cabsf128 - - 1 - -
cacosf 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
cacos 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
cacosl - - 1 + i 2 2 + i 1 2 + i 2
cacosf128 - - 2 + i 2 - -
cacoshf 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
cacosh 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
cacoshl - - 2 + i 1 1 + i 2 2 + i 2
cacoshf128 - - 2 + i 2 - -
cargf 1 1 1 1 1
carg - - 1 - -
cargl - - 2 2 2
cargf128 - - 2 - -
casinf 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
casin 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
casinl - - 1 + i 2 2 + i 1 2 + i 2
casinf128 - - 2 + i 2 - -
casinhf 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
casinh 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
casinhl - - 2 + i 1 1 + i 2 2 + i 2
casinhf128 - - 2 + i 2 - -
catanf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
catan 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
catanl - - 3 + i 2 3 + i 2 1 + i 1
catanf128 - - 1 + i 1 - -
catanhf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
catanh 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
catanhl - - 2 + i 3 2 + i 3 1 + i 1
catanhf128 - - 1 + i 1 - -
cbrtf 1 1 1 1 1
cbrt 4 4 4 4 3
cbrtl - - 1 1 1
cbrtf128 - - 1 - -
ccosf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccos 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccosl - - 1 + i 2 1 + i 2 1 + i 1
ccosf128 - - 1 + i 1 - -
ccoshf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccosh 1 + i 1 2 + i 1 1 + i 1 1 + i 1 1 + i 1
ccoshl - - 1 + i 2 1 + i 2 1 + i 1
ccoshf128 - - 1 + i 1 - -
cexpf 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
cexp 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
cexpl - - 2 + i 2 1 + i 1 1 + i 1
cexpf128 - - 1 + i 1 - -
clogf 3 + i 1 3 + i 1 3 + i 1 3 + i 1 3 + i 1
clog 3 + i 1 3 + i 1 3 + i 1 3 + i 1 3 + i 0
clogl - - 5 + i 2 2 + i 2 2 + i 1
clogf128 - - 2 + i 1 - -
clog10f 4 + i 2 4 + i 2 4 + i 2 4 + i 2 4 + i 2
clog10 3 + i 2 3 + i 2 3 + i 2 3 + i 2 3 + i 2
clog10l - - 3 + i 2 3 + i 2 2 + i 2
clog10f128 - - 2 + i 2 - -
cosf 1 1 3 1 1
cos 1 1 1 1 1
cosl - - 4 4 1
cosf128 - - 2 - -
coshf 2 2 2 2 2
cosh 2 2 2 2 1
coshl - - 3 3 1
coshf128 - - 2 - -
cpowf 5 + i 2 5 + i 2 5 + i 2 5 + i 2 5 + i 2
cpow 2 + i 0 2 + i 0 2 + i 0 2 + i 0 2 + i 0
cpowl - - 4 + i 2 4 + i 1 4 + i 1
cpowf128 - - 4 + i 1 - -
csinf 1 + i 0 1 + i 0 1 + i 0 1 + i 0 1 + i 0
csin 1 + i 0 1 + i 0 1 + i 0 1 + i 0 1 + i 0
csinl - - 2 + i 1 2 + i 1 1 + i 1
csinf128 - - 1 + i 1 - -
csinhf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
csinh 0 + i 1 0 + i 1 0 + i 1 0 + i 1 0 + i 1
csinhl - - 1 + i 2 1 + i 2 1 + i 1
csinhf128 - - 1 + i 1 - -
csqrtf 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
csqrt 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
csqrtl - - 1 + i 1 1 + i 1 2 + i 2
csqrtf128 - - 2 + i 2 - -
ctanf 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
ctan 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
ctanl - - 3 + i 2 3 + i 2 3 + i 3
ctanf128 - - 3 + i 3 - -
ctanhf 2 + i 2 2 + i 2 2 + i 1 2 + i 2 2 + i 1
ctanh 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
ctanhl - - 3 + i 3 2 + i 3 3 + i 3
ctanhf128 - - 3 + i 3 - -
div_ldoublef - - 1 1 -
div_ldouble - - - - -
div_ldoublel - - - - -
div_ldoublef128 - - - - -
erff 1 1 1 1 1
erf 1 1 1 1 1
erfl - - 1 1 1
erff128 - - 1 - -
erfcf 3 3 2 3 2
erfc 5 5 2 5 2
erfcl - - 3 3 2
erfcf128 - - 4 - -
expf 1 1 1 1 1
exp 1 1 1 1 -
expl - - 1 1 1
expf128 - - 1 - -
exp10f - 1 1 - -
exp10 2 2 2 2 2
exp10l - - 1 1 2
exp10f128 - - 2 - -
exp2f 1 - - 1 -
exp2 1 1 1 1 1
exp2l - - 2 1 1
exp2f128 - - 1 - -
expm1f 1 1 1 1 1
expm1 1 1 1 1 1
expm1l - - 1 1 1
expm1f128 - - 2 - -
fmaf - - - - -
fma - - - - -
fmal - - 1 1 -
fmaf128 - - - - -
fma_ldoublef - - 1 - -
fma_ldouble - - 1 - -
fma_ldoublel - - - - -
fma_ldoublef128 - - - - -
fmodf - - - - -
fmod - - - - -
fmodl - - 1 1 -
fmodf128 - - - - -
gammaf 7 7 4 7 3
gamma 4 4 3 4 3
gammal - - 3 3 5
gammaf128 - - 5 - -
hypotf - - - - -
hypot 1 1 1 1 1
hypotl - - 1 1 1
hypotf128 - - 1 - -
j0f 8 9 9 9 8
j0 2 2 3 2 2
j0l - - 5 4 2
j0f128 - - 7 - -
j1f 9 9 9 9 8
j1 2 4 4 4 2
j1l - - 6 10 4
j1f128 - - 4 - -
jnf 4 4 4 4 4
jn 4 4 4 4 4
jnl - - 4 4 7
jnf128 - - 7 - -
lgammaf 7 7 4 7 3
lgamma 4 4 3 4 3
lgammal - - 3 3 5
lgammaf128 - - 5 - -
logf 1 - 1 1 -
log - - 1 - -
logl - - 1 1 1
logf128 - - 1 - -
log10f 2 2 2 2 2
log10 2 2 2 2 2
log10l - - 1 1 1
log10f128 - - 2 - -
log1pf 1 1 1 1 1
log1p 1 1 1 1 1
log1pl - - 2 2 2
log1pf128 - - 3 - -
log2f 1 1 1 1 1
log2 2 - 1 2 1
log2l - - 1 1 2
log2f128 - - 3 - -
mul_ldoublef - - 1 1 -
mul_ldouble - - 1 1 -
mul_ldoublel - - - - -
mul_ldoublef128 - - - - -
powf 3 - 1 1 -
pow 1 1 1 1 1
powl - - 1 1 2
powf128 - - 2 - -
pow10f - - - - -
pow10 - - - - -
pow10l - - - - -
pow10f128 - - - - -
sinf 1 1 1 1 1
sin 1 1 1 1 1
sinl - - 1 1 1
sinf128 - - 2 - -
sincosf 1 - 1 1 -
sincos 1 1 1 1 1
sincosl - - 1 1 1
sincosf128 - - 1 - -
sinhf 2 2 2 2 2
sinh 2 2 2 2 2
sinhl - - 3 3 2
sinhf128 - - 2 - -
sqrtf - - - - -
sqrt - - - - -
sqrtl - - 1 1 -
sqrtf128 - - - - -
sqrt_ldoublef - - - - -
sqrt_ldouble - - 1 - -
sqrt_ldoublel - - - - -
sqrt_ldoublef128- - - - -
sub_ldoublef - - 1 1 -
sub_ldouble - - 1 1 -
sub_ldoublel - - - - -
sub_ldoublef128 - - - - -
tanf 1 1 3 1 1
tan - - - - -
tanl - - 2 2 1
tanf128 - - 1 - -
tanhf 2 2 2 2 2
tanh 2 2 2 2 2
tanhl - - 1 1 2
tanhf128 - - 2 - -
tgammaf 8 8 8 8 8
tgamma 9 9 9 9 5
tgammal - - 5 5 4
tgammaf128 - - 4 - -
y0f 8 9 8 9 6
y0 3 3 2 3 2
y0l - - 10 10 3
y0f128 - - 3 - -
y1f 2 9 9 9 2
y1 3 3 3 3 3
y1l - - 2 2 2
y1f128 - - 5 - -
ynf 3 3 3 3 3
yn 3 3 3 3 3
ynl - - 2 2 5
ynf128 - - 5 - -
Function RISC-V soft-float S/390 SH Sparc i686
acosf 1 1 1 1 -
acos - 1 - 1 1
acosl 1 1 - 1 2
acosf128 - - - - 1
acoshf 2 2 2 2 -
acosh 2 2 2 2 1
acoshl 2 4 - 4 3
acoshf128 - - - - 4
add_ldoublef - - - - -
add_ldouble - - - - -
add_ldoublel - - - - -
add_ldoublef128 - - - - -
asinf 1 1 1 1 -
asin - 1 - 1 1
asinl 1 1 - 1 1
asinf128 - - - - 1
asinhf 1 2 2 2 -
asinh 1 2 2 2 1
asinhl 3 4 - 4 3
asinhf128 - - - - 4
atanf 1 1 1 1 -
atan - 1 - 1 1
atanl 1 1 - 1 1
atanf128 - - - - 1
atan2f 1 1 1 2 -
atan2 - - - - 1
atan2l 1 2 - 2 1
atan2f128 - - - - 2
atanhf 2 2 2 2 -
atanh 2 2 2 2 1
atanhl 3 4 - 4 3
atanhf128 - - - - 4
cabsf - - - - -
cabs 1 1 1 1 1
cabsl 1 1 - 1 1
cabsf128 - - - - 1
cacosf 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
cacos 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
cacosl 2 + i 2 2 + i 2 - 2 + i 2 1 + i 2
cacosf128 - - - - 2 + i 2
cacoshf 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
cacosh 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
cacoshl 2 + i 2 2 + i 2 - 2 + i 2 2 + i 1
cacoshf128 - - - - 2 + i 2
cargf 1 1 1 1 -
carg - - - - 1
cargl 2 2 - 2 1
cargf128 - - - - 2
casinf 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
casin 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
casinl 2 + i 2 2 + i 2 - 2 + i 2 1 + i 2
casinf128 - - - - 2 + i 2
casinhf 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
casinh 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
casinhl 2 + i 2 2 + i 2 - 2 + i 2 2 + i 1
casinhf128 - - - - 2 + i 2
catanf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 0 + i 1
catan 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
catanl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1
catanf128 - - - - 1 + i 1
catanhf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 0
catanh 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
catanhl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1
catanhf128 - - - - 1 + i 1
cbrtf 1 1 1 1 1
cbrt 3 4 4 4 1
cbrtl 1 1 - 1 3
cbrtf128 - - - - 1
ccosf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccos 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccosl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1
ccosf128 - - - - 1 + i 1
ccoshf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccosh 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
ccoshl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1
ccoshf128 - - - - 1 + i 1
cexpf 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
cexp 2 + i 1 2 + i 1 2 + i 1 2 + i 1 2 + i 1
cexpl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1
cexpf128 - - - - 1 + i 1
clogf 3 + i 1 3 + i 1 3 + i 1 3 + i 1 3 + i 0
clog 3 + i 0 3 + i 1 3 + i 0 3 + i 1 2 + i 1
clogl 2 + i 1 2 + i 1 - 4 + i 1 3 + i 1
clogf128 - - - - 2 + i 1
clog10f 4 + i 2 4 + i 2 4 + i 2 4 + i 2 4 + i 1
clog10 3 + i 2 3 + i 2 3 + i 2 3 + i 2 3 + i 2
clog10l 2 + i 2 2 + i 2 - 4 + i 2 4 + i 2
clog10f128 - - - - 2 + i 2
cosf - 1 1 1 -
cos 1 1 1 1 1
cosl 1 2 - 2 1
cosf128 - - - - 2
coshf 1 2 2 2 2
cosh 1 2 2 2 1
coshl 1 2 - 2 3
coshf128 - - - - 2
cpowf 5 + i 2 5 + i 2 5 + i 2 5 + i 2 5 + i 2
cpow 2 + i 0 2 + i 0 2 + i 0 2 + i 0 2 + i 1
cpowl 4 + i 1 4 + i 1 - 4 + i 1 3 + i 4
cpowf128 - - - - 4 + i 1
csinf 1 + i 0 1 + i 0 1 + i 0 1 + i 0 1 + i 1
csin 1 + i 0 1 + i 0 1 + i 0 1 + i 0 1 + i 1
csinl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 0
csinf128 - - - - 1 + i 1
csinhf 1 + i 1 1 + i 1 1 + i 1 1 + i 1 1 + i 1
csinh 0 + i 1 0 + i 1 0 + i 1 0 + i 1 1 + i 1
csinhl 1 + i 1 1 + i 1 - 1 + i 1 1 + i 1
csinhf128 - - - - 1 + i 1
csqrtf 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
csqrt 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
csqrtl 2 + i 2 2 + i 2 - 2 + i 2 2 + i 2
csqrtf128 - - - - 2 + i 2
ctanf 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
ctan 1 + i 2 1 + i 2 1 + i 2 1 + i 2 1 + i 2
ctanl 3 + i 3 3 + i 3 - 3 + i 3 2 + i 1
ctanf128 - - - - 3 + i 3
ctanhf 2 + i 2 2 + i 1 2 + i 2 2 + i 2 2 + i 2
ctanh 2 + i 2 2 + i 2 2 + i 2 2 + i 2 2 + i 2
ctanhl 3 + i 3 3 + i 3 - 3 + i 3 1 + i 2
ctanhf128 - - - - 3 + i 3
div_ldoublef - - - - -
div_ldouble - - - - -
div_ldoublel - - - - -
div_ldoublef128 - - - - -
erff 1 1 1 1 1
erf 1 1 1 1 1
erfl 1 1 - 1 1
erff128 - - - - 1
erfcf 2 2 2 3 3
erfc 3 2 5 5 5
erfcl 2 4 - 4 5
erfcf128 - - - - 4
expf - 1 1 1 1
exp - 1 1 1 1
expl 1 1 - 1 1
expf128 - - - - 1
exp10f - 1 - 1 -
exp10 2 2 2 2 1
exp10l 2 2 - 2 1
exp10f128 - - - - 2
exp2f - - - 1 -
exp2 1 1 1 1 1
exp2l 1 1 - 1 1
exp2f128 - - - - 1
expm1f 1 1 1 1 -
expm1 1 1 1 1 1
expm1l 1 2 - 2 3
expm1f128 - - - - 2
fmaf - - - - -
fma - - - - -
fmal - - - - -
fmaf128 - - - - -
fma_ldoublef - - - - -
fma_ldouble - - - - -
fma_ldoublel - - - - -
fma_ldoublef128 - - - - -
fmodf - - - - -
fmod - - - - -
fmodl - - - - -
fmodf128 - - - - -
gammaf 3 3 3 7 5
gamma 4 3 4 4 4
gammal 5 5 - 5 4
gammaf128 - - - - -
hypotf - - - - -
hypot 1 1 1 1 1
hypotl 1 1 - 1 1
hypotf128 - - - - 1
j0f 2 9 8 9 9
j0 2 4 2 2 5
j0l 2 2 - 2 8
j0f128 - - - - 2
j1f 2 9 8 9 9
j1 1 4 2 4 4
j1l 4 4 - 4 9
j1f128 - - - - 4
jnf 4 4 4 4 4
jn 4 4 4 4 4
jnl 7 7 - 7 4
jnf128 - - - - 7
lgammaf 3 3 3 7 5
lgamma 4 3 4 4 4
lgammal 5 5 - 5 4
lgammaf128 - - - - 5
logf - - 1 1 -
log - 1 - - 1
logl 1 1 - 1 1
logf128 - - - - 1
log10f 2 2 2 2 -
log10 2 2 2 2 1
log10l 1 2 - 2 1
log10f128 - - - - 2
log1pf 1 1 1 1 -
log1p 1 1 1 1 1
log1pl 2 3 - 3 2
log1pf128 - - - - 3
log2f 1 1 1 1 1
log2 2 - 2 2 1
log2l 2 3 - 3 1
log2f128 - - - - 3
mul_ldoublef - - - - -
mul_ldouble - - - - -
mul_ldoublel - - - - -
mul_ldoublef128 - - - - -
powf - - 1 3 -
pow 1 1 1 1 1
powl 2 2 - 2 1
powf128 - - - - 2
pow10f - - - - -
pow10 - - - - -
pow10l - - - - -
pow10f128 - - - - -
sinf - 1 1 1 -
sin 1 1 1 1 1
sinl 1 2 - 2 2
sinf128 - - - - 2
sincosf - - 1 1 -
sincos 1 1 1 1 1
sincosl 1 1 - 1 1
sincosf128 - - - - 1
sinhf 2 2 2 2 2
sinh 2 2 2 2 2
sinhl 2 2 - 2 3
sinhf128 - - - - 2
sqrtf - - - - -
sqrt - - - - -
sqrtl - - - - -
sqrtf128 - - - - -
sqrt_ldoublef - - - - -
sqrt_ldouble - - - - -
sqrt_ldoublel - - - - -
sqrt_ldoublef128- - - - -
sub_ldoublef - - - - -
sub_ldouble - - - - -
sub_ldoublel - - - - -
sub_ldoublef128 - - - - -
tanf 1 1 1 1 1
tan - - - - -
tanl 1 1 - 1 2
tanf128 - - - - 1
tanhf 2 2 2 2 2
tanh 2 2 2 2 2
tanhl 2 2 - 2 3
tanhf128 - - - - 2
tgammaf 4 8 8 8 8
tgamma 5 9 9 9 9
tgammal 4 4 - 4 5
tgammaf128 - - - - 4
y0f 1 8 6 9 9
y0 2 2 3 3 3
y0l 3 3 - 3 2
y0f128 - - - - 3
y1f 2 9 2 9 9
y1 3 3 3 3 3
y1l 2 5 - 5 3
y1f128 - - - - 5
ynf 3 3 3 3 3
yn 3 3 3 3 3
ynl 5 5 - 5 4
ynf128 - - - - 5
Function ix86 x86_64
acosf - 1
acos 1 1
acosl 2 2
acosf128 1 1
acoshf - 2
acosh 1 2
acoshl 3 3
acoshf128 4 4
add_ldoublef - -
add_ldouble - -
add_ldoublel - -
add_ldoublef128 - -
asinf - 1
asin 1 1
asinl 1 1
asinf128 1 1
asinhf - 2
asinh 1 2
asinhl 3 3
asinhf128 4 4
atanf - 1
atan 1 1
atanl 1 1
atanf128 1 1
atan2f - 2
atan2 1 -
atan2l 1 1
atan2f128 2 2
atanhf - 2
atanh 1 2
atanhl 3 3
atanhf128 4 4
cabsf - -
cabs 1 1
cabsl 1 1
cabsf128 1 1
cacosf 2 + i 2 2 + i 2
cacos 1 + i 2 1 + i 2
cacosl 1 + i 2 1 + i 2
cacosf128 2 + i 2 2 + i 2
cacoshf 2 + i 2 2 + i 2
cacosh 2 + i 1 2 + i 1
cacoshl 2 + i 1 2 + i 1
cacoshf128 2 + i 2 2 + i 2
cargf - 1
carg 1 -
cargl 1 1
cargf128 2 2
casinf 1 + i 2 1 + i 2
casin 1 + i 2 1 + i 2
casinl 1 + i 2 1 + i 2
casinf128 2 + i 2 2 + i 2
casinhf 2 + i 1 2 + i 1
casinh 2 + i 1 2 + i 1
casinhl 2 + i 1 2 + i 1
casinhf128 2 + i 2 2 + i 2
catanf 0 + i 1 1 + i 1
catan 1 + i 1 1 + i 1
catanl 1 + i 1 1 + i 1
catanf128 1 + i 1 1 + i 1
catanhf 1 + i 0 1 + i 1
catanh 1 + i 1 1 + i 1
catanhl 1 + i 1 1 + i 1
catanhf128 1 + i 1 1 + i 1
cbrtf 1 1
cbrt 1 4
cbrtl 3 1
cbrtf128 1 1
ccosf 1 + i 1 1 + i 1
ccos 1 + i 1 1 + i 1
ccosl 1 + i 1 1 + i 1
ccosf128 1 + i 1 1 + i 1
ccoshf 1 + i 1 1 + i 1
ccosh 1 + i 1 1 + i 1
ccoshl 1 + i 1 1 + i 1
ccoshf128 1 + i 1 1 + i 1
cexpf 1 + i 2 1 + i 2
cexp 2 + i 1 2 + i 1
cexpl 1 + i 1 1 + i 1
cexpf128 1 + i 1 1 + i 1
clogf 3 + i 0 3 + i 1
clog 2 + i 1 3 + i 1
clogl 3 + i 1 3 + i 1
clogf128 2 + i 1 2 + i 1
clog10f 4 + i 1 4 + i 2
clog10 3 + i 2 3 + i 2
clog10l 4 + i 2 4 + i 2
clog10f128 2 + i 2 2 + i 2
cosf 1 1
cos 1 1
cosl 1 1
cosf128 2 2
coshf 2 2
cosh 1 2
coshl 3 3
coshf128 2 2
cpowf 5 + i 2 5 + i 2
cpow 2 + i 0 2 + i 0
cpowl 3 + i 4 3 + i 4
cpowf128 4 + i 1 4 + i 1
csinf 1 + i 1 1 + i 0
csin 1 + i 0 1 + i 0
csinl 1 + i 0 1 + i 0
csinf128 1 + i 1 1 + i 1
csinhf 1 + i 1 1 + i 1
csinh 0 + i 1 0 + i 1
csinhl 1 + i 1 1 + i 1
csinhf128 1 + i 1 1 + i 1
csqrtf 2 + i 2 2 + i 2
csqrt 2 + i 2 2 + i 2
csqrtl 2 + i 2 2 + i 2
csqrtf128 2 + i 2 2 + i 2
ctanf 1 + i 2 1 + i 2
ctan 1 + i 2 1 + i 2
ctanl 2 + i 1 2 + i 1
ctanf128 3 + i 3 3 + i 3
ctanhf 2 + i 2 2 + i 2
ctanh 2 + i 2 2 + i 2
ctanhl 1 + i 2 1 + i 2
ctanhf128 3 + i 3 3 + i 3
div_ldoublef - -
div_ldouble - -
div_ldoublel - -
div_ldoublef128 - -
erff 1 1
erf 1 1
erfl 1 1
erff128 1 1
erfcf 3 3
erfc 5 5
erfcl 5 5
erfcf128 4 4
expf 1 1
exp 1 1
expl 1 1
expf128 1 1
exp10f - 1
exp10 1 2
exp10l 1 1
exp10f128 2 2
exp2f - 1
exp2 1 1
exp2l 1 1
exp2f128 1 1
expm1f - 1
expm1 1 1
expm1l 3 3
expm1f128 2 2
fmaf - -
fma - -
fmal - -
fmaf128 - -
fma_ldoublef - -
fma_ldouble - -
fma_ldoublel - -
fma_ldoublef128 - -
fmodf - -
fmod - -
fmodl - -
fmodf128 - -
gammaf 5 7
gamma 4 4
gammal 4 4
gammaf128 - -
hypotf - -
hypot 1 1
hypotl 1 1
hypotf128 1 1
j0f 9 9
j0 5 3
j0l 8 8
j0f128 2 2
j1f 9 9
j1 4 4
j1l 9 9
j1f128 4 4
jnf 4 4
jn 4 4
jnl 4 4
jnf128 7 7
lgammaf 5 7
lgamma 4 4
lgammal 4 4
lgammaf128 5 5
logf - 1
log 1 1
logl 1 1
logf128 1 1
log10f - 2
log10 1 2
log10l 1 1
log10f128 2 2
log1pf - 1
log1p 1 1
log1pl 2 2
log1pf128 3 3
log2f 1 1
log2 1 2
log2l 1 1
log2f128 3 3
mul_ldoublef - -
mul_ldouble - -
mul_ldoublel - -
mul_ldoublef128 - -
powf - 1
pow 1 1
powl 1 1
powf128 2 2
pow10f - -
pow10 - -
pow10l - -
pow10f128 - -
sinf 1 1
sin 1 1
sinl 2 2
sinf128 2 2
sincosf 1 -
sincos 1 1
sincosl 1 1
sincosf128 1 1
sinhf 2 2
sinh 2 2
sinhl 3 3
sinhf128 2 2
sqrtf - -
sqrt - -
sqrtl - -
sqrtf128 - -
sqrt_ldoublef - -
sqrt_ldouble - -
sqrt_ldoublel - -
sqrt_ldoublef128- -
sub_ldoublef - -
sub_ldouble - -
sub_ldoublel - -
sub_ldoublef128 - -
tanf 1 1
tan - -
tanl 2 2
tanf128 1 1
tanhf 2 2
tanh 2 2
tanhl 3 3
tanhf128 2 2
tgammaf 8 8
tgamma 9 9
tgammal 5 5
tgammaf128 4 4
y0f 9 9
y0 3 3
y0l 2 2
y0f128 3 3
y1f 9 9
y1 3 6
y1l 3 3
y1f128 5 5
ynf 3 3
yn 3 3
ynl 4 4
ynf128 5 5
2.8. 伪随机数
Pseudo-Random Numbers
本节描述了生成一系列伪随机数的 GNU 工具。生成的数字并不是真正随机的;通常,它们形成一个周期性重复的序列,周期如此之大,以至于您可以出于普通目的而忽略它。随机数生成器通过记住一个种子值来工作,它用于计算下一个随机数并计算一个新的种子。
尽管在程序的一次运行中生成的数字看起来不可预测,但从一次运行到下一次运行的数字序列完全相同。这是因为初始种子总是相同的。这在调试程序时很方便,但如果您希望程序的行为不可预测,则无济于事。如果每次程序运行时都需要不同的伪随机序列,则每次都必须指定不同的种子。对于一般目的,基于当前时间的种子效果很好。有关密码学中的随机数,请参阅生成不可预测的字节。
通过为随机数生成器指定相同的初始种子值,您可以在特定机器类型上获得可重复的数字序列。特定种子值没有标准含义;相同的种子,用于不同的 C 库或不同的 CPU 类型,会给你不同的随机数。
GNU C 库支持标准 ISO C 随机数函数以及从 BSD 和 SVID 派生的另外两个集合。 BSD 和 ISO C 函数提供了相同但有些有限的功能。如果只需要少量随机位,我们建议您使用 ISO C 接口,rand 和 srand。 SVID 函数提供了更灵活的接口,允许更好的随机数生成器算法,每次调用提供更多随机位(最多 48 个),并且可以提供随机浮点数。这些函数是 XPG 标准所要求的,因此将出现在所有现代 Unix 系统中。
2.8.1. ISO C 随机数函数
ISO C Random Number Functions
本节介绍作为 ISO C 标准一部分的随机数函数。
要使用这些工具,您应该在程序中包含头文件 stdlib.h。
宏:int RAND_MAX
该宏的值是一个整数常量,表示 rand 函数可以返回的最大值。在 GNU C 库中,它是 2147483647,它是 32 位可表示的最大有符号整数。在其他库中,可能低至 32767。
函数:int rand (void)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | See POSIX Safety Concepts.
rand 函数返回序列中的下一个伪随机数。取值范围为 0 到 RAND_MAX。
函数:void srand (unsigned int seed)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | See POSIX Safety Concepts.
此函数将种子建立为一系列新的伪随机数的种子。如果您在使用 srand 建立种子之前调用 rand,它将使用值 1 作为默认种子。
要在每次运行程序时生成不同的伪随机序列,请执行 srand (time (0))。
POSIX.1 扩展了 C 标准函数以支持多线程程序中的可重现随机数。但是,该扩展程序设计得很糟糕,不适合严肃的工作。
函数:int rand_r (unsigned int *seed)
Preliminary: | MT-Safe | AS-Safe | AC-Safe | See POSIX Safety Concepts.
这个函数返回一个 0 到 RAND_MAX 范围内的随机数,就像 rand 一样。但是,它的所有状态都存储在种子参数中。这意味着 RNG 的状态只能包含与 unsigned int 类型一样多的位。这对于提供好的 RNG 来说太少了。
如果您的程序需要可重入 RNG,我们建议您使用 SVID 随机数生成器的可重入 GNU 扩展。只有当 GNU 扩展不可用时,才应使用 POSIX.1 接口。
2.8.2. BSD 随机数函数
BSD Random Number Functions
本节描述了一组从 BSD 派生的随机数生成函数。将这些函数与 GNU C 库一起使用没有任何好处;我们支持它们仅是为了与 BSD 兼容。
这些函数的原型在 stdlib.h 中。
函数:long int random(void)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | See POSIX Safety Concepts.
此函数返回序列中的下一个伪随机数。返回值的范围是 0 到 2147483647。
注意:这个函数暂时定义为返回一个 int32_t 值,以指示返回值始终包含 32 位,即使 long int 更宽。标准要求不同。不过,用户必须始终注意 32 位限制。
函数:void srandom (unsigned int seed)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | See POSIX Safety Concepts.
srandom 函数根据整数种子设置随机数生成器的状态。如果您提供种子值 1,这将导致 random 重现默认的随机数集。
要在每次程序运行时产生一组不同的伪随机数,请执行 srandom (time (0))。
函数:char * initstate (unsigned int seed, char *state, size_t size)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | See POSIX Safety Concepts.
initstate 函数用于初始化随机数生成器的状态。参数 state 是一个 size 字节数组,用于保存状态信息。它是基于种子初始化的。大小必须在 8 到 256 字节之间,并且应该是 2 的幂。状态数组越大越好。
返回值是状态信息数组的前一个值。您可以稍后将此值用作 setstate 的参数来恢复该状态。
函数:char * setstate (char *state)
Preliminary: | MT-Safe | AS-Unsafe lock | AC-Unsafe lock | See POSIX Safety Concepts.
setstate 函数恢复随机数状态信息状态。该参数必须是先前调用 initstate 或 setstate 的结果。
返回值是状态信息数组的前一个值。您可以稍后将此值用作 setstate 的参数来恢复该状态。
如果函数失败,则返回值为 NULL。
到目前为止,本节中描述的四个函数都在一个由所有线程共享的状态下工作。用户不能直接访问状态,只能通过这些函数进行修改。这使得很难处理每个线程都应该有自己的伪随机数生成器的情况。
GNU C 库包含四个附加函数,它们包含作为显式参数的状态,因此可以处理线程本地 PRNG。除此之外没有区别。事实上,已经讨论过的四个功能是使用以下接口在内部实现的。
stdlib.h 标头包含以下类型的定义:
数据类型:struct random_data
struct random_data 类型的对象包含表示 PRNG 状态所需的信息。尽管存在类型的完整定义,但应将类型视为不透明的。
修改状态的函数完全遵循已经描述的函数。
函数:int random_r (struct random_data *restrict buf, int32_t *restrict result)
Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
random_r 函数的行为与 random 函数完全相同,只是它使用和修改第一个参数指向的对象中的状态,而不是全局状态。
函数:int srandom_r (unsigned int seed, struct random_data *buf)
Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
srandom_r 函数的行为与 srandom 函数完全相同,只是它使用和修改第二个参数指向的对象中的状态,而不是全局状态。
函数:int initstate_r (unsigned int seed, char *restrict statebuf, size_t statelen, struct random_data *restrict buf)
Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
initstate_r 函数的行为与 initstate 函数完全相同,只是它使用和修改第四个参数指向的对象中的状态,而不是全局状态。
函数:int setstate_r (char *restrict statebuf, struct random_data *restrict buf)
Preliminary: | MT-Safe race:buf | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
setstate_r 函数的行为与 setstate 函数完全相同,只是它使用和修改第一个参数指向的对象中的状态,而不是全局状态。
2.8.3. SVID 随机数函数
SVID Random Number Function
SVID 系统上的 C 库包含另一种随机数生成器函数。它们使用 48 位数据的状态。用户可以在一组以不同形式返回随机位的函数中进行选择。
一般有两种功能。第一个使用随机数生成器的状态,该状态由多个函数和进程的所有线程共享。第二个要求用户处理状态。
所有函数的共同点是它们使用相同的同余公式和相同的常数。公式是
Y = (a * X + c) mod m
其中 X 是生成器开始时的状态,Y 是结束时的状态。 a 和 c 是确定生成器工作方式的常数。默认情况下,它们是
a = 0x5DEECE66D = 25214903917
c = 0xb = 11
但它们也可以由用户更改。 m 当然是 2^48,因为状态由 48 位数组组成。
这些函数的原型在 stdlib.h 中。
函数:double drand48 (void)
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
此函数返回 0.0 到 1.0(不包括)范围内的双精度值。随机位由 C 库中随机数生成器的全局状态决定。
由于根据 IEEE 754 的 double 类型具有 52 位尾数,这意味着随机数生成器未初始化 4 位。这些(当然)被选为最低有效位,并且它们被初始化为 0。
函数:double erand48 (unsigned short int xsubi[3])
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
此函数返回 0.0 到 1.0(不包括)范围内的双精度值,类似于 drand48。参数是一个描述随机数生成器状态的数组。
该函数可以随后调用,因为它更新数组以保证随机数。阵列应在首次使用前进行初始化以获得可重现的结果。
函数:long int lrand48 (void)
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
lrand48 函数返回 0 到 2^31(不包括)范围内的整数值。即使 long int 类型的大小可能超过 32 位,也不会返回更大的数字。随机位由 C 库中随机数生成器的全局状态决定。
函数:long int nrand48 (unsigned short int xsubi[3])
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
此函数与 lrand48 函数相似,它返回 0 到 2^31(不包括)范围内的数字,但用于生成随机位的随机数生成器的状态由作为参数提供的数组确定功能。
数组中的数字随后会更新,以便对该函数的后续调用产生不同的结果(正如随机数生成器所期望的那样)。该数组应该在第一次调用之前初始化以获得可重现的结果。
函数:long int mrand48 (void)
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
mrand48 功能类似于 lrand48。唯一的区别是返回的数字在 -2^31 到 2^31 的范围内(不包括)。
函数:long int jrand48 (unsigned short int xsubi[3])
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
jrand48 功能类似于 nrand48。唯一的区别是返回的数字在 -2^31 到 2^31 的范围内(不包括)。对于 xsubi 参数,同样的要求是必要的。
随机数生成器的内部状态可以通过多种方式初始化。这些方法在所提供信息的完整性方面有所不同。
函数:void srand48 (long int seedval)
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
srand48 函数将随机数生成器内部状态的最高有效 32 位设置为 seedval 参数的最低有效 32 位。低 16 位初始化为值 0x330E。即使 long int 类型包含超过 32 位,也只使用低 32 位。
由于这个限制,这个函数的状态初始化不是很有用。但是它可以很容易地使用像 srand48 (time (0)) 这样的构造。
此函数的副作用是,在同余公式中使用的内部状态的值 a 和 c 被重置为上面给出的默认值。一旦用户调用了 lcong48 函数(见下文),这一点就很重要。
函数:unsigned short int * seed48 (unsigned short int seed16v[3])
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
seed48 函数根据参数 seed16v 的内容初始化内部随机数生成器的所有 48 位状态。这里seed16v的第一个元素的低16位初始化内部状态的最低16位,seed16v[1]的低16位初始化状态的中阶16位和seed16v[2的低16位] 初始化状态的最高有效 16 位。
与 srand48 不同,此函数允许用户初始化所有 48 位状态。
seed48 返回的值是一个指向包含更改前内部状态值的数组的指针。这对于在某个状态下重新启动随机数生成器可能很有用。否则,可以简单地忽略该值。
至于 srand48,来自同余公式的值 a 和 c 被重置为默认值。
还有一个初始化随机数生成器的函数,它允许您通过更改同余公式中的参数来指定更多信息。
函数:void lcong48 (unsigned short int param[7])
Preliminary: | MT-Unsafe race:drand48 | AS-Unsafe | AC-Unsafe corrupt | See POSIX Safety Concepts.
lcong48 函数允许用户更改随机数生成器的完整状态。与 srand48 和 seed48 不同,此函数还会更改同余公式中的常数。
从数组 param 的七个元素中,条目 param[0] 到 param[2] 的最低有效 16 位确定初始状态,param[3] 到 param[5] 的最低有效 16 位确定 48 位常量a 和 param[6] 确定 16 位值 c。
上述所有函数的共同点是它们使用同余公式的全局参数。在多线程程序中,有时在不同线程中使用不同的参数可能很有用。出于这个原因,上述所有函数都有一个对应的函数,它在用户提供的缓冲区中而不是全局状态中对随机数生成器的描述起作用。
请注意,如果所有线程都使用带有指向包含状态的数组的指针的函数,则多个线程使用全局状态是没有问题的。随机数是按照相同的循环计算的,但如果数组中的状态不同,所有线程都将获得一个单独的随机数生成器。
用户提供的缓冲区必须是 struct drand48_data 类型。这种类型应该被认为是不透明的,不能直接操作。
函数:int drand48_r (struct drand48_data *buffer, double *result)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
该函数与 drand48 函数等价,不同之处在于它不修改全局随机数生成器参数,而是修改通过指针缓冲区提供的缓冲区中的参数。在 result 指向的变量中返回随机数。
函数的返回值表示调用是否成功。如果该值小于 0,则发生错误并设置 errno 以指示问题。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int erand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, double *result)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
erand48_r 函数的工作方式与 erand48 类似,但另外它需要一个参数缓冲区来描述随机数生成器。随机数生成器的状态取自 xsubi 数组,同余公式的参数来自全局随机数生成器数据。在 result 指向的变量中返回随机数。
如果调用成功,则返回值为非负数。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int lrand48_r (struct drand48_data *buffer, long int *result)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
这个函数与 lrand48 类似,但另外它需要一个指向描述随机数生成器状态的缓冲区的指针,就像 drand48 一样。
如果函数的返回值为非负,则 result 指向的变量包含结果。否则发生错误。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int nrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, long int *result)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
nrand48_r 函数的工作方式与 nrand48 类似,因为它会生成 0 到 2^31 范围内的随机数。但不是使用同余公式的全局参数,而是使用来自缓冲区指向的缓冲区的信息。状态由 xsubi 中的值描述。
如果返回值非负,则 result 指向的变量包含结果。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int mrand48_r (struct drand48_data *buffer, long int *result)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
此函数类似于 mrand48,但与其他可重入函数一样,它使用由 buffer 指向的缓冲区中的值描述的随机数生成器。
如果返回值非负,则 result 指向的变量包含结果。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int jrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, long int *result)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
jrand48_r 函数与 jrand48 类似。与该函数族的其他可重入函数一样,它使用来自 buffer 指向的缓冲区的同余公式参数。
如果返回值非负,则 result 指向的变量包含结果。
此函数是 GNU 扩展,不应在可移植程序中使用。
在使用上述任何函数之前,应该初始化 struct drand48_data 类型的缓冲区。最简单的方法是用空字节填充整个缓冲区,例如经过
memset (buffer, '\0', sizeof (struct drand48_data));
现在使用该系列的任何可重入函数将自动将随机数生成器初始化为状态的默认值和同余公式的参数。
另一种可能性是使用任何显式初始化缓冲区的函数。虽然通过查看函数的参数来初始化缓冲区可能很明显,但强烈建议使用这些函数,因为结果可能并不总是您所期望的。
函数:int srand48_r (long int seedval, struct drand48_data *buffer)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
由缓冲区中的信息表示的随机数生成器的描述与函数 srand48 所做的类似初始化。状态从参数 seedval 初始化,同余公式的参数初始化为其默认值。
如果返回值为非负数,则函数调用成功。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int seed48_r (unsigned short int seed16v[3], struct drand48_data *buffer)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
此函数类似于 srand48_r,但与 seed48 一样,它从参数 seed16v 初始化所有 48 位状态。
如果返回值为非负数,则函数调用成功。它不像 seed48 函数那样返回指向随机数生成器先前状态的指针。如果用户想要保留状态以供以后重新运行,他/她可以复制 buffer 指向的整个缓冲区。
此函数是 GNU 扩展,不应在可移植程序中使用。
函数:int lcong48_r (unsigned short int param[7], struct drand48_data *buffer)
Preliminary: | MT-Safe race:buffer | AS-Safe | AC-Unsafe corrupt | See POSIX Safety Concepts.
此函数使用参数中的数据初始化缓冲区中描述的随机数生成器的所有方面。尤其如此,该函数不仅仅复制 param 和 buffer 的内容。需要做更多的工作,因此使用此函数而不是直接初始化随机数生成器很重要。
如果返回值为非负数,则函数调用成功。
此函数是 GNU 扩展,不应在可移植程序中使用。
2.9. 首选快码还是小码?
Is Fast Code or Small Code preferred?
如果应用程序使用许多浮点函数,则函数调用自身的成本通常是不可忽略的。现代处理器通常可以非常快速地自行执行操作,但函数调用会破坏指令流水线。
出于这个原因,GNU C 库为许多常用的数学函数提供了优化。当使用 GNU CC 并且用户激活优化器时,定义了几个新的内联函数和宏。这些新函数和宏与库函数具有相同的名称,因此被用来代替后者。对于内联函数,编译器将决定使用它们是否合理,而这个决定通常是正确的。
这意味着可能不需要调用库函数,并且可以显着提高生成代码的速度。缺点是代码大小会增加,而且增加并不总是可以忽略不计。
有两种内联函数:与库函数给出相同结果的函数和其他可能不设置 errno 并且与库函数相比可能具有降低的精度和/或参数范围的函数。仅当标志 -ffast-math 被赋予 GNU CC 时,后面的内联函数才可用。
并非所有硬件都实现了整个 IEEE 754 标准,即使它实现了,使用它的某些功能也可能会导致严重的性能损失。例如,在某些处理器上启用陷阱会强制 FPU 以非流水线方式运行,这会使计算时间增加一倍以上。