Suporte a expressões matemáticas complexas de C

A biblioteca Microsoft C Runtime (CRT) fornece funções complexas de biblioteca matemática, incluindo todas as exigidas pela ISO C99. O compilador não dá suporte direto a uma palavra-chave complex ou _Complex, portanto, a implementação da Microsoft usa tipos de estrutura para representar números complexos.

Essas funções 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 unidade de menor precisão (ULP) do resultado arredondado corretamente, embora possa haver casos em que haja maior imprecisão.

As rotinas de expressões matemáticas complexas dependem das funções da biblioteca de expressões matemáticas do ponto flutuante para sua implementação. Essas funções têm implementações diferentes para arquiteturas de CPU diferentes. 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.

Tipos usados em expressões matemáticas complexas

A implementação da Microsoft do cabeçalho complex.h define esses tipos como equivalentes para os tipos complexos nativos do padrão C99:

Tipo padrão Tipo da Microsoft
float complex ou float _Complex _Fcomplex
double complex ou double _Complex _Dcomplex
long double complex ou long double _Complex _Lcomplex

O cabeçalho math.h define um tipo separado, struct _complex, usado para a função _cabs. O tipo struct _complex não é usado pelas funções matemáticas complexas equivalentes cabs, cabsf, cabsl.

Constantes e macros complexas

I é definido como o tipo complexo _Fcomplex inicializado por { 0.0f, 1.0f }.

Funções trigonométricas

Função Descrição
cacos, cacosf, cacosl Calcular o arco cosseno complexo de um número complexo
casin, casinf, casinl Calcular o arco seno complexo de um número complexo
catan, catanf, catanl Calcular o arco tangente complexo de um número complexo
ccos, ccosf, ccosl Calcular o cosseno complexo de um número complexo
csin, csinf, csinl Calcular o seno complexo de um número complexo
ctan, ctanf, ctanl Calcular a tangente complexa de um número complexo

Funções hiperbólicas

Função Descrição
cacosh, cacoshf, cacoshl Calcular o arco cosseno hiperbólico complexo de um número complexo
casinh, casinhf, casinhl Calcular o arco seno hiperbólico complexo de um número complexo
catanh, catanhf, catanhl Calcular o arco tangente hiperbólico complexo de um número complexo
ccosh, ccoshf, ccoshl Calcular o cosseno hiperbólico complexo de um número complexo
csinh, csinhf, csinhl Calcular o seno hiperbólico complexo de um número complexo
ctanh, ctanhf, ctanhl Calcular a tangente hiperbólica complexa de um número complexo

Funções exponenciais e logarítmicas

Função Descrição
cexp, cexpf, cexpl Calcular o exponencial de base complexo e de um número complexo
clog, clogf, clogl Calcular o complexo logaritmo natural (de base e) de um número complexo
clog10, clog10f, clog10l Calcular o logaritmo de base 10 de um número complexo

Funções potência e valor absoluto

Função Descrição
cabs, cabsf, cabsl Calcular o valor absoluto complexo (também chamado de norma, módulo ou magnitude) de um número complexo
cpow, cpowf, cpowl Calcular a função de potência complexa
csqrt, csqrtf, csqrtl Calcular a raiz quadrada complexa de um número complexo

Funções de manipulação

Função Descrição
_Cbuild, _FCbuild, _LCbuild Elaborar um número complexo de partes reais e imaginárias
carg, cargf, cargl Calcular o argumento (também chamado de ângulo de fase) de um número complexo
cimag, cimagf, cimagl Calcular a parte imaginária de um número complexo
conj, conjf, conjl Calcular o conjugado complexo de um número complexo
cproj, cprojf, cprojl Calcular uma projeção de um número complexo na esfera de Reimann
creal, crealf, creall Calcular a parte real de um número complexo
norm, normf, norml Calcular a magnitude quadrada de um número complexo

Funções de operação

Uma vez que os números complexos não são um tipo nativo no compilador da Microsoft, os operadores aritméticos padrão não são definidos em tipos complexos. Para sua conveniência, essas funções da biblioteca de funções matemáticas complexas são fornecidas para habilitar a manipulação limitada de números complexos no código do usuário:

Função Descrição
_Cmulcc, _FCmulcc, _LCmulcc Multiplicar dois números complexos
_Cmulcr, _FCmulcr, _LCmulcr Multiplicar um número complexo e um número de ponto flutuante

Confira também

Matemática do tipo genérico
Rotinas de runtime C universais por categoria