将unsigned转换为double无符号而不会丢失精度

时间:2013-11-22 15:02:20

标签: c floating-point c99 ieee-754 floating-point-conversion

整数值是否会转换为浮点值并再次返回与原始整数值相同?

例如:

unsigned x = 42;
double y = x;
unsigned z = y;

假设编译器没有优化浮点转换,x == z总是会评估为 true 吗?

我怀疑浮点转换中的任何表示错误都将始终是增加的值。因此,当浮点值转换回整数值时,该值为 truncated ,它总是产生原始整数值。

我的假设是否正确?

3 个答案:

答案 0 :(得分:10)

假设double的IEEE 754双精度格式,x == z的所有值1最多2 53 <{1}}将评估为x 。例如,如果您的编译器提供32位unsigned int,则表示x的所有可能值。

您已编辑过您的问题,询问有关从整数到浮点数的转换。在大多数C实现中,此转换根据FPU舍入模式进行舍入,默认情况下,舍入为舍入到最近。那里有从float到integer的转换的不对称性(正如你所指出的,从float到int的转换总是截断的。)

但是,从整数到浮点数的转换中的任何错误都不意味着你得到一个没有的小数部分,但是你得到了错误的整数。例如,整数2 53 +1被转换为代表2 53 double。因此,即使从float到integer的转换总是向上舍入,从float转换为整数也无济于事。

从整数到浮点数的转换中的舍入误差可能大于1:整数5555555555555555555在转换为double时会四舍五入为5555555555555555328,恰好有比前者更简单的二进制表示。一半时间,舍入值向上:例如5555555555555555855四舍五入为5555555555555556352

答案 1 :(得分:3)

如果double跟随IEEE-754(如标记所示),则任何高达2 53 的整数都具有精确表示为双精度浮点数。因此,假设int是32位,是的,您可以将unsigned转换为double而不会损失精度。

答案 2 :(得分:1)

假设您的浮点双精度类型是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位。