Sufixo 'i' para constantes literais complexas [RESOLVIDO]

1. Sufixo 'i' para constantes literais complexas [RESOLVIDO]

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 23/04/2021 - 22:17h

Olá, acabei de descobrir que o sufixo 'i' é non-portable, ou seja, não está na ANSI C, e só funciona comigo por eu usar gcc ou clang.

Isso me incomoda muito, é frustrante fazer um programa, compilar perfeitamente e executar sem problemas e quando tenta compilar em outro computador receber mensagens de error (até warning me incomoda um pouco) por isso procuro fazer tudo conforme a ISO C99 (até agora não vi necessidade de usar uma mais atual, até agora).

Pelo que entendi esse sufixo é extensão GNU e funciona assim:

1.0 + 1.0i = 1.0 + 1.0 * _Complex_I 


Como eu acho o sufixo bastante prático fica a dúvida, posso definir manualmente o sufixo?


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 26/04/2021 - 01:08h

Sufixos são uma extensão do GCC. Convenientes por brevidade, mas problemáticas se você pensa em algum dia levar seu código para outro lugar.

Em particular, o sufixo i se tornou problemático dentro do próprio GCC se você combinar código em C com código em C++, porque o padrão C++14 definiu o sufixo i para criar constantes to tipo std::complex<double>. A documentação do GCC recomenda que, nesses casos, você use o sufixo j (com que o pessoal de Engenharia Elétrica e Eletrônica já está bem acostumado) para não confundir com o sufixo do C++ padrão.

Eu prefiro evitar extensões do compilador sempre que possível. Em lugar delas, eu prefiro ficar naquilo que o padrão oferece, e o padrão do C oferece a macro I em <complex.h>, de modo que você pode expressar seus valores complexos como “x+y*I” (a multplicação é necessária, pois não se trata de um sufixo).


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Sufixo 'i' para constantes literais complexas [RESOLVIDO]

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 24/04/2021 - 11:31h


Uma informação a mais:

Each complex type has the same representation and alignment requirements as an array
type containing exactly two elements of the corresponding real type; the first element is
equal to the real part, and the second element to the imaginary part, of the complex
number.


Dessa forma <complex.h> pode implementar a macro _Complex_I de forma clara fazendo:

#ifdef __GNUC__
#define _Complex_I 1.0i
#else
#define _Complex_I ((double _Complex){0.0,1.0}) // ISO/IEC 9899:1999 6.2.5 13
#endif


Embora isso ainda não me diga como implementar o sufixo i.


4. Re: Sufixo 'i' para constantes literais complexas [RESOLVIDO]

Ismael Felipe Ferreira dos santos
IsmaelSantos

(usa Ubuntu)

Enviado em 28/04/2021 - 08:50h

Pois é paulo1205, a praticidade do sufixo é o fato de ele evitar a multiplicação me chamaram atenção mas não vou mais utilizá-lo, em nome da portabilidade.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts