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

Wil*_*nka 6 c floating-point

在C中是否始终可以转换int为a float,而不会float成为+ Inf或-Inf等特殊值之一?

AFAIK的范围没有上限int.

我认为int对于具有IEEE754的平台来说,128位会导致问题,float因为它的上限值大约为2的127次幂.

Ste*_*ner 8

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

但值得进一步了解细节.以下段落显示了标准关于整数到浮点转换的内容(在线C11标准草案):

6.3.1.4实数浮点数和整数

2)当整数类型的值转换为实际浮动类型时,如果转换的值可以在新类型中准确表示,则它将保持不变.如果转换的值在可以表示但不能精确表示的值的范围内,则结果是以实现定义的方式选择的最接近的较高或最接近的较低可表示值.如果要转换的值超出可以表示的值范围,则行为未定义....

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


chu*_*ica 3

是否总是可以将 an 转换int为 a float

合理地——是的。Anint总是会转换为有限的float。对于较大的值,转换可能会损失一些精度int

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


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

应该关注的不是或的上限这是低端。 通常比 的幅度大+1 。intINT_MAXINT_MININT_MAX

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

对于常见的binary32 float, anint需要超过 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
Run Code Online (Sandbox Code Playgroud)