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 + 1
在 float
中不可表示,因此如果整数的大小超过 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>
中定义。对于 double
或 long double
,将 FLT_EPSILON
替换为 DBL_EPSILON
或 LDBL_EPSILON
。 FLT_RADIX
保持不变,因为它对所有格式都相同。
理论上,不正常的浮点格式可能具有异常小的指数范围,这使得 FLT_RADIX/FLT_EPSILON - 1
无法表示,因为尾数不能缩放得足够高。这个在实践中可以忽略。
我正在尝试将 int32 值转换为浮点数,当我尝试将大于 0x0FFFFF 的值转换时,最后指向的小数点总是四舍五入为最接近的值。我知道当一个值不适合目标浮动成员时,它将被四舍五入,但我需要知道哪个是这个的限制值。 例如11111111 (0x69F6BC7) 打印为 111111112.0 .
float
有效数的最大整数值为 FLT_RADIX/FLT_EPSILON - 1
。有效数字的“整数值”是指缩放后的值,使其最低位表示值 1。
值 FLT_RADIX/FLT_EPSILON
也可以用 float
表示,因为它是基数的幂。 FLT_RADIX/FLT_EPSILON + 1
在 float
中不可表示,因此如果整数的大小超过 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>
中定义。对于 double
或 long double
,将 FLT_EPSILON
替换为 DBL_EPSILON
或 LDBL_EPSILON
。 FLT_RADIX
保持不变,因为它对所有格式都相同。
理论上,不正常的浮点格式可能具有异常小的指数范围,这使得 FLT_RADIX/FLT_EPSILON - 1
无法表示,因为尾数不能缩放得足够高。这个在实践中可以忽略。