我可以在不丢失信息的情况下将 UInt32、Int32 和浮点值存储在 double 中吗?

Can i store a UInt32, Int32 and a float value inside a double without losing information?

我需要在变量中保存 UInt32、Int32 和浮点值。我可以使用 double 而不丢失信息(例如,在转换中丢失一些数字)还是我需要使用任意精度 class?

从我目前的研究看来我可以,因为我可以在不丢失信息的情况下存储 UInt32 的最大值:

Assert.AreEqual(UInt32.MaxValue, Convert.ToUInt32(Convert.ToDouble(UInt32.MaxValue)));

有什么我遗漏的吗?

能够在不丢失信息的情况下存储 UInt32 的最大值并不一定意味着您将能够在 [=10= 中存储 所有 个值] 而不会丢失信息 - 毕竟,有很多 long 可以 存储在 double 中,即使一些较小的值不能。 (262 可以很容易地精确存储在 double 中,但是 262 - 1 不能,例如。)

但是,您 没问题 - the mantissa for double is 52-bits long,因此任何少于 52 位的整数都可以简单地存储为值 * 20(即有效比例为 0)。

是的,float 值也可以转换为 double 而不会损失精度。

但是,请注意,这并不意味着 0.1f == 0.1d 例如 - 它只是意味着 (double) 0.1f0.1f 完全相同,但表示形式不同。

还值得注意的是,Int32 的范围并不比 UInt32 小——它们的范围都恰好是 232 个连续值.但是,Int32 是否具有较小的 "absolute" 值,并且符号以浮点值表示的方式是相关的。您实际上仍然需要 32 位来存储每个 Int32 的绝对值,因为 Int32.MinValue 在二进制中是 -10000...0000(总共 32 位),或者 -(231 + 1).

最后,float 不仅 double 精度较低 - 它的范围也较小。它只有 8 位用于指数,而 double 中有 11 位。因此,有些数字在 double 范围内,但在 float 范围之外,即使它们没有很多有效(二进制)数字。