C# 除以零:整数与浮点

C# 除以零:整数与浮点,c#,java,python,vb.net,math,C#,Java,Python,Vb.net,Math,将int除以零将引发异常,但浮点不会——至少在Java中是这样。为什么浮点有附加的NaN信息,而int类型没有?浮点的表示被设计为有一些特殊的位组合保留以存储,如NaN、无穷大等 int类型没有未使用的表示形式-每个位模式对应一个整数。这有很多好处: 整数类型的范围尽可能大-不会浪费位模式 整数的表示很容易理解,因为没有特殊情况 即使在非常简单的处理器上,整数运算也可以以极高的速度完成 浮点数的表示被设计为有一些特殊的保留位组合来存储,如NaN、infinity等 int类型没有未使用的表示形

将int除以零将引发异常,但浮点不会——至少在Java中是这样。为什么浮点有附加的NaN信息,而int类型没有?

浮点的表示被设计为有一些特殊的位组合保留以存储,如NaN、无穷大等

int类型没有未使用的表示形式-每个位模式对应一个整数。这有很多好处:

  • 整数类型的范围尽可能大-不会浪费位模式
  • 整数的表示很容易理解,因为没有特殊情况
  • 即使在非常简单的处理器上,整数运算也可以以极高的速度完成

浮点数的表示被设计为有一些特殊的保留位组合来存储,如NaN、infinity等

int类型没有未使用的表示形式-每个位模式对应一个整数。这有很多好处:

  • 整数类型的范围尽可能大-不会浪费位模式
  • 整数的表示很容易理解,因为没有特殊情况
  • 即使在非常简单的处理器上,整数运算也可以以极高的速度完成

    • 这里给出了有关浮点运算的清晰解释


      这里给出了有关浮点运算的清晰解释


      基本上,这完全是一个武断的决定

      传统的
      int
      尝试使用所有位来表示可能的数字,而标准为
      NaN
      保留一个特殊值


      标准可以更改为
      int
      s,以包含特殊值,但操作效率较低。开发人员通常期望
      int
      操作非常有效,而使用浮点数的操作(纯粹是心理上的)被允许更慢。

      基本上,这是一个纯粹的任意决定

      传统的
      int
      尝试使用所有位来表示可能的数字,而标准为
      NaN
      保留一个特殊值


      标准可以更改为
      int
      s,以包含特殊值,但操作效率较低。开发人员通常期望
      int
      操作非常有效,而使用浮点数的操作(纯粹从心理上)可以更慢。

      int和float在机器内部的表示方式不同。整数通常使用有符号的2的补码表示,即(本质上)以基数2写出的数字。另一方面,浮动使用更复杂的表示,可以容纳更大和更小的值。但是,机器为浮点保留了几个特殊的位模式,以表示数字以外的内容。例如,NaN和正无穷大或负无穷大都有值。这意味着,如果你将一个浮点除以零,那么计算机可以使用一系列位来编码你除以零的结果。对于整数,所有的位模式都用于编码数字,因此计算机无法使用有意义的位序列来表示错误


      不过,这不是int的基本属性。从理论上讲,我们可以通过返回一些NaN变量来生成一个整数表示,它可以处理零除运算。这与实际操作不同。

      整数和浮点在机器内部的表示方式不同。整数通常使用有符号的2的补码表示,即(本质上)以基数2写出的数字。另一方面,浮动使用更复杂的表示,可以容纳更大和更小的值。但是,机器为浮点保留了几个特殊的位模式,以表示数字以外的内容。例如,NaN和正无穷大或负无穷大都有值。这意味着,如果你将一个浮点除以零,那么计算机可以使用一系列位来编码你除以零的结果。对于整数,所有的位模式都用于编码数字,因此计算机无法使用有意义的位序列来表示错误


      不过,这不是int的基本属性。从理论上讲,我们可以通过返回一些NaN变量来生成一个整数表示,它可以处理零除运算。这并不是在实践中所做的。

      Java反映了大多数CPU的实现方式。整数被零除会导致x86/x64上的中断,浮点被零除会导致无穷大、负无穷大或NaN。注意:使用浮点,也可以除以负零:Java反映了大多数CPU的实现方式。整数被零除会导致x86/x64上的中断,浮点被零除会导致无穷大、负无穷大或NaN。注意:使用浮点,也可以除以负零:我认为真正的原因,这个问题的根源,是众所周知的事实:计算机把所有东西都存储在0和1中

      它与整数、浮点数和零除法有什么关系?这很简单。如果只有0和1,那么很容易将它们组合成整数,就像十进制数字一样。所以“10”变成2,“11”变成3,依此类推。这种整数表示是如此自然,以至于没有人会想到为整数发明任何其他东西,它只会使CPU更加复杂,事情更加混乱。唯一需要的“发明”是找出如何存储负数,但如果你从x+(-x)应该始终等于零这一点开始,而不使用任何特殊的加法,这也是非常自然和简单的。这就是为什么11111111对于8位整数是-1的原因,因为如果你给它加上1,它会变成100000000,然后第8位会因为溢出而被截断