Suporte matemático e de ponto flutuante

A Universal C Runtime Library (UCRT) fornece muitas funções de biblioteca matemática integrais e de ponto flutuante, incluindo todas as funções exigidas pela ISO C99. As funções de ponto flutuante são implementadas para equilibrar o desempenho com exatidão. Uma vez que produzir o resultado arredondado corretamente pode ter um custo proibitivo, essas funções foram criadas para produzir de forma eficiente um resultado próximo ao resultado arredondado corretamente. Na maioria dos casos, o resultado produzido está dentro de +/-1 ULP (unidade de menor precisão) do resultado arredondado corretamente, embora possa haver casos em que haja maior imprecisão.

Para ISO C Standard 11 (C11) e posterior, o cabeçalho <tgmath.h>, além de incluir <math.h> e <complex.h>, fornece macros que invocam uma função matemática correspondente com base nos tipos de parâmetros . Confira Matemática do tipo genérico para obter detalhes.

Muitas das funções da biblioteca de matemática de ponto flutuante têm implementações diferentes para diferentes arquiteturas de CPU. Por exemplo, o CRT x86 de 32 bits pode ter uma implementação diferente do CRT x64 de 64 bits. Além disso, algumas das funções podem ter várias implementações para uma determinada arquitetura de CPU. A implementação mais eficiente é selecionada dinamicamente em tempo de execução dependendo dos conjuntos de instruções com suporte da CPU. Por exemplo, no CRT x86 de 32 bits, algumas funções têm uma implementação x87 e uma implementação SSE2. Quando executado em uma CPU com suporte para SSE2, é usada a implementação SSE2 mais rápida. Quando executado em uma CPU sem suporte para SSE2, é usada a implementação x87 mais lenta. Uma vez que diferentes implementações das funções da biblioteca de matemática podem usar diferentes instruções de CPU e diferentes algoritmos para produzir seus resultados, as funções podem produzir resultados diferentes entre as CPUs. Na maioria dos casos, os resultados estão dentro de +/-1 ULP do resultado arredondado corretamente, mas os resultados reais podem variar entre CPUs.

Versões de 16 bits anteriores do Microsoft C/C++ e do Microsoft Visual C++ davam suporte ao tipo long double como um tipo de dados de ponto flutuante com precisão de 80 bits. Em versões posteriores do Visual C++, o tipo de dados long double é um tipo de dados de ponto flutuante com precisão de 64 bits idêntico ao tipo double. O compilador trata long double e double como tipos distintos, mas as funções long double são idênticas às suas double correspondentes. O CRT fornece versões de long double das funções matemáticas para compatibilidade com código-fonte ISO C99, mas observe que a representação binária pode ser diferente de outros compiladores.

Rotinas matemáticas de ponto flutuante compatíveis

Rotina Uso
abs, labs, llabs, _abs64 Calcula o valor absoluto de um tipo inteiro
acos, acosf, acosl Calcula o arco cosseno
acosh, acoshf, acoshl Calcula o arco cosseno hiperbólico
asin, asinf, asinl Calcula o arco seno
asinh, asinhf, asinhl Calcula o arco seno hiperbólico
atan, atanf, atanl, atan2, atan2f, atan2l Calcula o arco tangente
atanh, atanhf, atanhl Calcula o arco tangente hiperbólico
_atodbl, _atodbl_l Converte uma cadeia de caracteres específica da localidade em um double
atof, _atof_l Converte uma cadeia de caracteres em um double
_atoflt, _atoflt_l, _atoldbl, _atoldbl_l Converte uma cadeia de caracteres específica da localidade em um float ou long double
cbrt, cbrtf, cbrtl Calcula a raiz cúbica
ceil, ceilf, ceill Calcula o limite
_chgsign, _chgsignf, _chgsignl Calcula o inverso de aditivo
_clear87, _clearfp Obtém e limpa o registro de status de ponto flutuante
_control87, _controlfp, __control87_2 Obtém e define a palavra de controle de ponto flutuante
_controlfp_s Versão segura de _controlfp
copysign, copysignf, copysignl, _copysign, _copysignf, _copysignl Retorna um valor que tem a magnitude de um argumento e o sinal de outro
cos, cosf, cosl Calcula o seno
cosh, coshf, coshl Calcula o seno hiperbólico
div, ldiv, lldiv Calcula o quociente e o resto de dois valores inteiros
_ecvt, ecvt Converte um double em uma cadeia de caracteres
_ecvt_s Versão segura de _ecvt
erf, erff, erfl Calcula a função de erro
erfc, erfcf, erfcl Calcula a função de erro complementar
exp, expf, expl Calcula o ex exponencial
exp2, exp2f, exp2l Calcula o 2x exponencial
expm1, expm1f, expm1l Calcula o ex-1
fabs, fabsf, fabsl Calcula o valor absoluto de um tipo de ponto flutuante
_fcvt, fcvt Converte um número de ponto flutuante em uma cadeia de caracteres
_fcvt_s Versão segura de _fcvt
fdim, fdimf, fdiml Determina a diferença positiva entre dois valores
feclearexcept Limpa as exceções de ponto flutuante especificadas
fegetenv Armazena o ambiente atual de ponto flutuante
fegetexceptflag Gera o status de exceção de ponto flutuante especificado
fegetround Obtém o modo de arredondamento de ponto flutuante
feholdexcept Define o modo de exceção de ponto flutuante contínuo
feraiseexcept Aciona as exceções de ponto flutuante especificadas
fesetenv Define o ambiente atual de ponto flutuante
fesetexceptflag Define os sinalizadores do status de ponto flutuante especificados
fesetround Define o modo de arredondamento de ponto flutuante especificado
fetestexcept Determina quais sinalizadores do status de exceção de ponto flutuante são definidos
feupdateenv Restaura um ambiente de ponto flutuante, em seguida, aciona exceções anteriores
floor, floorf, floorl Calcula a base
fma, fmaf, fmal Calcula uma adição múltipla mesclada
fmax, fmaxf, fmaxl Calcula o máximo de argumentos
fmin, fminf, fminl Calcula o mínimo dos argumentos
fmod, fmodf, fmodl Calcula o restante do ponto flutuante
_fpclass, _fpclassf Retorna a classificação de um valor do ponto flutuante
fpclassify Retorna a classificação de um valor do ponto flutuante
_fpieee_flt Define um manipulador para exceções de ponto flutuante
_fpreset Redefine o ambiente de ponto flutuante
frexp, frexpf, frexpl Obtém a mantissa e o expoente de um número de ponto flutuante
_gcvt, gcvt Converte um número de ponto flutuante em uma cadeia de caracteres
_gcvt_s Versão segura de _gcvt
_get_FMA3_enable, _set_FMA3_enable Obtém ou define um sinalizador para o uso de instruções FMA3 em x64
hypot, hypotf, hypotl, _hypot, _hypotf, _hypotl Calcula a hipotenusa
ilogb, ilogbf, ilogbl Calcula o expoente de base 2 do inteiro
imaxabs Calcula o valor absoluto de um tipo inteiro
imaxdiv Calcula o quociente e o resto de dois valores inteiros
isfinite, _finite, _finitef Determina se um valor é finito
isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered Compara a ordem dos dois valores de ponto flutuante
isinf Determina se um valor de ponto flutuante é infinito
isnan, _isnan, _isnanf Testa um valor de ponto flutuante para NaN
isnormal Testa se um valor de ponto flutuante é finito e não subnormal
_j0, _j1, _jn Calcula a função Bessel
ldexp, ldexpf, ldexpl Calcula x*2n
lgamma, lgammaf, lgammal Calcula o logaritmo natural do valor absoluto da função gama
llrint, llrintf, llrintl Arredonda um valor de ponto flutuante para o valor long long mais próximo
llround, llroundf, llroundl Arredonda um valor de ponto flutuante para o valor long long mais próximo
log, logf, logl, log10, log10f, log10l Calcular o logaritmo natural ou de base 10
log1p, log1pf, log1pl Calcula o logaritmo natural de 1+x
log2, log2f, log2l Calcula o logaritmo de base 2
logb, logbf, logbl, _logb, _logbf Retorna o expoente de um valor de ponto flutuante
lrint, lrintf, lrintl Arredonda um valor de ponto flutuante para o valor long mais próximo
_lrotl, _lrotr Gira um valor inteiro para a esquerda ou direita
lround, lroundf, lroundl Arredonda um valor de ponto flutuante para o valor long mais próximo
_matherr O manipulador de erro de matemática padrão
__max Macro que retorna o maior de dois valores
__min Macro que retorna o menor de dois valores
modf, modff, modfl Divide um valor de ponto flutuante em partes inteiras e fracionárias
nan, nanf, nanl Retorna um valor NaN silencioso
nearbyint, nearbyintf, nearbyintl Retorna o valor arredondado
nextafter, nextafterf, nextafterl, _nextafter, _nextafterf Retorna o próximo valor de ponto flutuante representável
nexttoward, nexttowardf, nexttowardl Retorna o próximo valor de ponto flutuante representável
pow, powf, powl Devolve o valor de xy
remainder, remainderf, remainderl Calcula o restante do quociente de dois valores de ponto flutuante
remquo, remquof, remquol Calcula o resto de dois valores inteiros
rint, rintf, rintl Arredonda um valor de ponto flutuante
_rotl, _rotl64, _rotr, _rotr64 Gira bits em tipos de inteiros
round, roundf, roundl Arredonda um valor de ponto flutuante
_scalb, _scalbf Dimensiona o argumento por uma potência de 2
scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl Multiplica um número de ponto flutuante por uma potência integral de FLT_RADIX
_set_controlfp Define a palavra de controle de ponto flutuante
_set_SSE2_enable Habilita ou desabilita instruções SSE2
signbit Testa o bit de sinal de um valor de ponto flutuante
sin, sinf, sinl Calcula o seno
sinh, sinhf, sinhl Calcula o seno hiperbólico
sqrt, sqrtf, sqrtl Calcula a raiz quadrada
_status87, _statusfp, _statusfp2 Define a palavra de status de ponto flutuante
strtof, _strtof_l Converte uma cadeia de caracteres em um float
strtold, _strtold_l Converte uma cadeia de caracteres em um long double
tan, tanf, tanl Calcula a tangente
tanh, tanhf, tanhl Calcula a tangente hiperbólica
tgamma, tgammaf, tgammal Calcula a função gama
trunc, truncf, truncl Trunca a parte fracionária
_wtof, _wtof_l Converte uma cadeia de caracteres largos em um double
_y0, _y1, _yn Calcula a função Bessel

Confira também

Rotinas de runtime C universais por categoria
Primitivos de ponto flutuante