【问题标题】:.NET primitive type addition oddities?.NET 原始类型添​​加的奇怪之处?
【发布时间】:2011-10-04 17:14:12
【问题描述】:

我很好奇,所以我运行了几个测试来看看 .NET 如何处理溢出(我在任何地方都找不到它的文档)。我几乎希望他们吐出溢出错误而不是结果,因为老实说这些结果很奇怪:

  1. Int32.MaxValue + Int32.MaxValue = -2
    我知道它会环绕,但为什么要这样做而不是抛出 OverflowException?这不是“未经检查”的目的......忽略溢出吗?我现在对 unchecked 是什么感到有点困惑,特别是因为我已经看到它用于创建哈希值。

  2. Double.PositiveInfinity + Double.NegativeInfinity = Double.NaN
    另一个怪事。 1 + -1 = 0。100 + -100 = 0。那么为什么 Infinity + -Infinity = NaN?

  3. Double.PositiveInfinity / Double.PositiveInfinity = Double.NaN
    再次,为什么奇怪?我认为这应该是 1 或可能是 0(b/c x / Infinity = 0 的限制)。事实上...Double.MaxValue / Double.PositiveInfinity = 0...

  4. Double.PositiveInfinity / 0 = Infinity
    什么!?没有 DivideByZeroException!?

  5. Double.MaxValue + Double.MaxValue = Infinity
    是的,这个不会抛出溢出异常,但也不会环绕?所以我猜不是所有原始类型的行为都像 int 那样。奇怪的是,我可以做诸如Double.MaxValue + 1 = 1.79769313486232E+308 之类的事情。因此,添加超出双精度的 MaxValue 是可能的(可能会失去精度?),但是在一些未知数之后(可能可以算出 - 或已经算出)它失去了显示有效数字并返回 Infininty 的能力?

嗯,其余的有点重复。我只是想知道为什么这些以他们的方式运作?特别是 Double 运算符。能够添加超出 MaxValue 对我来说是非常意外的。

【问题讨论】:

  • #1 由项目属性 -> 构建 -> 高级... -> 检查算术上溢/下溢中的构建设置控制。使用 Checked/Unchecked 只是覆盖此设置以说“始终检查/不检查此代码是否有溢出/下溢”。
  • @Adam 和选中/未选中的关键字,用于更本地化的使用

标签: c# double overflow int primitive


【解决方案1】:
  1. 是的; checked 会解决这个问题; unchecked 是默认行为
  2. 在数学上,您不能添加 +inf 和 -inf,也不能推断符号。 NaN 是唯一明智的选择;但是,+inf + +inf => +inf 和 -inf + -inf => -inf,就像你可能推断的那样
  3. 再次,从数学上讲,第一个工作。尤其是,它会导致 2*x/x=>1,这会更糟。但基本上:inf 不是数字
  4. 不,他们没有;这是浮点的预期行为
  5. 浮动不换行; 超过最大值就是无穷大

【讨论】:

  • 但是在 #5 中,超过最大值不是无穷大(直到某个点,我不知道),如简单添加 1 所示。
  • +1 太小,无法更改数字的值。 Double.MaxValue + 1 = Double.MaxValue。要获得无穷大,您必须添加足够大的东西以影响数字中的最后一位。
  • 我无法直截了当地告诉你。您必须深入研究双精度类型的定义。
  • @michael:关于#5,请参阅这篇文章 (codeproject.com/KB/cs/overflow_checking.aspx),其中指出:事实上,浮点数(float 和 double)溢出永远不会抛出异常,而只是返回一个+/- Infinity 的特殊值。另一方面,对于十进制类型,checked/unchecked 关键字也会被忽略,但 overflow 总是会抛出 OverflowException。
  • @0A0D:所以小数与浮点数不同,不仅仅是在精度方面。
【解决方案2】:

大约2/3

无穷大不是一个数字。它也不像一个数字。

如果我们让a 为正整数(1、2、3、...)的个数,b 为偶数(2、4、6、...)的个数,@ 987654323@ 是奇数 (1, 3, 5, ...)。很明显,abc 都是无穷大。

您可能会期望a - a = 0,在这种情况下意味着infinity - infinity = 0。但是,您也可以期待a - b = c,因为ca 中的数字,而不是b。然而,这给了我们infinity - infinity = infinity

通过正确构造无穷大,您可以生成任何整数作为infinity - infinity 的答案。因此,给它一个正确的定义是没有意义的,所以我们让它成为NaN,或者“Not a Number”。

除法也是如此,也就是第3点。

【讨论】:

  • 但是,Double 不是一组数字。这是一个数字。
  • 是的,但是abc 是集合的大小,而不是集合本身。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2011-01-07
  • 2012-05-08
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多