我可以在不丢失信息的情况下将 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)));
- 因此 double 应该支持足够的数字来表示所有小于或等于 UInt32.MaxValue 的数字。
- 反正int32取值范围较小,所以也支持
- 还应支持浮点数,因为它只是精度较低的两倍。
有什么我遗漏的吗?
能够在不丢失信息的情况下存储 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.1f
与 0.1f
完全相同,但表示形式不同。
还值得注意的是,Int32
的范围并不比 UInt32
小——它们的范围都恰好是 232 个连续值.但是,Int32
是否具有较小的 "absolute" 值,并且符号以浮点值表示的方式是相关的。您实际上仍然需要 32 位来存储每个 Int32
的绝对值,因为 Int32.MinValue
在二进制中是 -10000...0000(总共 32 位),或者 -(231 + 1).
最后,float
不仅 double
精度较低 - 它的范围也较小。它只有 8 位用于指数,而 double
中有 11 位。因此,有些数字在 double
范围内,但在 float
范围之外,即使它们没有很多有效(二进制)数字。
我需要在变量中保存 UInt32、Int32 和浮点值。我可以使用 double
而不丢失信息(例如,在转换中丢失一些数字)还是我需要使用任意精度 class?
从我目前的研究看来我可以,因为我可以在不丢失信息的情况下存储 UInt32 的最大值:
Assert.AreEqual(UInt32.MaxValue, Convert.ToUInt32(Convert.ToDouble(UInt32.MaxValue)));
- 因此 double 应该支持足够的数字来表示所有小于或等于 UInt32.MaxValue 的数字。
- 反正int32取值范围较小,所以也支持
- 还应支持浮点数,因为它只是精度较低的两倍。
有什么我遗漏的吗?
能够在不丢失信息的情况下存储 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.1f
与 0.1f
完全相同,但表示形式不同。
还值得注意的是,Int32
的范围并不比 UInt32
小——它们的范围都恰好是 232 个连续值.但是,Int32
是否具有较小的 "absolute" 值,并且符号以浮点值表示的方式是相关的。您实际上仍然需要 32 位来存储每个 Int32
的绝对值,因为 Int32.MinValue
在二进制中是 -10000...0000(总共 32 位),或者 -(231 + 1).
最后,float
不仅 double
精度较低 - 它的范围也较小。它只有 8 位用于指数,而 double
中有 11 位。因此,有些数字在 double
范围内,但在 float
范围之外,即使它们没有很多有效(二进制)数字。