为啥 -1/2 在 C++ 中计算为 0,但在 Python 中计算为 -1?
Posted
技术标签:
【中文标题】为啥 -1/2 在 C++ 中计算为 0,但在 Python 中计算为 -1?【英文标题】:Why is -1/2 evaluated to 0 in C++, but -1 in Python?为什么 -1/2 在 C++ 中计算为 0,但在 Python 中计算为 -1? 【发布时间】:2014-02-26 02:14:16 【问题描述】: C++:cout << -1/2
计算结果为 0
Python:-1/2
的计算结果为 -1
。
为什么会这样?
【问题讨论】:
什么版本的 Python? Python 2 和 Python 3 中的整数除法不同。 【参考方案1】:C++ 中的整数除法向 0 舍入,而在 Python 中,它向 -infinity 舍入。
抽象地处理这些事情的人倾向于认为向负无穷取整更有意义(这意味着它与数学中定义的模函数兼容,而不是 %
有一些有趣的含义)。编程语言的传统是向 0 舍入——这最初不是在 C++ 中定义的(按照当时 C 的示例),但最终 C++(和 C)以这种方式定义它,复制 Fortran。
【讨论】:
“传统”可能是由于在流行的计算机上实现整数除法的方式。 APL(一种编程语言)于 1960 年首次发布,它的模运算符就像整数除法向负无穷大舍入一样(余数的符号与除数(或零)的符号相同,而不是被除数) . 对于不熟悉 APL 的任何人,请查看 en.wikipedia.org/wiki/APL_%28programming_language%29 -- 我会包含一些很酷的 sn-ps,但不幸的是,我需要向您展示的字符不在正常部分unicode 和大多数计算机都会出错【参考方案2】:来自 Python 文档(重点是我的):
/(除法)和 //(下除法)运算符产生其参数的商。数字参数首先转换为通用类型。普通或长整数除法产生相同类型的整数; 结果是数学除法,结果应用了“floor”函数。
地板函数四舍五入到最接近负无穷大的数字,因此是-1。
【讨论】:
可能想要具体说明哪些文档,因为 OP 要求区分两种语言。 这是从 Python 2 更改为 Python 3 的,对吗? @chris,引用的文本适用于 Python 2,其中/
和 //
对整数执行相同的操作。在 Python 3 中,some_int/another_int
如果结果为非整数,则返回一个浮点数。
引用了哪些文档?对于 Python 2 还是 Python 3?
@PeterMortensen Lol,这是我 8 年前写的。老实说,我不记得了。【参考方案3】:
对于 C++,来自此参考:5.2 — Arithmetic operators
最容易将除法运算符视为有两个 不同的“模式”。如果两个操作数都是整数,则除法 运算符执行整数除法。 整数除法丢弃任何 分数并返回一个整数值。
因此,-1/2
将产生-0.5
,其中的分数丢弃,产生0
。
作为SethMMorton indicated,Python 的规则是floor
,产生-1
。 5. Expressions 中对此进行了描述。
代入Mike Graham mentioned、floor
是一个向负无穷大的圆。删除分数是向零的一轮。
【讨论】:
【参考方案4】:我不确定 Python,但在 C++ 中整数/整数 = 整数,因此在 -1/2 的情况下是 -0.5,它会自动四舍五入为整数,因此您会得到 0 的答案。
如果是 Python,可能系统使用 floor 函数将结果转换为整数。
【讨论】:
以上是关于为啥 -1/2 在 C++ 中计算为 0,但在 Python 中计算为 -1?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 c++ 代码在 Linux 中可以正常工作,但在 Windows 中却不能[关闭]
为啥 C# 数组在 Android 上运行时通过 ref 从 C# 传递到 C++ 库后变为长度 1 但在 Windows 上正常工作?
为啥“someString”== 0 在 PHP 中评估为 true [重复]