Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
CAN/CSA-ISO/IEC TR 24732-12:2016 是加拿大标准协会(CSA)采纳的国际标准化组织/国际电工委员会(ISO/IEC)技术报告,正式名称为《信息技术 — 编程语言及其环境和系统软件接口 — C 语言十进制浮点算术扩展技术报告》。该技术报告于 2016 年首次发布,并在 2026 年经 CSA 复审确认继续有效。
该标准定义了一组 C 语言扩展,用于支持十进制浮点算术运算。其核心目的是允许 C 程序员使用十进制浮点类型(_Decimal32、_Decimal64、_Decimal128)直接进行十进制运算,从而避免二进制浮点表示(如 float、double)在金融、商业和税务等应用中固有的舍入误差。
适用范围包括:
该技术报告引入的扩展主要包括三方面:新的十进制浮点数据类型、运算与舍入规则、以及标准库函数的扩充。
标准定义了三种十进制浮点类型,对应 IEEE 754-2008 中的 decimal32、decimal64 和 decimal128 格式。每种类型的精度、指数范围和存储大小如下表所示:
| 类型 | 十进制有效数字位数 | 最小指数 | 最大指数 | 存储需求 |
|---|---|---|---|---|
_Decimal32 | 7 | −95 | 96 | 32 位 |
_Decimal64 | 16 | −383 | 384 | 64 位 |
_Decimal128 | 34 | −6143 | 6144 | 128 位 |
所有十进制浮点类型均采用十进制尾数(有效数字)表示,而非二进制尾数,因此可精确表示所有十进制小数。
扩展支持五种标准舍入方式(向最近偶数舍入、向零舍入、向正无穷舍入、向负无穷舍入、向远离零舍入),并可设置舍入方向。此外,还定义了五种例外条件:无效操作、除以零、上溢、下溢、不精确。程序可通过头文件 <decimal.h> 中的宏和函数来访问这些状态。
标准规定了一系列转换函数:
printf/scanf 的 %H/%D/%DD 等扩展)。-fdecimal-float)。在实际项目中采用 CAN/CSA-ISO/IEC TR 24732-12:2016 时,开发人员应注意以下要点:
<decimal.h> 头文件及相关运行时库(如 libdecnumber)。建议开发团队在项目初期编写验证测试集,包含典型十进制边界值(如 0.01、9999999.99)和舍入场景,以确保编译器实现与标准一致。
typedef _Decimal64 money_t;)并在整个财务模块中统一使用,这样既提高可读性,也便于将来替换为更高精度的类型。CAN/CSA-ISO/IEC TR 24732-12:2016 并非孤立存在,它与以下重要标准密切相关:
加拿大采纳本技术报告时,未做技术修改,仅进行形式适配。因此,任何符合 ISO/IEC TR 24732:2009 的实现也等同符合 CAN/CSA-ISO/IEC TR 24732-12:2016。
-fdecimal-float 激活。同时,需确保链接时包含 -ldecimal 库(不同发行版名称可能不同)。printf 或 scanf?%H、%D、%DD 分别对应 _Decimal32、_Decimal64、_Decimal128。例如,printf("%D ", dv); 输出一个 _Decimal64 值。