在C中始终可以从int
转换为float
而float
不会成为+ Inf或-Inf等特殊值之一吗?
AFAIK int
的范围没有上限。
我认为128位int
会导致IEEE754 float
的平台出现问题,因为它的上限值大约是第127个幂的2。
答案 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。
不应该关注int
或INT_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