浮点支持

Microsoft C 运行时库 (CRT) 提供了许多浮点数学库函数,包括 ISO C99 所需的所有函数。 这些函数的实现是为了平衡性能与正确性。 因为产生正确舍入的结果可能成本过高,这些函数旨在有效地生成接近正确舍入结果的近似结果。 在大多数情况下,虽然可能存在误差较大的情况,但生成的结果在正确舍入结果的 + /-1 ulp 范围内。

许多浮点数学库函数具有不同 CPU 体系结构的不同实现。 例如,相比 64 位 x64 CRT,32 位 x86 CRT 可能具有不同的实现。 此外,某些函数可能有适用于给定 CPU 体系结构的多个实现。 在运行时动态地选择最有效的实现,具体取决于受 CPU 支持的指令集。 例如,在 32 位 x86 CRT 中,一些函数同时具有 x87 实现和 SSE2 实现。 在支持 SSE2 的 CPU 上运行时,使用速度更快的 SSE2 实现。 在不支持 SSE2 的 CPU 上运行时,使用速度较慢的 x87 实现。 数学库函数的不同实现可能会使用不同的 CPU 指令和不同的算法来生成其结果,因此,这些函数可能会在各 CPU 中产生不同的结果。 在大多数情况下,结果在正确舍入结果的 +/-1 ulp 范围内,但实际结果在各 CPU 中可能会有所不同。

以前的 16 位版本 Microsoft C/C ++ 和 Microsoft Visual C++ 支持 long double 类型作为 80 位精度浮点数据类型。 在更高版本的 Visual C++ 中,long double 数据类型是与 double 类型相同的 64 位精度浮点数据类型。 编译器将 long doubledouble 归为不同类型,但 long double 函数等于其 double 对应项。 CRT 为 ISO C99 源代码兼容性提供了数学函数的 long double 版本,但请注意,二进制表示形式可能不同于其他编译器。

CRT 支持以下浮点函数:

abs、labs、llabs、_abs64

acos、acosf、acosl

acosh、acoshf、acoshl

asin、asinf、asinl

asinh、asinhf、asinhl

atan、atanf、atanl、atan2、atan2f、atan2l

atanh、atanhf、atanhl

_atodbl、_atodbl_l

atof、_atof_l

_atoflt、_atoflt_l、_atoldbl、_atoldbl_l

cbrt、cbrtf、cbrtl

ceil、ceilf、ceill

_chgsign、_chgsignf、_chgsignl

_clear87、_clearfp

compl

conj、conjf、conjl

_control87、__control87_2、_controlfp

_controlfp_s

copysign、copysignf、copysignl、_copysign、_copysignf、_copysignl

cos、cosf、cosl

cosh、coshf、coshl

div

_ecvt

ecvt

_ecvt_s

erf、erff、erfl、erfc、erfcf、erfcl

exp、expf、expl

exp2、exp2f、exp2l

expm1、expm1f、expm1l

fabs、fabsf

_fcvt

fcvt

_fcvt_s

fdim、fdimf、fdiml

feclearexcept

fegetenv

fegetexceptflag

fegetround

feholdexcept

feraiseexcept

ferror

fesetenv

fesetexceptflag

fesetround

fetestexcept

feupdateenv

_finite、_finitef

floor、floorf、floorl

fma、fmaf、fmal

fmax、fmaxf、fmaxl

fmin、fminf、fminl

fmod、fmodf

_fpclass、_fpclassf

fpclassify

_fpieee_flt

_fpreset

frexp

gcvt

_gcvt

_gcvt_s

hypot、hypotf、hypotl、_hypot、_hypotf、_hypotl

ilogb、ilogbf、ilogbl

imaxabs

imaxdiv

isnan、_isnan、_isnanf

_j0、_j1、_jn

ldexp

ldiv、lldiv

lgamma、lgammaf、lgammal

llrint、llrintf、llrintl

llround、llroundf、llroundl

log、logf、log10、log10f

log1p、log1pf、log1pl

log2、log2f、log2l

logb、logbf、logbl、_logb、_logbf

lrint、lrintf、lrintl

_lrotl、_lrotr

lround、lroundf、lroundl

_matherr

__max

__min

modf、modff

nan、nanf、nanl

nanf

nanl

nearbyint、nearbyintf、nearbyintl

nextafter、nextafterf、nextafterl、_nextafter、_nextafterf、nexttoward、nexttowardf、nexttowardl

norm、normf、norml

pow、powf、powl

remainder、remainderf、remainderl

remquo、remquof、remquol

rint、rintf、rintl

_rotl、_rotl64、_rotr、_rotr64

round、roundf、roundl

_scalb

scalbn、scalbnf、scalbnl、scalbln、scalblnf、scalblnl

_set_controlfp

_set_SSE2_enable

sin、sinf、sinl

sinh、sinhf、sinhl

sqrt、sqrtf、sqrtl

_status87、_statusfp、_statusfp2

strtof、_strtof_l

strtold、_strtold_l

tan、tanf、tanl

tanh、tanhf、tanhl

tgamma、tgammaf、tgammal

trunc、truncf、truncl

_wtof、_wtof_l

_y0、_y1、_yn

另请参阅

按类别分的运行时例程