【问题标题】:Integer division by negative number [duplicate]整数除以负数[重复]
【发布时间】:2013-10-31 07:45:35
【问题描述】:

整数除法 -1 / 5 应该返回什么?我完全被这种行为搞糊涂了。我认为在数学上它应该是 0,但是 python 和 ruby​​ 返回 -1。

为什么不同的语言在这里表现不同?请有人解释。谢谢。

| Language  | Code           | Result |
|-----------+----------------+--------|
| ruby      | -1 / 5         |     -1 |
| python    | -1 / 5         |     -1 |
| c         | -1 / 5         |      0 |
| clojure   | (int (/ -1 5)) |      0 |
| emacslisp | (/ -1 5)       |      0 |
| bash      | expr -1 / 5    |      0 |

【问题讨论】:

  • 对不起,我的意思是 -1 而不是 1。我不知道答案,我感到很困惑。
  • 没有答案。 “整数除法”不是一个定义明确的概念,每种语言的规范都可以选择向下取整或向 0 截断作为其定义的运算结果。
  • 来吧,问题很明确:“整数除法 -1 / 5 应该返回什么?”这篇文章的其余部分只是这个问题的理由或动机。只需稍加解释,我就可以将问题理解为“为什么不同的语言在这里表现不同?”这是一个很好的问题。无需关闭此帖子。
  • @Wooble 这实际上是一个很好的答案。
  • 各种语言都有many Questions about rounding and integer division,通常着眼于通过“向上取整”来克服“向下取整”行为。其中许多方法将有助于理解四舍五入对负数的作用。

标签: python ruby math


【解决方案1】:

整数除法是特定于实现的。来自维基百科的Modulo operation

许多实现使用截断除法,其中商由truncation q = trunc(a/n i>),换句话说,它是从精确有理商到 0 方向的第一个整数,余数为 r=a - n q。通俗地说,商“向零舍入”,因此余数与被除数的符号相同。

Knuth 描述了 floored 除法,其中商由 floor function q=floor(a/n 定义),余数 r

这里的商总是向下舍入(即使它已经是负数),余数与除数的符号相同。

【讨论】:

    【解决方案2】:

    简短回答: 语言设计者可以选择在进行整数除法时,他们的语言是向零舍入、负无穷大还是正无穷大。不同的语言做出了不同的选择。

    长答案: Python 和 Ruby 的语言作者都认为向负无穷大舍入比向零舍入更有意义(就像 C 一样)。 python 的创建者写了一篇关于他的推理的博客文章here。我在下面摘录了大部分内容。

    今天我被要求(再次)解释为什么 Python 中的整数除法返回结果的下限,而不是像 C 那样截断为零。

    对于正数,这不足为奇:

    >>> 5//2
    2
    

    但如果其中一个操作数为负数,则结果为下限,即从零四舍五入(向负无穷大):

    >>> -5//2
    -3
    >>> 5//-2
    -3
    

    这让一些人感到不安,但有一个很好的数学原因。 整数除法运算 (//) 及其兄弟,模 运算(%),一起去满足一个很好的数学 关系(所有变量都是整数):

    a/b = q with remainder r
    

    这样

    b*q + r = a and 0 <= r < b
    (assuming a and b are >= 0).
    

    如果您希望关系扩展为负 a(保留 b 正),你有两个选择:如果你将 q 截断为零,r 将变为负数,因此不变量变为 0

    在数学数论中,数学家总是更喜欢后者 选择(参见例如Wikipedia)。对于 Python,我做出了同样的选择 因为模数有一些有趣的应用 a 的符号无意义的操作。考虑采取 POSIX 时间戳(自 1970 年初以来的秒数)并将其转换为 一天中的时间。由于一天有 24*3600 = 86400 秒, 这个计算只是 t % 86400。但是如果我们要表达时间 1970 年之前使用负数,“向零截断”规则 会给出一个毫无意义的结果!使用底线规则一切都解决了 很好。

    【讨论】:

    • 但是,当除数为负时,结果不是我所期望的。例如。 5 // -2 给出商 -3 和余数 -1。我认为商-2 和余数1 会更有意义(所以我们总是有0 &lt;= r &lt; abs(b),当然还有a = b*q+r
    • @MarcusJuniusBrutus 那你更喜欢欧几里得除法。
    猜你喜欢
    • 2019-06-20
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多