python如何表示非负整数,python 除法向上取整
这一系列文章翻译自Python之父美丽的Lori van Rossum的博客系列“Python的历史”。这个博客系列对我们理解Python及其演化非常有帮助。经美丽萝莉同意,在此翻译推荐。希望大家喜欢,也请给我们评价!
连续地址:blog.kantli.com/theme/1 1区3358号
今天又有人问我,为什么Python中的整数除法是向下取整,而不是像C语言那样用0取整?
对于正整数,两种舍入方法的结果是相同的:
如果其中一个为负,结果不是趋近于零(而是趋近于负无穷大):
这个问题困扰了一些人,但其实有数学上的考虑。除法运算(//)和模运算(%)是实现一个数学关系的组合(所有变量都是整数):
# a/b=q r是
# b*q r=a,其中0=r b当a为负(b保持正)时,我们有两种选择:一种是将q四舍五入为零,这样余数r就会变成负,即0=ABS(r)b;另一种是将q四舍五入到负无穷大,余数的设置不变。
数学家总是倾向于后一种选择。(参考维基百科https://zh.wikipedia.org/wiki/模块分部)
在Python中,我也选择了后一种方案,因为在实际应用中,有些情况下A可能既是正的也是负的。
以POSIX时间戳(1970年以来的秒数)为例。如果要得到当前的具体时间,由于每天的时间是24 * 3600=86400秒,我们只需要直接取模数t% 86400即可。如果时间戳为负,即1970年之前,为了得到正确的结果,只能向下取整,而不能取整为零。
我能想到的另一个例子是像点的计算。我相信还有很多其他的例子。
对了,如果b取负数,整个方程反过来:0=r b。
2.那么,C语言为什么要采用四舍五入到零呢?可能是因为当时的硬件设计是3354。在最早的硬件中,负数的表达方式是“符号数”,而不是常用的补数(至少对于整数是这样)。
我用的第一台电脑是CDC主机,它的整数和浮点数用补码表示,60个1代表负零。
Fndzxc Peters担心我会把这个原理扩展到浮点数。也许他是对的。当x是一个很小的负数时,向下舍入原理会导致x% 1.0的精度损失。但是这个问题不影响我让整数采用向下舍入原则。
PS。请注意,我使用的符号是//而不是/,这是Python 3中的语法,在Python 2中也可以使用,表示用户明确使用整除而不是除号。Python 2中的/操作可能有歧义,因为当两个参数都是整数时,它只返回整数,而当浮点参数存在时,它返回浮点数。但这是后话。请参考人教版238。
微信官方账号:ReadingPython
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。