GCC在32位机器中编译程序的方式不同

时间:2016-01-06 23:10:54

标签: c++ linux gcc

我遇到的情况是,在32位机器上编译的相同程序给出的结果与在64位机器上编译它的结果不同。一段代码就像这样

#include <iostream>

int main(int argc, char *argv[])
{
  int index = 1;
  int total = 21;
  int min = 79;
  int max = 100;

  double coef = index / (double)total;
  int ret1 = coef * (max - min);
  std::cout << ret1 << "\n";

  return 0;
} 

我希望结果为1,但在32位Linux上我得到结果0.可能coef *(max - min)的结果是0.9999999 ...并且分配给int导致0.两个朋友试过在64位机器上使用相同的代码,结果为1.为什么它在32位上给出结果0?可能与虚拟机有关吗? 在我的机器上测试环境:

  • 32位Linux Mint 17.2在VMWare 6.0.7上运行
  • gcc 4.8.4
  • 用于构建的命令:g ++ main.cpp -o main

1 个答案:

答案 0 :(得分:4)

我可以使用gcc 4.8.4在64位Ubuntu 14.04上重现这个问题:

$insert = $this->con->db->prepare('UPDATE users SET 
            firstName= ?, 
            lastName= ?, 
            username= ?, 
            email= ?, 
            profileImage= ?, 
            bio= ? 
            WHERE userID = ?');

我相信@void_ptr是对的。 它是由x87内部使用80位数学引起的,而SSE2使用64位。

如果使用$ g++ -m32 main.c -o main && ./main 0 $ g++ -m64 main.c -o main && ./main 1 编译32位可执行文件以强制64位浮点精度,会发生这种情况:

-ffloat-store

这是$ g++ -m32 -ffloat-store main.c -o main && ./main 1 对此问题所说的内容:

man gcc

无论如何,never rely on floating point being mathematically accurate