在 C 语言中比较 double 与文字值在 32 位机器上会给出不同的结果

问题描述 投票:0回答:1

有人可以解释一下原因吗:

double d = 1.0e+300;
printf("%d\n", d == 1.0e+300);

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

据我所知,浮点文字的类型为

double
并且没有发生类型转换。

更新: 这仅在使用

-std=c99
标志时发生。

c gcc x86 floating-point 32bit-64bit
1个回答
7
投票

C 标准允许在某些表达式中默默地将浮点常量传播到

long double
precision(注意:精度,而不是类型)。对应的宏是
FLT_EVAL_METHOD
,自 C99 起在
<float.h>
中定义。

根据 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

© www.soinside.com 2019 - 2024. All rights reserved.