A nova norma C (ISO/IEC 9899:2023, também conhecida como C23),
no Anexo H, são definidas diversas macros e tipos,
relativos à aritmética real e complexa,
sujeitos à norma ISO/IEC 60559 (aritmética de ponto flutuante).
De acordo com a subseção H.1, existem três
macros definidas pela implementação para testar a conformidade
com as definições do Anexo H.
__STDC_IEC_60559_TYPES__
__STDC_IEC_60559_BFP__
__STDC_IEC_60559_DFP__
Além disso, para “ativar” as macros e tipos associados,
o usuário deve definir a macro:
__STDC_WANT_IEC_60559_TYPES_EXT__
A redação da norma é clara em vários detalhes:
- Se
__STDC_IEC_60559_BFP__
for definido pelo compilador, isso implica que_FloatN
e_FloatN_t
outros_FloatN*
tipos são definidos. - Se
__STDC_IEC_60559_DFP__
for definido pelo compilador, isso implica que_DecimalN
e_DecimalN_t
outros_DecimalN*
tipos são definidos. - Em ambos os casos, a macro
__STDC_IEC_60559_TYPES__
está definida. - Se a macro
__STDC_IEC_60559_TYPES__
estiver definida, significa que pelo menos uma das macros__STDC_IEC_60559_BFP__
ou__STDC_IEC_60559_DFP__
(ou ambas) está definida.
Na subseção H.11, o tipo long_double_t
é adicionado a <math.h>
.
No entanto, não consigo deduzir em que condições se pode garantir a existência de long_double_t
uma determinada implementação.
PERGUNTA:
Se __STDC_IEC_60559_TYPES__
estiver definido, é suficiente ter certeza de que long_double_t
também está definido em <math.h>
?
Minha dúvida vem do seguinte caso particular que pode surgir:
__STDC_IEC_60559_TYPES__
e__STDC_IEC_60559_DFP__
estão definidos, mas__STDC_IEC_60559_BFP__
não estão definidos.
Neste caso, os tipos decimais são definidos.
No entanto, long_double_t
não é um tipo decimal.
SUBLEMA:
A macro __STDC_IEC_60559_BFP__
deve existir para garantir a existência de long_double_t
?
COMENTÁRIOS:
Como @John Bollinger explica em sua resposta,
a existência de *BFP__
e/ou *DFP__
macros
apenas garante que _FloatN
existam _DecimalN
para certos valores pequenosN
de .
(Eu estava ciente desse detalhe, mas minha explicação não foi a melhor.)