【发布时间】:2022-01-16 14:07:32
【问题描述】:
我知道 Python // 向负无穷大舍入,而在 C++ 中 / 正在截断,向 0 舍入。
这是我目前所知道的:
|remainder|
-12 / 10 = -1, - 2 // C++
-12 // 10 = -2, + 8 # Python
12 / -10 = -1, 2 // C++
12 // -10 = -2, - 8 # Python
12 / 10 = 1, 2 // Both
12 // 10 = 1, 2
-12 / -10 = 1, - 2 // Both
= 2, + 8
C++:
1. m%(-n) == m%n
2. -m%n == -(m%n)
3. (m/n)*n + m%n == m
Python:
1. m%(-n) == -8 == -(-m%n)
2. (m//n)*n + m%n == m
但是为什么 Python // 选择向负无穷取整呢?我没有找到任何资源来解释这一点,但只是找到并听到人们含糊地说:“出于数学原因”。
例如,在Why is -1/2 evaluated to 0 in C++, but -1 in Python?:
抽象地处理这些事情的人倾向于认为 向负无穷四舍五入更有意义(这意味着它 与数学中定义的模函数兼容,而不是 比 % 有点有趣的意思)。
但我看不到 C++ 的 / 与模函数不兼容。在 C++ 中,(m/n)*n + m%n == m 也适用。
那么 Python 选择向负无穷取整的(数学)原因是什么?
【问题讨论】:
-
请注意,
%运算符在 C++ 和 Python 中相当相同:在 C++ 中,它是一个 remainder 运算符,但在Python,它是一个 modulus 运算符。 Nice answer explaining the difference. -
虽然
(m/n)*n + m%n == m规则适用,但m%n的可能输出是[-n+1,n-1],它是[0,n-1]的两倍。而且对于多种用途来说非常不方便。相反,他们选择了符号不变性......它也有它的好处。一般而言,问题在于人们希望从四舍五入中获得多个属性,但并非所有属性都可以同时实现 - 所以他们会选择自己喜欢的。 -
@user438383:我将您的编辑修改为标题,该标题表示将 to 舍入为负无穷而不是 toward。这将是一个关于某些输入产生实际 -Inf 作为某种结果的问题,但这里不是这种情况。
标签: python c++ python-3.x rounding integer-division