繁体   English   中英

我可以将UInt32,Int32和浮点值存储在double中而不会丢失信息吗?

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

我需要在变量中保存UInt32,Int32和float值。 我可以使用double而不会丢失信息(例如,在转换中丢失一些数字)或者我是否需要使用任意精度类?

从我目前的研究看起来我可以,因为我可以存储UInt32的最大值而不会丢失信息:

Assert.AreEqual(UInt32.MaxValue, Convert.ToUInt32(Convert.ToDouble(UInt32.MaxValue)));
  • 因此,double应该支持足够的数字来表示小于或等于UInt32.MaxValue的所有数字。
  • 无论如何,Int32的值范围较小,因此也支持它。
  • 还应支持Float,因为它只是精度较低的两倍。

我错过了什么吗?

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

但是, 还行- 用于尾数double是52位长 ,所以具有少于52位的任一整数可以平凡被存储为值* 2 0(即0的有效规模)。

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

但是,请注意,这并不意味着0.1f == 0.1d的例子-它只是意味着(double) 0.1f是完全一样的号码作为0.1f ,在不同的表示。

同样值得注意的是Int32范围不比UInt32小 - 它们的范围恰好是2 32个连续值。 但是, Int32 确实具有较小的“绝对”值,并且符号以浮点值表示,这是相关的。 你仍然需要32位才能存储每个Int32的绝对值,因为Int32.MinValue是二进制的-10000 ... 0000(总共32位),或 - (2 31 + 1)。

最后, float不仅仅是精度更低的double - 它的范围也更小。 对于指数,它只有8位,而在double只有11位。 因此,即使它们没有很多有效(二进制)数字,也有在double范围内的数字,这些数字超出了float的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM