Partilhar via


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 a correção. Como produzir o resultado arredondado corretamente pode ser proibitivamente caro, essas funções são projetadas para produzir eficientemente uma aproximação próxima 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 a norma ISO C 11 (C11) e posterior, o <tgmath.h> cabeçalho, além de incluir <math.h> e <complex.h>, fornece macros que invocam uma função matemática correspondente com base nos tipos dos parâmetros. Consulte matemática genérica de tipo para obter detalhes.

Muitas das funções da biblioteca matemática de ponto flutuante têm implementações diferentes para diferentes arquiteturas de CPU. Por exemplo, a CRT x86 de 32 bits pode ter uma implementação diferente da 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 suportados pela CPU. Por exemplo, no CRT x86 de 32 bits, algumas funções têm uma implementação x87 e uma implementação SSE2. Ao executar em uma CPU que suporta SSE2, a implementação SSE2 mais rápida é usada. Quando executado em uma CPU que não suporta SSE2, a implementação x87 mais lenta é usada. Como diferentes implementações das funções da biblioteca de matemática podem usar instruções de CPU diferentes e algoritmos diferentes para produzir seus resultados, as funções podem produzir resultados diferentes entre 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 mais recentes do UCRT podem melhorar a precisão e a precisão das funções da biblioteca matemática de ponto flutuante. Como o UCRT faz parte do sistema operacional Windows, você pode obter resultados diferentes para essas funções em diferentes versões do sistema operacional ou entre compilações de depuração e versão. Embora não seja recomendado, você pode vincular estaticamente ao UCRT para garantir resultados consistentes se precisar que essas funções produzam resultados idênticos em todos os lugares.

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

Rotinas matemáticas e de ponto flutuante suportadas

Rotina Utilização
abs, labs, llabs, _abs64 Calcula o valor absoluto de um tipo inteiro
acos, acosf, acosl Calcula o arco cosseno
acosh, acoshf, acoshl Calcula o cosseno de arco hiperbólico
asin, asinf, asinl Calcula o seno do arco
asinh, asinhf, asinhl Calcula o seno do arco hiperbólico
atan, atanf, atanl, atan2, atan2f, atan2l Calcula a tangente do arco
atanh, atanhf, atanhl Calcula a tangente do arco hiperbólico
_atodbl, _atodbl_l Converte uma cadeia de caracteres específica da localidade em uma double
atof, _atof_l Converte uma cadeia de caracteres em uma 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 do cubo
ceil, ceilf, ceill Calcula o teto
_chgsign, _chgsignf, _chgsignl Calcula o aditivo inverso
_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 do _controlfp
copysign, copysignf, copysignl, _copysign, _copysignf, _copysignl Devolve 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 restante de dois valores inteiros
_ecvt, ecvt Converte a double em uma cadeia de caracteres
_ecvt_s Versão segura do _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 exponencial ex
exp2, exp2f, exp2l Calcula o exponencial 2x
expm1, expm1f, expm1l Cálculos ex-1
fabs, fabsf, fabsl Calcula o valor absoluto de um tipo de vírgula flutuante
_fcvt, fcvt Converte um número de vírgula flutuante em uma cadeia de caracteres
_fcvt_s Versão segura do _fcvt
fdim, fdimf, fdiml Determina a diferença positiva entre dois valores
feclearexcept Limpa exceções de ponto flutuante especificadas
fegetenv Armazena o ambiente de ponto flutuante atual
fegetexceptflag Obtém 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 ininterrupto
feraiseexcept Levanta as exceções de ponto flutuante especificadas
fesetenv Define o ambiente de ponto flutuante atual
fesetexceptflag Define os sinalizadores de status de ponto flutuante especificados
fesetround Define o modo de arredondamento de ponto flutuante especificado
fetestexcept Determina quais sinalizadores de status de exceção de ponto flutuante são definidos
feupdateenv Restaura um ambiente de ponto flutuante e, em seguida, gera exceções anteriores
floor, floorf, floorl Calcula o piso
fma, fmaf, fmal Calcula uma multiplicação-adição fundida
fmax, fmaxf, fmaxl Calcula o máximo dos argumentos
fmin, fminf, fminl Calcula o mínimo dos argumentos
fmod, fmodf, fmodl Calcula o restante de vírgula flutuante
_fpclass, _fpclassf Devolve a classificação de um valor de vírgula flutuante
fpclassify Devolve a classificação de um valor de vírgula 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 expoente de um número de vírgula flutuante
_gcvt, gcvt Converte um número de vírgula flutuante em uma cadeia de caracteres
_gcvt_s Versão segura do _gcvt
_get_FMA3_enable, _set_FMA3_enable Obtém ou define um sinalizador para uso de instruções FMA3 em x64
hypot, hypotf, hypotl, _hypot, _hypotf, _hypotl Calcula a hipotenusa
ilogb, ilogbf, ilogbl Calcula o expoente inteiro base-2
imaxabs Calcula o valor absoluto de um tipo inteiro
imaxdiv Calcula o quociente e o restante de dois valores inteiros
isfinite, _finite, _finitef Determina se um valor é finito
isgreater, isgreaterequal, isless, islessequal, islessgreater, isunordered Comparar a ordem de dois valores de vírgula flutuante
isinf Determina se um valor de vírgula flutuante é infinito
isnan, _isnan, _isnanf Testa um valor de vírgula flutuante para NaN
isnormal Testa se um valor de vírgula flutuante é finito e não subnormal
_j0, _j1, _jn Calcula a função de 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 vírgula flutuante para o valor mais próximo long long
llround, llroundf, llroundl Arredonda um valor de vírgula flutuante para o valor mais próximo long long
log, logf, logl, log10, log10f, log10l Calcula o logaritmo natural ou 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 Devolve o expoente de um valor de vírgula flutuante
lrint, lrintf, lrintl Arredonda um valor de vírgula flutuante para o valor mais próximo long
_lrotl, _lrotr Gira um valor inteiro para a esquerda ou para a direita
lround, lroundf, lroundl Arredonda um valor de vírgula flutuante para o valor mais próximo long
_matherr O manipulador de erros matemáticos 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 vírgula flutuante em partes fracionárias e inteiras
nan, nanf, nanl Devolve um valor NaN silencioso
nearbyint, nearbyintf, nearbyintl Devolve o valor arredondado
nextafter, nextafterf, nextafterl, _nextafter, _nextafterf Devolve o próximo valor de ponto flutuante representável
nexttoward, nexttowardf, nexttowardl Devolve 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 vírgula flutuante
remquo, remquof, remquol Calcula o restante de dois valores inteiros
rint, rintf, rintl Arredonda um valor de vírgula flutuante
_rotl, _rotl64, _rotr, _rotr64 Gira bits em tipos inteiros
round, roundf, roundl Arredonda um valor de vírgula flutuante
_scalb, _scalbf Dimensiona o argumento por um poder de 2
scalbn, scalbnf, scalbnl, scalbln, scalblnf, scalblnl Multiplica um número de vírgula flutuante por uma potência integral de FLT_RADIX
_set_controlfp Define a palavra de controle de ponto flutuante
_set_SSE2_enable Ativa ou desativa as 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 Obtém a palavra de status de ponto flutuante
strtof, _strtof_l Converte uma cadeia de caracteres em uma float
strtold, _strtold_l Converte uma cadeia de caracteres em uma 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 larga em uma double
_y0, _y1, _yn Calcula a função de Bessel

Ver também

Rotinas de tempo de execução Universal C por categoria
Primitivos de ponto flutuante