. net基本类型的加法
本文关键字:类型 net | 更新日期: 2023-09-27 18:02:13
我很好奇,所以我运行了几个测试,看看。net如何处理溢出(我找不到任何文档)。我几乎希望他们吐出溢出错误,而不是结果,因为老实说,这些结果只是奇怪:
-
Int32.MaxValue + Int32.MaxValue = -2
我理解它环绕,但为什么这样做,而不是抛出一个OverflowException?这不是"未检查"的意思吗?忽略溢出?我有点困惑,什么是unchecked现在,特别是因为我看到它用于创建哈希值。 -
Double.PositiveInfinity + Double.NegativeInfinity = Double.NaN
另外一个奇怪的地方。1 + -1 = 0。100 + -100 = 0。为什么∞+ -∞= NaN? -
Double.PositiveInfinity / Double.PositiveInfinity = Double.NaN
再说一遍,为什么这么奇怪?我认为这应该是1或者0 (b/c x/∞的极限= 0)。Double.MaxValue / Double.PositiveInfinity = 0
… -
Double.PositiveInfinity / 0 = Infinity
什么! ?没有DivideByZeroException ! ? -
Double.MaxValue + Double.MaxValue = Infinity
是的,这一个不抛出OverflowException,但也不环绕?所以我猜不是所有的基本类型都像整型那样。奇怪的是,我可以做像Double.MaxValue + 1 = 1.79769313486232E+308
这样的事情。所以在双精度对象的MaxValue之外添加是可能的(可能会失去精度?),但是在一些未知的数字之后(它可能已经被计算出来了-或者已经被计算出来了),它失去了显示有效数字的能力并返回无穷大?
好吧,剩下的都是重复的。我只是想知道为什么这些东西会这样?尤其是双操作符。对于我来说,能够添加超出MaxValue的内容是非常出乎意料的。
- 是的;
checked
将解决这个问题;unchecked
是默认行为 - 数学上,你不能加+inf和-inf,你不能推断一个符号。NaN是唯一相同的选择;但是,+inf +inf => +inf和-inf + -inf => -inf,就像您可能推断的
- 再一次,在数学上这首先是可行的。至少,它会导致2*x/x=>1,这将更糟糕。但基本上:inf不是一个数字
- 不,他们没有;这是浮点 的预期行为。
- Float不换行;
超过最大值是无穷大
约2/3
无穷大不是一个数字。它也不像一个数字。
设a
为正整数(1,2,3,…)的个数,b
为偶整数(2,4,6,…)的个数,c
为奇数(1,3,5,…)的个数。很明显,a
, b
和c
都是无穷大的。
您可能会期望a - a = 0
,在本例中意味着infinity - infinity = 0
。但是,您也可以期望a - b = c
,因为c
是a
中的数字,而不是b
中的数字。然而,这给了我们infinity - infinity = infinity
.
通过正确构造你的无穷,你可以得到任何整数作为infinity - infinity
的答案。因此,给它一个合适的定义是没有意义的,所以我们让它是NaN
,或"Not a Number"。
除法也是一样,也就是第3点