Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
CAN CSA ISO IEC TS 18661-5-18 是加拿大标准协会(CSA)采纳的国际标准 ISO/IEC TS 18661-5:2018,全称为《信息技术 — 编程语言及其环境和系统软件接口 — C语言浮点扩展 — 第5部分:补充属性》。该标准是 ISO/IEC TS 18661 系列的第5部分,专注于为C语言提供浮点算术的补充属性,以支持 IEEE 754-2008 标准中定义的更丰富的浮点功能。
该标准适用于 C 语言编译器、运行时库以及需要精确控制浮点行为的软件系统。它旨在帮助开发人员在C语言中高效实现数值计算、科学仿真、金融建模等对浮点精度和性能有高要求的应用。标准发布时间为2018年,2020年被加拿大采纳为 CAN/CSA 版本,并在2026年进行了一次定期评审确认。
ISO/IEC TS 18661-5 定义了一组补充属性,这些属性允许程序员更精细地控制浮点操作的行为。以下是标准中定义的核心技术内容:
标准引入了缩放函数和类型,用于高效地将浮点值缩放至指定指数范围,避免溢出或精度损失。核心函数包括 scalbn、scalbln、logb 和 ilogb,它们允许按照2的整数次幂缩放浮点数,同时保持舍入行为可控。
允许在运行时改变舍入模式,支持 IEEE 754 的四种基本舍入方向:就近舍入(FE_TONEAREST)、向零舍入(FE_TOWARDZERO)、向上舍入(FE_UPWARD)和向下舍入(FE_DOWNWARD)。此外,还提供了针对十进制浮点数的舍入控制接口。
定义了一系列宏和函数来检测、设置和清除浮点异常标志,包括除零(FE_DIVBYZERO)、溢出(FE_OVERFLOW)、下溢(FE_UNDERFLOW)、无效操作(FE_INVALID)和不精确结果(FE_INEXACT)。标准还提供了保存和恢复整个浮点环境的机制。
还包括对浮点环境、优化控制、可转换性等方面的扩展,例如非规格化数处理、信令非数(SNaN)的支持等。
| 功能分类 | 属性/接口 | 描述 |
|---|---|---|
| 缩放 | scalbn, scalbln, logb, ilogb | 按2的整数次幂缩放浮点数 |
| 舍入方向 | fegetround, fesetround, fe_dec_getround, fe_dec_setround | 查询和设置当前舍入方向 |
| 异常处理 | feclearexcept, feraiseexcept, fetestexcept, fegetexceptflag, fesetexceptflag | 清除、引发、测试浮点异常标志 |
| 浮点环境 | fenv_t, feholdexcept, feupdateenv | 保存和恢复整个浮点环境 |
-O2)时,编译器可能会重新排列浮点运算,从而改变异常行为。使用这些补充属性可以更好地控制优化,确保数值稳定性。建议在关键区域使用 #pragma STDC FENV_ACCESS ON 告知编译器不进行危险重排。在C语言项目中实施 CAN CSA ISO IEC TS 18661-5-18 标准,需要编译器支持 C99 或 C11 标准,并包含 <math.h> 和 <fenv.h> 头文件。大多数现代 C 编译器(如 GCC、Clang、MSVC)已经部分支持这些扩展。
在 GCC 和 Clang 中,需使用 -std=c11 或 -std=c17 以及 -frounding-math 和 -fsignaling-nans 等选项来启用正确的浮点语义。对于 MSVC,需要 /fp:strict 或 /fp:precise 选项。若需要使用十进制浮点扩展,还需启用对应硬件或软件支持。
以下代码演示了如何设置舍入方向并检测异常:
#include <fenv.h>#include <stdio.h>int main() { fesetround(FE_UPWARD); volatile double a = 1.0, b = 3.0; double c = a / b; if (fetestexcept(FE_INEXACT)) printf("结果不精确 "); return 0;}FENV_ACCESS 并彻底测试所有路径。ISO/IEC TS 18661-5 是 ISO/IEC TS 18661 系列的一部分,该系列包括五个部分:第1部分(缩放与向量)、第2部分(十进制浮点表达法)、第3部分(复数浮点)、第4部分(补充函数)以及第5部分(补充属性)。该系列与 IEEE 754-2008(以及后续的 IEEE 754-2019)紧密相关,提供了C语言层面的完整映射。同时,它也是 C 标准(ISO/IEC 9899)的重要补充,部分功能已被 C23 标准(ISO/IEC 9899:2024)采纳。加拿大版本的 CAN CSA ISO IEC TS 18661-5-18 与 ISO/IEC TS 18661-5:2018 完全相同,仅增加了加拿大标准的管理前缀。