C23标准中long_double_t类型存在条件的技术问询
long_double_t的疑问解析 C23标准(ISO/IEC 9899:2023)的附录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_BFP__或__STDC_IEC_60559_DFP__任意一个被定义,__STDC_IEC_60559_TYPES__就会被定义; __STDC_IEC_60559_TYPES__已定义意味着至少__STDC_IEC_60559_BFP__或__STDC_IEC_60559_DFP__中的一个(或两者)已被实现。
long_double_t相关疑问
H.11小节将long_double_t类型纳入<math.h>,但标准未明确该类型的存在条件,由此产生两个核心疑问:
疑问1:__STDC_IEC_60559_TYPES__已定义时,能否保证<math.h>中存在long_double_t?
不能。
存在特殊场景:当编译器仅实现了十进制浮点扩展(即定义__STDC_IEC_60559_TYPES__和__STDC_IEC_60559_DFP__,但未定义__STDC_IEC_60559_BFP__),此时仅提供十进制浮点类型,而long_double_t属于二进制浮点类型,因此<math.h>中不会定义该类型。仅通过__STDC_IEC_60559_TYPES__无法确保long_double_t存在。
疑问2:是否必须存在__STDC_IEC_60559_BFP__才能确保long_double_t存在?
是的。
long_double_t是与long double对应的精确宽度类型,属于二进制浮点类型体系。只有当编译器实现了二进制浮点扩展(即定义__STDC_IEC_60559_BFP__)时,<math.h>才会提供long_double_t类型。
补充说明:@John Bollinger指出,
__STDC_IEC_60559_BFP__和/或__STDC_IEC_60559_DFP__的存在仅能保证编译器实现了对应系列中部分较小N值的_FloatN或_DecimalN类型,并非所有可能的N值都被支持。
内容的提问来源于stack exchange,提问作者user2698605

