是否总是可以将`int`转换为`float`

时间:2017-06-30 12:45:05

标签: c floating-point

在C中始终可以从int转换为floatfloat不会成为+ Inf或-Inf等特殊值之一吗?

AFAIK int的范围没有上限。

我认为128位int会导致IEEE754 float的平台出现问题,因为它的上限值大约是第127个幂的2。

3 个答案:

答案 0 :(得分:8)

对你的问题的简短回答:不,并非总是可行。

但值得进一步了解细节。以下段落显示了标准关于整数到浮点转换(online C11 standard draft)的内容:

  

6.3.1.4实数浮点数和整数

     

2)当整数类型的值转换为实际浮动类型时,   如果转换的值可以完全用新的表示   类型,它没有变化。如果转换的值在范围内   可以表示但不能准确表示的值,   结果是最接近的较高或最接近的较低的可表示   值,以实现定义的方式选择。如果值正在   转换超出了可以表示的值范围,即   行为未定义。 ...

可以精确转换这么多整数值。某些整数值可能会失去精度,但转换至少是可能的。但是,对于某些值,行为可能未定义(例如,如果整数值无法用浮点值的最大指数表示)。但实际上我不能假设会发生这种情况。

答案 1 :(得分:1)

该标准仅要求浮点表示包括大于10 37 §5.2.4.2.2/12)的有限数,并且不对整数的最大大小施加任何限制。因此,如果您的实现具有128位整数(甚至是124位整数),则整数到浮点转换可能会超出有限可表示浮点数的范围。

答案 2 :(得分:1)

  

是否始终可以将int转换为float

合理 - 是的。 int将始终转换为有限float。对于很高的int值,转换可能会失去一些精确度。

然而对于迂腐的人来说,一个奇怪的编译器可能会遇到麻烦。

C允许过宽int,而不仅仅是16,32或64位,float可以有一个限制范围,小到1e37。

不应该关注intINT_MAX范围。它是 lower 结尾。 INT_MIN通常比INT_MAX更大+1。

124位int min值可能约为-1.06e37,因此确实超过最小float范围。

使用公共binary32 float时,int伤口需要超过128位才能导致float无穷大。

那么需要进行哪些测试才能发现这种罕见情况?

形成精确的2次幂限制并进行仔细的数学运算以避免溢出或不精确。

#if -INT_MAX == INT_MIN
  // rare non 2's complement machine
  #define INT_MAX_P1_HALF (INT_MAX/2 + 1)
  _Static_assert(FLT_MAX/2 >= INT_MAX_P1_HALF, "non-2's comp.`int` range exceeds `float`");
#else
  _Static_assert(-FLT_MAX <= INT_MIN, "2's complement `int` range exceeds `float`");
#endif