是int-> double-> int保证是保值吗?

时间:2012-12-03 22:55:48

标签: c++ c++11

如果我有int,请将其转换为double,然后将double转换回int,我保证会获得相同的值我开始了?换句话说,给定此功能:

int passThroughDouble(int input)
{
  double d = input;
  return d;
}

我保证所有passThroughDouble(x) == x int x为{{1}}吗?

2 个答案:

答案 0 :(得分:30)

不,不是。该标准没有说明intdouble的相对大小。

如果int是64位整数且double是标准IEEE双精度,则对于大于2^53的数字,它将失败。


尽管如此,int在今天的大多数环境中仍然是32位。所以在很多情况下它仍然会存在。

答案 1 :(得分:12)

如果我们将考虑限制在浮点类型的“传统”IEEE-754样式表示中,那么当且仅当类型double的尾数具有值时,您才能期望此转换是保值的。与int类型中的非符号位一样多的位。

经典IEEE-754 double类型的尾数是53位宽(包括“隐含”前导位),这意味着您可以精确地表示[-2^53, +2^53]范围内的整数。超出此范围的所有内容通常都会失去精确度。

因此,这完全取决于您的intdouble的比较宽度。答案取决于具体的平台。使用32位int和IEEE-754 double,等式应该成立。