Suporte matemático e de ponto flutuante
A biblioteca Universal C Runtime (UCRT) fornece muitas funções de biblioteca matemática integral 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 as 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 | Usar |
---|---|
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 |
Retorna o valor de x y |
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