我遇到的情况是,在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?可能与虚拟机有关吗? 在我的机器上测试环境:
答案 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。