这篇文章系列翻译自Python的父亲Guido van Rossum的系列博客“The History of Python”。这个博客系列对理解Python及其进化非常有帮助。经Guido同意,推荐在这里翻译。希望大家喜欢。请多多指导。(大卫亚设)。
系列地址:
1
今天又有人问我,为什么python的整数除法不像c语言一样四舍五入成0?
对于正整数,两种舍入方法的结果是相同的:
5//2
2
如果其中一个为负,则结果不接近于0(接近于负无穷大)。
-5/2
-3
5//-2
-3
这个问题困扰着一些人,但实际上有数学考虑。除法操作(//)和除法操作(%)是一起实现数学关系的组合(所有变量都是整数)。
# a/b=q剩馀的r
也就是说,
# b*q r=a,其中0=r b
如果a为负数(B保持正数),则有两个选项。一个将Q舍入为0,剩下的R变成负值,即0=ABS (R) B。另一个是,如果将Q舍入到负无穷大,则其馀设置将保持不变。
数学家们总是倾向于后一种选择。(见维基百科)
在Python,我们选择了后一种方案。因为在实际应用中,A可以是正数,也可以是负数。
以POSIX时间戳(1970年后的秒)为例,因为每天24 * 3600=86400秒,所以只需要t% 86400。如果时间戳为负数(即,要在1970年之前获得正确的结果),则只能舍入到非零以下。
我能想到的另一个例子是图像点的计算。而且我确信还有很多其他的例子。
顺便说一下,如果B取负数,整个等式就会反转。0=r b。
2
那么,c语言为什么采用零舍入?可能是因为当时的硬件设计——在最古老的硬件中,负数被表示为“符号数字”,而不是现在常用的补充代码(至少整数是)。
我用的第一台电脑是CDC主机。整数和浮点数均以补码表示,60个1为负0。
Tim Peters担心我会把这个原则扩展到浮点数上。他可能是对的。当x为非常小的负数时,向下的原则会导致x% 1.0的精度损失。但是,这个问题并不影响让整数采用下调原则。
PS。我使用的符号不是/,而是//。这是python 3的语法。也可以在python 2中使用。这意味着用户明确使用除法而不是除法。Python 2的/操作可能不明确,因为如果两个参数都是整数,则仅返回整数;如果有浮点参数,则返回浮点数。但这是另一个故事。可以参考PEP 238。
公众号:ReadingPython
相关攻略
- 1 【盛大私有化】盛大游戏退市:本月末完成私有化摘录纳斯达克。
- 2 【合拍贷】合作贷款和湖北隆宝担保有限公司达成了战略合作协议。
- 3 【奇酷官网】安全低价销售360奇库手机旗舰版官网
- 4 【简志霖】疑似华为6名员工泄露的调查企业因员工流失而被撕裂的10大著名事件。
- 5 【雅虎博客】雅虎推出即时消息新方式雅虎Livetext
- 6 【雅虎口碑】沉默4年后,阿里和蚂蚁金融投资60亿口碑网“满血”死灰复燃。
- 7 【湖北移动网站】湖北移动:信息诈骗割黑手联合治疗
- 8 【真纯姐】小说:我能把我拥有的一切给你,包括我在内。
- 9 【糗事百科网】GIF列表:请给我拿一个。好吧。拜托。
- 10 【微博收购一直播】家庭教师月薪5万韩元;李自治队被抓了吗?网红柴犬二次拍卖;陕西生三个孩子将被授予半年歌。
-
扫码下载安卓APP
-
微信扫一扫关注我们微信扫一扫打开小程序手Q扫一扫打开小程序
-
返回顶部