考虑代码:
#define LITERAL 1.0
int main()
{
double x = LITERAL;
if (x == LITERAL) return 1;
else return 0;
}
对于我们设置为1
的任何数字双精度值(是否不仅是LITERAL
还是任何其他双精度字面值,是否都保证会返回1.0
?
首先,您必须假定(试图)符合附件F的实现,因为否则所有选择都会被取消;没有附件F(IEEE浮点数)C的情况下,所有浮点结果都可以是伪造的。
然后,根据语言规范,取决于您的C实现对FLT_EVAL_METHOD
的定义,是还是否。>
如果值为0或1,则为是。文字被解释为double
,double
对象忠实地存储该值,并且相等运算符产生1(真),以反映这一点。
如果值为2,则仅当文字是可表示的double
的精确十进制表示形式时。否则(例如,如果类似0.1
之类的话),则文字会以[long double
格式的excess precision
double
对象的初始化/赋值会将精度截断为标称double
精确。然后保证相等比较得出0(false)。为了使事情更复杂,除非您使用-std=c..
或-fexcess-precision=standard
,并且总是做错了],否则GCC会执行默认情况下错了
FLT_EVAL_METHOD
不为0或1的与现实世界相关的目标)上,会发生可怕的事情。要了解它们的严重程度,请参阅GCC issue 93806和(递归)所有与“另请参阅”相关的问题。因此,出于实际目的,是的,对于除32位x86和m68k之外的所有内容,以及在正确的C实现中,对于它们而言,都不是(但可能是这样,因为您的编译器可能已损坏)。