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

时间:2013-10-11 23:50:41

标签: 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)<0。这用于以便携方式“分离”浮动的内部表示。

     

math.modf(x)的

     

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

this related question中,它指出返回浮点数对于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)

在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)

1 个答案:

答案 0 :(得分:7)

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

因此,部分原因是语言间操作的简易性。

但另一部分是实用性:

>>> from math import modf
>>> modf(1e100)
(0.0, 1e+100)

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

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