为何C11不要求long double精度高于double却要求double精度高于float
C11浮点类型精度规则答疑
题目给出的C11标准相关规定
浮点特性常量定义
DBL_DECIMAL_DIG 10 LDBL_DECIMAL_DIG 10 DBL_DIG 10 LDBL_DIG 10 #define DBL_MAX 1E+37 #define LDBL_MAX 1E+37 #define DBL_MIN 1E-37 #define LDBL_MIN 1E-37
类型取值范围要求
double类型的取值集合是long double类型取值集合的子集
核心问题解答
这个规则差异本质是标准在兼容性和灵活性之间平衡的结果,具体原因如下:
- 首先
double精度必须高于float是C语言从诞生之初就确定的基础约定,符合全球通用的单精度/双精度浮点设计规范,所有主流硬件平台都有对应成熟实现,不存在适配障碍,因此标准直接将其设为强制要求。 long double是后续C89标准才新增的类型,设计初衷是为了给有更高精度需求的场景提供可选支持,而不是强制所有平台都实现更高精度的浮点:- 大量嵌入式、低算力硬件本身没有高于双精度的浮点运算单元,强制要求
long double精度高于double会直接导致这些平台无法合规实现C标准。 - 标准给出的「double是long double的子集」要求,已经足够保证代码的可移植性:所有能存在于double里的值都可以无损赋值给long double处理,不会出现精度丢失问题,哪怕两者精度完全一致也能满足这个要求。
- 对有更高精度硬件支持的平台(比如x86平台的80位扩展浮点、部分RISC架构的128位浮点),标准也不限制实现把
long double做的比double精度更高,给了实现足够的灵活度。
- 大量嵌入式、低算力硬件本身没有高于双精度的浮点运算单元,强制要求
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

