C语言是否可采用多种浮点格式求值?C2011标准条款问询
C语言浮点运算的求值格式:是否允许每个运算独立选用更高精度格式?
首先直接给出结论:是的,C11标准(N1570 5.2.4.2.2 9)允许实现为每个独立的浮点运算(除赋值和强制转换外)选择范围和精度超出类型要求的格式,不需要所有运算统一使用同一种更高格式。
咱们来拆解标准里的这段规定:
除赋值和强制类型转换外,带有浮点操作数的运算符产生的值、经过常规算术转换的值以及浮点常量,其求值所用格式的范围和精度可能超出该类型的要求。
这里的表述是针对每个单独的求值场景的——也就是说,编译器可以针对某一个加法运算用double精度(即使操作数是float),针对另一个乘法运算用long double精度,只要这两种格式都满足“超出原类型要求”的条件就行。标准并没有要求所有浮点运算必须统一使用同一种扩展格式。
当然,实际很多编译器实现会选择统一使用目标平台的最高浮点精度格式(比如x86架构上常见的80位扩展精度)来处理所有中间浮点运算,但这只是实现层面的选择,不是标准强制要求。理论上,实现完全可以根据运算类型、上下文等因素,为每个运算独立选择不同的扩展格式,只要最终在赋值或强制转换时,把结果转回符合原类型要求的格式即可。
这种灵活性意味着,确实可能出现不同运算使用不同格式求值的情况,这是完全符合C11标准规定的行为。
内容的提问来源于stack exchange,提问作者Eric Postpischil
相关产品推荐
相关产品推荐

