将整数值转换为浮点值并再次返回与原始整数值相同吗?
例如:
unsigned x = 42;
double y = x;
unsigned z = y;
假设编译器不优化浮点转换,将x == z
始终评估为true?
我怀疑浮点转换中的任何表示错误总是会增加值。因此,当浮点值转换回整数值时,该值将被截断,这始终会产生原始整数值。
我的假设正确吗?
将整数值转换为浮点值并再次返回与原始整数值相同吗?
例如:
unsigned x = 42;
double y = x;
unsigned z = y;
假设编译器不优化浮点转换,将x == z
始终评估为true?
我怀疑浮点转换中的任何表示错误总是会增加值。因此,当浮点值转换回整数值时,该值将被截断,这始终会产生原始整数值。
我的假设正确吗?
假设 的 IEEE 754 双精度格式double
,表达式x == z
将计算为2 53 以内1
的所有值。例如,如果您的编译器提供 32 位,这意味着.x
unsigned int
x
您已编辑您的问题以询问从整数到浮点数的转换。在大多数 C 实现中,此转换根据 FPU 舍入模式进行舍入,默认情况下舍入到最近偶数。那里从浮点数到整数的转换存在不对称性(正如您所指出的,从浮点数到整数的转换总是被截断)。
但是,从整数到浮点数的转换中的任何错误并不意味着您得到了一个没有小数部分的部分,而是您完全得到了错误的整数。例如整数 2 53 +1 被转换为double
表示 2 53的那个。由于这个原因,即使从浮点数到整数的转换总是向上取整,从浮点数到整数的转换也会被截断。
从整数到浮点数的转换中的舍入误差可能大于一:整数5555555555555555555
转换为 时double
,会舍入为5555555555555555328
,这恰好比前者具有更简单的二进制表示。一半的时间,四舍五入向上:例如5555555555555555855
四舍五入到5555555555555556352
。
如果遵循 IEEE-754(如您的标签所建议的那样),则高达 2 53的任何整数都可以精确表示为双精度浮点数。double
因此,假设int
是 32 位,是的,您可以在不损失精度的情况下转换unsigned
为double
。
假设您的浮点双精度类型是 64 位 IEEE754 类型。(C 标准并不坚持这一点,但这是您标记的内容)。
这取决于你的unsigned int
. 如果是 32 位,则可以,如果是 64 位,则不一定。(截止在第 53 位:2 53 + 1 是不能在 IEEE 浮点中精确表示的最小正数double
。)。
在 32 位平台上,答案始终是肯定的。
在 64 位平台上,它取决于编译器。在 LP64 和 LLP64 中unsigned int
是 32 位,但在 ILP64 中是 64 位。(请注意,Win64 使用 LLP64,它也设置long
为 32 位)。