gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:01:30 34 4
gpt4 key购买 nike

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

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

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

有什么我遗漏的吗?

最佳答案

能够存储 UInt32 的最大值不丢失信息并不一定意味着您可以将所有 值存储在UInt32 中不会丢失信息 - 毕竟,有很多 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 确实有一个较小的“绝对”值,并且符号以浮点值表示的方式是相关的。您实际上仍然需要 32 位来存储每个 Int32 的绝对值。 ,因为 Int32.MinValue在二进制中是 -10000...0000(总共 32 位),或 -(231 + 1)。

最后,float不只是 double精度较低 - 它的范围也较小。与 double 中的 11 位相比,它只有 8 位用于指数。 .所以在 double 范围内的数字很好在 float 的范围之外,即使它们没有很多有效(二进制)数字。

关于c# - 我可以在不丢失信息的情况下将 UInt32、Int32 和浮点值存储在 double 中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27978928/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com