为什么math.modf会返回浮点数?

end*_*ith 1 python floating-point integer modulo

来自http://docs.python.org/2/library/math.html:

math.frexp(x)的

返回尾数和x的指数作为对(m,e).m是一个浮点数,e是一个整数,使得x == m*2**e.如果x为零,则返回(0.0,0),否则0.5 <= abs(m)<1.这用于以便携方式"分离"浮点的内部表示.

math.modf(x)的

返回x的小数和整数部分.两个结果都带有x的符号并且是浮点数.

这个相关的问题中,它指出返回浮点数对于ceil和floor都没有意义,所以在Python 3中,它们被改为返回整数.是否有一些原因导致整数结果modf也不作为整数返回?在Python 2.7中:

In [2]: math.floor(5.5)
Out[2]: 5.0

In [3]: math.modf(5.5)
Out[3]: (0.5, 5.0)

In [4]: math.frexp(5.5)
Out[4]: (0.6875, 3)
Run Code Online (Sandbox Code Playgroud)

在Python 3中:

In [2]: math.floor(5.5)
Out[2]: 5

In [3]: math.modf(5.5)
Out[3]: (0.5, 5.0)

In [4]: math.frexp(5.5)
Out[4]: (0.6875, 3)
Run Code Online (Sandbox Code Playgroud)

Tim*_*ers 7

大多数math模块函数都是围绕C语言标准定义的同名函数的瘦包装器. frexp()并且modf()是两个这样的,并返回相同的东西,相同名称的C函数返回.

因此,部分原因是语言间操作的简便性.

但另一部分是实用性:

>>> from math import modf
>>> modf(1e100)
(0.0, 1e+100)
Run Code Online (Sandbox Code Playgroud)

你真的想把10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104作为"整数部分"吗?

C不可能这样做,因为它没有无界的整数.Python根本不想这样做;-)请注意,所有足够大小的浮点值都是精确整数 - 尽管它们可能需要数百个十进制数字来表示.