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.)
DR: a base mínima para confiar no fornecimento de uma implementação em conformidade
long_double_t
é que ela defina macro__STDC_IEC_60559_TYPES__
como202311L
.No entanto, a unidade de tradução também deve definir
__STDC_WANT_IEC_60559_TYPES_EXT__
(para qualquer coisa) antes de incluir math.h pela primeira vez para que essa definição seja realmente exposta. (C23 H.8/1)Aparentemente não é tão claro.
Como questão preliminar, a especificação diz
Isto deve ser entendido para evitar que as implementações se conformem com qualquer coisa no anexo se não definirem
__STDC_IEC_60559_TYPES__
esse valor específico (mesmo que o definam com algum outro valor). Esta é uma medida intencional de compatibilidade futura.A especificação continua dizendo:
Observe bem que, de acordo com o anterior, nem essa disposição nem qualquer outra coisa no anexo se aplicam, a menos que
__STDC_IEC_60559_TYPES__
seja definido exatamente como202311L
. Caso contrário, todas as apostas serão canceladas no que diz respeito ao Anexo H (de C23). Por exemplo, uma implementação que definisse__STDC_IEC_60559_TYPES__
nada e não definisse um__STDC_IEC_60559_BFP__
ou outro__STDC_IEC_60559_DFP__
não deixaria de estar em conformidade por esse motivo.Não exatamente. A especificação não associa nenhum requisito
__STDC_IEC_60559_BFP__
apenas à definição de uma implementação. Além da restrição geral por definição de__STDC_IEC_60559_TYPES__
, discutida acima, a especificação condiciona explicitamente algumas das disposições específicas nesta área à definição da última macro.Quando todas essas condições são atendidas, uma implementação em conformidade fornece tipos
_Float32
e_Float64
, e esses são equivalentes afloat
edouble
, respectivamente. Além disso, nessas circunstâncias, selong double
corresponder a um dos formatos de troca binária ISO 60559 para alguma largura N maior que 64, então a implementação fornece o_FloatN
tipo correspondente como equivalente along double
. Outros_FloatN
tipos são permitidos, mas não obrigatórios, e o conjunto deles é definido pela implementação. (H.2.1/4)Uma implementação em conformidade que se vincule às disposições deste anexo fornece
_FloatN_t
em seu math.h para cada_FloatN
tipo que fornece.Novamente, as implementações não estão vinculadas a nada no anexo, a menos que sejam definidas
__STDC_IEC_60559_TYPES__
adequadamente. Nesse caso,__STDC_IEC_60559_DFP__
ser definido implica que_Decimal32
,_Decimal64
e_Decimal128
são fornecidos. Tipos adicionais_DecimalN
são explicitamente permitidos e que o conjunto de tais tipos adicionais é definido pela implementação.Quando as disposições do anexo se aplicarem, math.h fornecerá um
_DecimalN_t
correspondente a cada uma_DecimalN
que a implementação definir.Não, não existe tal exigência. A lógica é inversa. Conforme já discutido, nenhum dos itens do Anexo H se aplica, a menos que
__STDC_IEC_60559_TYPES__
seja definido adequadamente. Se for, então pelo menos uma das outras duas macros também deve ser definida, mas uma delas definida não é base para concluir nada sobre__STDC_IEC_60559_TYPES__
.Mais especificamente, isso se aplica apenas se
__STDC_IEC_60559_TYPES__
for definido exatamente como202311L
.A macro
__STDC_IEC_60559_TYPES__
definida com exatidão202311L
é suficiente para ter certeza de quelong_double_t
está disponível na implementação. O anexo não impõe quaisquer condições adicionais a este respeito. O programa precisa ser ativado, no entanto. C23 H.8/1:Você escreveu:
Verdadeiro.
Quem diz? C23 6.2.6.1/1:
Essa subcláusula não define a representação de nenhum tipo de FP.
Não há nenhum requisito de que
long double
sejalong_double_t
do tipo binário. Parece nem haver uma exigência de que esses dois tipos sejam equivalentes, embora eu esperasse que isso fosse uma questão de qualidade de implementação.Mas não há problema, mesmo que
long_double_t
seja do tipo binário.__STDC_IEC_60559_BFP__
não ser definido não implica que a implementação não forneça nenhum tipo binário de FP. Significa apenas que a implementação se recusa a prometer que está em conformidade com todas as disposições do Anexo H no que diz respeito aos tipos de FP binários.Não. H.11/6 especifica que
long_double_t
está disponível em math.h, sujeito à aceitação do programa conforme discutido acima, e que não está condicionado a nada além da mesma__STDC_IEC_60559_TYPES__
macro de teste de recurso à qual tudo no anexo está condicionado. Portanto, se uma implementação em conformidade for definida__STDC_IEC_60559_TYPES__
,202311L
então seu math.h será definidolong_double_t
para os programas que aceitarem.