新标准 C(ISO/IEC 9899:2023,又名 C23)
在附件 H 中定义了一些
与实数和复数算术相关的宏和类型,
并符合 ISO/IEC 60559 标准(浮点算术)。
根据 H.1 小节,存在三个
实现定义的宏来测试
与附件 H 定义的一致性。
__STDC_IEC_60559_TYPES__
__STDC_IEC_60559_BFP__
__STDC_IEC_60559_DFP__
此外,要“激活”关联的宏和类型,
用户必须定义宏:
__STDC_WANT_IEC_60559_TYPES_EXT__
该标准的措辞在几个细节上很明确:
- 如果
__STDC_IEC_60559_BFP__
是由编译器定义的,则意味着_FloatN
,_FloatN_t
和其他_FloatN*
类型也已定义。 - 如果
__STDC_IEC_60559_DFP__
是由编译器定义的,则意味着_DecimalN
,_DecimalN_t
和其他_DecimalN*
类型也已定义。 __STDC_IEC_60559_TYPES__
无论哪种情况,都会定义宏。- 如果定义了宏
__STDC_IEC_60559_TYPES__
,则意味着至少定义了一个__STDC_IEC_60559_BFP__
或(或两者)宏。__STDC_IEC_60559_DFP__
在 H.11 小节中,类型long_double_t
被添加到 中<math.h>
。
long_double_t
但是,我无法推断在哪些条件下可以确保给定实现中的存在。
问题:
如果__STDC_IEC_60559_TYPES__
已定义,是否足以确定long_double_t
也在 中定义<math.h>
?
我的怀疑来自以下可能出现的特殊情况:
__STDC_IEC_60559_TYPES__
和__STDC_IEC_60559_DFP__
已定义,但__STDC_IEC_60559_BFP__
未定义。
在本例中,定义了十进制类型。
但是,long_double_t
不是十进制类型。
子问题:
宏是否__STDC_IEC_60559_BFP__
需要存在才能确保存在long_double_t
?
评论:
正如 @John Bollinger 在他的回答中解释的那样,和/或宏的
存在
仅确保和存在于 的某些小值。
(我知道这个细节,但我的解释不是最好的。)*BFP__
*DFP__
_FloatN
_DecimalN
N