代码之家  ›  专栏  ›  技术社区  ›  Björn Pollex

为什么0除以0是一个错误?

  •  20
  • Björn Pollex  · 技术社区  · 14 年前

    我在代码中的一个计算中遇到了这个问题,如果divident也是0,那么除数就是0。在我的代码中,对于这种情况我返回0。我想知道,虽然除0通常是未定义的,为什么不为这种情况破例呢?我的理解是,为什么除数为零是没有定义的,基本上是因为它不能被颠倒。但是,在0/0的情况下我看不到这个问题。

    好吧,这个问题引发了很多讨论。我犯了一个错误,因为得到了很多选票,所以我过于急切地接受了一个答案。我现在接受了 AakashM's answer ,因为它提供了如何分析问题的思路。

    18 回复  |  直到 8 年前
        1
  •  58
  •   AakashM    14 年前

    这是数学而不是编程,但简而言之:

    • 从某种意义上说,给一个正无穷大的“值”赋值是合理的 some-strictly-positive-quantity / 0 ,因为界限很明确

    • 然而,限制 x / y 作为 x y 两者都趋向于零 . 例如, lim (x -> 0) 2x / x 显然是2 lim (x -> 0) x / 5x

        2
  •  76
  •   John Topley    14 年前

    比如说:

    0/0 = x
    

    现在,重新排列方程(两边乘以0)得到:

    x * 0 = 0
    

        3
  •  19
  •   Clair Crossupton    14 年前

    (灵感来源于托尼·布雷亚尔(Tony Breyal)对我自己的一篇文章的相当好的回答)

    零除以任何数字(零本身除外)即为零。更精确地说:

     0/n = 0      for all non-zero numbers n.
    

    当你试图除以0时,你就进入了一个棘手的领域。一个数除以0并不总是没有定义的。这取决于问题。我将给你们一个微积分的例子,其中数字0/0 已定义 .

    假设我们有两个函数,f(x)和g(x)。如果取它们的商f(x)/g(x),就得到另一个函数。我们称之为h(x)。

    也可以取函数的极限。例如,函数f(x)的极限值f(x)是当x接近2时函数最接近的值。我们将此限制写为:

     lim{x->2} f(x) 
    

    现在是我们的例子。让:

     f(x) = 2x - 2
     g(x) = x - 1
    

    考虑他们的商:

     h(x) = f(x)/g(x)
    

     lim{x->1} h(x) = lim{x->1} f(x) / g(x) 
                    = (lim{x->1} f(x)) / (lim{x->1} g(x))  
                    = (lim{x->1} 2x-2) / (lim{x->1} x-1)
                    =~ [2*(1) - 2] / [(1) - 1]  # informally speaking...
                    = 0 / 0 
                      (!!!)
    

    所以我们现在有:

     lim{x->1} h(x) = 0/0
    

    但我可以用另一个定理,叫做 医院的规则

    这是0的另一个奇怪之处。假设0/0遵循一个古老的代数规则,任何东西被它自己除都是1。然后你可以做以下证明:

     0/0 = 1
    

    现在将两边乘以任意数n。

     n * (0/0) = n * 1
    

    简化双方:

     (n*0)/0 = n 
     (0/0) = n 
    

    同样,假设0/0=1:

     1 = n 
    

    走回她在mathoverflow.com的家

        4
  •  5
  •   tovare    14 年前

    http://en.wikipedia.org/wiki/Division_by_zero

    (包括1=2:-)的证明)

    在编程中,通常通过使用if语句来获得应用程序所需的行为来处理这个问题。

        5
  •  4
  •   Tony Breyal    14 年前

    10 / n
    10 / 1 = 10
    10 / 0.1 = 100
    10 / 0.001 = 1,000
    10 / 0.0001 = 10,000
    Therefore: 10 / 0 = infinity (in the limit as n reaches 0)
    

    不稳定的 越来越多的人。

    否则,你可以用对数定律从数学上考虑,从而从方程中除法:

        log(0/0) = log(0) - log(0)
    

    但是

        log(0) = -infinity
    

    同样,问题是结果没有定义,因为它是一个概念,而不是一个你可以输入的数字。

    说了这么多,如果你对如何把一个不确定的形式变成一个确定的形式感兴趣,可以查一下l'Hopital法则,它实际上是这样说的:

    f(x) / g(x) = f'(x) / g'(x)
    

    希望能有点帮助,

    另外,使用日志规则通常是一种很好的计算方法,可以避免执行运算的问题,这些运算会导致数字非常小,如果给定机器的精度,浮点值与零是无法区分的。实际的编程例子是“最大可能性”,它通常必须利用日志来保持解的稳定性

        6
  •  3
  •   zvrba    14 年前

    反过来看除法:如果a/b=c,那么c*b=a。现在,如果你把a=b=0替换成c*0=0。但是任何乘以零的东西都等于零,所以结果可以是任何东西。您希望0/0为0,其他人可能希望它为1(例如,当x接近0时,sin(x)/x的极限值为1)。因此,最好的解决方案是不定义它并报告错误。

        7
  •  2
  •   Christian    14 年前

    现代数学的结构是由用公理来思考的数学家们设定的。 有额外的公理是没有成效的,不允许一个人做更多的事情,是反对有明确的数学理想。

        8
  •  2
  •   IanField90    14 年前

    你可以看看 Dr. James Anderson

        9
  •  1
  •   Will A    14 年前

    0变为0的次数是多少?5.是-5*0=0,11。是-11*0=0,43。是-43*0=0。也许你现在能明白为什么它没有定义了?:)

        10
  •  1
  •   Pontus Gagge    14 年前

    x/y=z x=yz ,以及任何 z 将满足 0=0z

        11
  •  1
  •   Florin    14 年前

    另一种解释是为什么 0/0 是指你可以写:

    0/0 = (4 - 4)/0 = 4/0 - 4/0
    

    4/0 未定义。

        12
  •  0
  •   user128300 user128300    14 年前

    如果a/b=c,那么a=b*c。

        13
  •  0
  •   Nighil    14 年前

    这只是一个逻辑答案,不是数学答案,

        14
  •  0
  •   Andrew Wang    12 年前

    0意味着什么都没有,所以如果你什么都没有,它并不意味着对任何东西要分配给任何东西。一些公交设施在列出某条线路的出行次数时,出行次数0通常是以不同方式路由的特殊线路。典型情况下,托兰斯运输系统就是一个很好的例子,其中2号线在第一次行程之前有一次行程,称为0号行程,仅在工作日运行,该行程尤其是0号行程,因为它是一条特殊路线,其路线与所有其他路线不同。

    http://transit.torrnet.com/PDF/Line-2_MAP.pdf http://transit.torrnet.com/PDF/Line-2_Time_PDF.pdf

    有时可以使用0来对一条被认为是“特快服务”路线的路线进行编号。

        15
  •  -1
  •   el.pescado - нет войне    14 年前

    案子?

    因为:

    • 没有定义0/0的应用程序-添加异常将使数学复杂化,但没有任何好处。
        16
  •  -1
  •   bluesmoon    14 年前

    我会这么做:

    function div(a, b) {
        if(b === 0 && a !== 0) {
            return undefined;
        }
        if(b === 0 && a === 0) {
            return Math.random;
        }
        return a/b;
    }
    
        17
  •  -1
  •   Benjamin W.    9 年前

    当你输入0除以0时,会有一个错误,因为无论你用0乘什么,它都是0,所以它可以是任何数字。

        18
  •  -7
  •   Peter Mortensen icecrime    14 年前

    任何除以零的东西都是无穷大。0/0也是无穷大。你不能得到0/0=1。这是数学的基本原理。整个世界就是这样运转的。但是你可以编辑一个程序说“0/0是不可能的”或者“不能被零除”,就像他们在手机里说的那样。

    推荐文章