Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
💻 PD ISO/IEC TS 18661 是英国标准协会(BSI)采用国际标准化组织/国际电工委员会技术规范 ISO/IEC TS 18661 而发布的”已发布文件”系列,为 C 语言提供浮点扩展(floating-point extensions)。C 语言的浮点算术由 C 标准(ISO/IEC 9899)与 IEEE 754 浮点标准共同定义;本系列在此基础上扩展,支持更高精度的二进制浮点、十进制浮点、交换/扩展类型及辅助函数,为高性能数值计算、金融十进制运算、嵌入式与科学计算提供标准化支持。系列由 ISO/IEC JTC 1/SC 22(程序设计语言)制定,BSI 的转化工作由 IST/5(程序设计语言、其环境与系统软件接口)技术委员会负责。
本系列共分五个部分,前三个部分文本可完整读取,后两部分为扫描件。各分部从不同侧面完善 C 语言对 IEEE 754 浮点算术的支持:
| 文件号 | 主题 | 版本 | 状态 |
|---|---|---|---|
| PD ISO/IEC TS 18661-1 | 二进制浮点算术 | 2014 | 可读 |
| PD ISO/IEC TS 18661-2 | 十进制浮点算术 | 2015 | 可读 |
| PD ISO/IEC TS 18661-3 | 交换与扩展类型 | 2015 | 可读 |
| PD ISO/IEC TS 18661-4 | 辅助函数(扫描件) | 2015 | 扫描件 |
| PD ISO/IEC TS 18661-5 | 交换格式(扫描件) | 2016 | 扫描件 |
Part 1 为 C 语言引入 二进制浮点算术的扩展。C 标准(如 C11)已支持基于 IEEE 754 的 float/double/long double;本部分扩展了 _FloatN 类型族,包括 _Float16、_Float32、_Float64、_Float128 等,并规定了它们的表示、运算、舍入与转换规则。其内容涵盖:
_FloatN 类型的精度、范围与存储格式(符合 IEEE 754)。fmax/fmin、fma 融合乘加等。该部分使 C 语言能便捷地使用更高精度二进制浮点,并保持与 IEEE 754 一致的可移植行为。需要强调的是,Part 1 并非简单扩充类型,而是系统定义了类型之间的转换、舍入模式、异常处理与可移植性规则,使同一段代码在不同编译器上产生可预期的结果。
_Float128 可显著降低舍入误差累积,本部分为这类应用提供了标准化的类型与函数支持。Part 2 为 C 语言引入 十进制浮点算术。与二进制浮点不同,十进制浮点能精确表示十进制小数(如 0.1、0.01),避免二进制无法精确表示十进制小数导致的舍入误差,对金融、会计、货币计算至关重要。其内容包括:
_Decimal32、_Decimal64、_Decimal128。Part 2 还就”独立式实现(freestanding implementation)”与”预定义宏”作出规定,确保即使在没有完整运行库的环境中,十进制浮点类型与基本运算仍可被正确使用,这与嵌入式金融终端、计费设备等场景高度相关。
Part 3 规定 交换格式(interchange formats)与扩展类型(extended types)。交换格式是用于数据交换的、字节序与位宽确定的浮点表示,保证不同平台/编译器间浮点数据的可交换性;扩展类型则是在基本类型基础上的更大精度/范围扩展。其内容涵盖交换格式的定义、存储布局、对齐与类型转换,为跨平台数据传输与存储(如文件、网络、数据库)提供标准化的浮点编码。
该部分同样规定了”独立式实现”与”预定义宏”的要求,说明交换格式类型即使在缺少标准库的受限环境中也应可用,从而满足嵌入式与实时系统的数据交换需求。
Part 4 规定辅助函数,如求对数、指数、三角函数、反函数、特殊函数(如 gamma、误差函数)等数学函数的浮点扩展版本,为科学计算提供标准化接口。这些函数与 C 标准库 math.h 中的函数相对应,但针对扩展浮点类型给出了对应版本,使高精度计算无需依赖非标准库扩展。
Part 5 进一步细化交换格式的具体位布局、编码与解码规则,补充 Part 3 的细节,确保跨平台浮点数据交换的确定性,涵盖字节序、尾数与指数位宽、特殊值编码等关键要素。
在实际项目中,TS 18661 的价值体现在四个典型场景:
_Float128 等扩展类型,减少舍入误差,提升仿真与数值分析的可靠性。_DecimalN,保证精确的十进制小数运算,避免”分”级别的累计误差。_FloatN),并在需要时启用相应特性宏,确保代码可移植且行为符合规范。_Float128 有什么用处?_FloatN 与十进制浮点扩展;具体支持程度需查阅编译器文档,并在需要时启用特性宏。