2013-10-11 32 views
1

http://docs.python.org/2/library/math.html從:爲什麼math.modf返回浮動?

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 的符號,並且浮標爲

this related question,它指出,返回浮動並沒有真正意義上的小區和地板,所以在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) 
+0

你想要使用它的大多數地方你可能想要一個浮動。 (雖然在3.x中,現在int/int返回浮點數,但它可能並不重要。)你的用例是什麼? – abarnert

回答

7

大多數math模塊的功能是圍繞由C語言標準中定義的相同名稱的功能薄包裝。 frexp()modf()是兩個這樣的,並且返回相同名稱的C函數返回的東西。

因此,這部分是語言間操作的簡化。

但另一部分是實用性:

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

你真的想要得到10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104回爲「整數部分」?

C不可能這樣做,因爲它沒有無限的整數。 Python根本就沒有想要這麼做;-)請注意,全部足夠大小的浮點值是精確整數 - 儘管它們可能需要數百個小數位來表示。

+1

+1。我希望我們仍然從'math.floor'和'math.ceil'返回花車。 –

+0

@MarkDickinson,ack!我沒有意識到(剛開始使用Py3)。那是怎麼發生的?!我看到Guido也沒有改變浮動'%'(例如'-1%1e20'仍然是'1e20')。我應該怪你嗎?大聲笑;-) –

+0

'int(floor(100000000000000000000000))'產生'100000000000000000000000'比產生'99999999999999991611392'更有意義嗎? – endolith