【问题标题】:How different programming languages handle division by 0?不同的编程语言如何处理除以 0?
【发布时间】:2010-03-05 17:58:04
【问题描述】:

也许这是一个错误的问题,但我很好奇。我知道当被要求除以 0 时,许多语言会简单地爆炸并失败,但是有没有任何编程语言可以智能地处理这个不可能的总和 - 如果是这样,它们会做什么?他们是继续处理,将 350/0 视为 350,还是停止执行,还是什么?

【问题讨论】:

  • 您问的是语言还是语言实现?并非所有语言都规定了确切的行为,因此它因实现而异。
  • 询问每种不同的语言如何处理该场景。我得到了一些有趣的答案,只是好奇每种语言的作用。
  • 我投票结束这个问题,因为虽然这是一个有趣的问题,但它不适合 Stack Overflow。 help center 声明:“您应该只根据您所面临的实际问题提出实用的、可回答的问题。喋喋不休的开放式问题会降低我们网站的实用性,并将其他问题推到首页之外。”这感觉就像它完全属于这一类。

标签: division divide-by-zero


【解决方案1】:

当您在 IEEE 浮点上下文中除以零时,鲜为人知的 Java programming language 会给出特殊常量 Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY(取决于分子)。整数除以零是未定义的,会导致ArithmeticException 被抛出,这与您的“爆炸和失败”场景完全不同。

【讨论】:

  • 如何将无穷大加倍?那不就是给你无限吗?白痴想知道!
  • 另外,如果你将非数字加倍,它是否会成为数字?
  • @T.E.D 实际上,一些无穷大比其他无穷大,因为它们扩展的速度,例如。 SUM(1..n) 是比 SUM(1^2...n^2) 更小的无穷大,因为 n 接近无穷大(这与数学的极限有关)
【解决方案2】:

INTERCAL 标准库在除以零时返回 #0

【讨论】:

    【解决方案3】:

    在 Java 中,浮点上下文中除以零会产生特殊值 Double.POSITIVE_INFINITYDouble.NEGATIVE_INFINITY

    【讨论】:

    • Double.NaN,如果您将零除以零。
    【解决方案4】:

    来自Wikipedia

    扩展实数线的无穷大可以用 IEEE 浮点数据类型表示,就像 1、1.5 等普通浮点值一样。它们在任何方面都不是错误值,尽管它们经常(但并非总是如此,因为它取决于四舍五入)在溢出时用作替换值。在除以零异常时,将返回正无穷或负无穷作为精确结果。

    【讨论】:

      【解决方案5】:

      如果您执行 350/0,如果任何语言返回 350,我会感到惊讶。只是两个例子,但是 Java 抛出了一个可以被捕获的异常。 C/C++ 只是崩溃(我认为它会抛出一个可能被捕获的信号)。

      【讨论】:

      • 有两种不同的语言,称为 C 和 C++,我认为它们的标准中没有任何具体规定。一种或两种语言的某些实现可能会发出信号。
      【解决方案6】:

      在 Delphi 中,它要么抛出编译时错误(如果除以 0 值 const),要么抛出可捕获的运行时错误(如果它发生在运行时)。

      C 和 C++ 也是如此。

      在 PHP 中你会得到一个警告:

      警告:除以零 X

      所以,在 PHP 中,对于类似的东西:

      $i = 123 / 0;
      

      $i 将被设置为空。 但是 $i 不是 === NULL 并且 isset($i) 返回 true 而 is_string($i) 返回 false。

      【讨论】:

      • 如果只收到警告,表达式会返回什么?
      • 更新了更多信息的答案。
      【解决方案7】:

      Python(至少版本 2,我没有 3)抛出 ZeroDivisionError,可以被捕获。

      num = 42
      try:
          for divisor in (1,0):
              ans = num / divisor
              print ans
      except ZeroDivisionError:
          print "Trying to divide by 0!"
      

      打印出来:

      42
      Trying to divide by 0!
      

      【讨论】:

      • 3.1 版仍然会引发 ZeroDivisionError。
      【解决方案8】:
      【解决方案9】:

      浮点数根据 IEEE 定义的常量 NaN 等。任何涉及 thst 值的持续操作将保持不变,直到结束。整数或整数不同,抛出异常......在java中......

      【讨论】:

        【解决方案10】:

        小马除以 0 为 0,但我还没有找到 0/0 为 1 的语言

        【讨论】:

          【解决方案11】:

          我正在使用多面体并尝试选择一种喜欢 inf 的语言。 多面体 {a,b} 的总边数,其中 a 是每个多边形的边,b 是每个角的边 E = 1/(1/a + 1/b - 1/2)

          如果 E 为负,则为负曲率,但如果 E 为无穷大 (1/0),则将平面平铺。示例:{3,6} {4,4}

          【讨论】:

          • 您能否告诉我们这如何回答 OP 的问题?
          • 这是一个使用无穷大的例子。我想我评论错了。
          • @RobertHayes 欢迎来到 SO!这是一个问答库,而不是论坛。没有线程,答案也不是 cmets。您可能想使用tour 并阅读How do I write a good answer?
          猜你喜欢
          • 1970-01-01
          • 2018-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多