将C与文字值进行比较,可以在32位机器上得到不同的结果

PJK*_*PJK 3 c floating-point 32bit-64bit fedora-25

有人可以解释原因:

double d = 1.0e+300;
printf("%d\n", d == 1.0e+300);
Run Code Online (Sandbox Code Playgroud)

在64位计算机上按预期打印"1",但在32位计算机上打印"0"?(我在Fedora 25上使用GCC 6.3得到了这个)

据我所知,浮点文字属于类型,double并且没有发生类型转换.

更新:仅在使用-std=c99标志时发生.

Grz*_*ski 6

C标准允许在某些表达式中静默地将浮点常量传播到long double 精度(注意:精度,而不是类型).相应的宏是FLT_EVAL_METHOD<float.h>C99之后定义的.

正如C11(N1570),§5.2.4.2.2所述,价值的语义2是:

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

从技术角度来看,在x86架构(32位)上,GCC使用带有80位堆栈寄存器的x87将给定代码编译为FPU指令,而对于x86-64架构(64位),它使用SSE单元(作为XMM内的标量)寄存器).

目前的实施是在GCC 4.5中引入的以及-fexcess-precision=standard选项.从GCC 4.5发行说明:

GCC现在支持以符合ISO C99的方式处理因使用x87浮点单元而产生的浮点过剩精度.这可以使用-fexcess-precision=standard和使用标准一致性选项,例如-std=c99,并且可以使用禁用 -fexcess-precision=fast.

  • 这不是32比64的问题,而是x86/amd64实现细节的gcc.在其他架构上,观察结果可能不同.说,实际的原因是浮点类型几乎不能完全代表任何分数. (3认同)