int32 的极限值是多少,直到 int32 到 float 的转换可以在不四舍五入到最接近的值的情况下工作?

What are the limit values of int32 till which int32 to float conversion can work without rounding to nearest value?

我正在尝试将 int32 值转换为浮点数,当我尝试将大于 0x0FFFFF 的值转换时,最后指向的小数点总是四舍五入为最接近的值。我知道当一个值不适合目标浮动成员时,它将被四舍五入,但我需要知道哪个是这个的限制值。 例如11111111 (0x69F6BC7) 打印为 111111112.0 .

float 有效数的最大整数值为 FLT_RADIX/FLT_EPSILON - 1。有效数字的“整数值”是指缩放后的值,使其最低位表示值 1。

FLT_RADIX/FLT_EPSILON 也可以用 float 表示,因为它是基数的幂。 FLT_RADIX/FLT_EPSILON + 1float 中不可表示,因此如果整数的大小超过 FLT_RADIX/FLT_EPSILON,则将整数转换为 float 可能会导致四舍五入。

如果已知 INT_MAX 超过 FLT_RADIX/FLT_EPSILON,您可以使用 (int) (FLT_RADIX/FLT_EPSILON) < x 测试非负 int x。如果不知道FLT_RADIX/FLT_EPSILON可以成功转换成int,可能需要更复杂的测试。

C 实现通常使用 IEEE-754 binary32 格式,也称为“单精度”,用于 float。在这种格式下,FLT_RADIX/FLT_EPSILON 是 224 = 16,777,216.

这些符号在 <float.h> 中定义。对于 doublelong double,将 FLT_EPSILON 替换为 DBL_EPSILONLDBL_EPSILONFLT_RADIX 保持不变,因为它对所有格式都相同。

理论上,不正常的浮点格式可能具有异常小的指数范围,这使得 FLT_RADIX/FLT_EPSILON - 1 无法表示,因为尾数不能缩放得足够高。这个在实践中可以忽略。