May C可以使用多种浮点格式进行评估吗?

C 2011 [N1570] 5.2.4.2.2 9说:

除了赋值和转换…之外,具有浮动操作数的运算符产生的值和通常算术转换以及浮动常量的值将被评估为其范围和精度可能大于该类型所需的格式。

这是否意味着可以使用一种格式评估实现中的所有浮点运算,或者可以使用更大范围和精度的格式评估每个运算?

如果用额外精度评估的A*B与用标称精度评估的A*B不同,后者将允许A*B == A*B评估为假。

在GCC的C编译器的情况下,阅读标准的相关部分的Joseph S. Myers的解释 ,以及C11中的FLT_EVAL_METHOD的定义 FLT_EVAL_METHOD :9:

评估格式的使用以FLT_EVAL_METHOD的实现定义值为特征:

-1不确定;

0仅根据类型的范围和精度评估所有操作和常量;

1计算float类型的操作和常量以及double类型的范围和精度,将long double操作和常量计算为long double类型的范围和精度;

2评估long double类型的范围和精度的所有操作和常量。

FLT_EVAL_METHOD定义为-1 AC编译器不需要对浮点计算的精度做任何特定的事情,但根据上面的说法,将其定义为1应该只计算double精度的float表达式,并定义它的一个to 2应该只计算long double precision中的floatdouble表达式。

该标准没有明确允许其他精度,也没有明确允许在编译器方便时舍入到标称精度。 (GCC在Joseph S. Myers的补丁之前做了后者,而x86上的clang -mno-sse2 -std=c99在我最后一次尝试时做了同样的事情,同时错误地将FLT_EVAL_METHOD定义为0) 。

根据对FLT_EVAL_METHOD含义的严格解释, a * b应该只有一个值,如果该值不是NaN,则a * b == a * b应始终保存在使用定义FLT_EVAL_METHOD的编译器编译的C程序中到0,1或2。