2012-05-27 18 views

回答

109

math.fabs()將其參數轉換爲float(如果可以的話)(如果不能,則會引發異常)。然後它取絕對值,並將結果作爲浮點數返回。

除了漂浮物,abs()也可以使用整數和複數。它的返回類型取決於它的參數的類型。

In [7]: type(abs(-2)) 
Out[7]: int 

In [8]: type(abs(-2.0)) 
Out[8]: float 

In [9]: type(abs(3+4j)) 
Out[9]: float 

In [10]: type(math.fabs(-2)) 
Out[10]: float 

In [11]: type(math.fabs(-2.0)) 
Out[11]: float 

In [12]: type(math.fabs(3+4j)) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
/home/alexei/<ipython-input-12-8368761369da> in <module>() 
----> 1 type(math.fabs(3+4j)) 

TypeError: can't convert complex to float 
+3

'abs'的作用遠不止是整數和浮點數,結果類型是__not__總是與參數相同,例如'abs(3 + 4j)'。 – agf

+1

在關於'fabs'的評論中增加了一個更長的時間,因爲它總是處於浮動狀態並且你有正確的答案! –

+0

@agf:謝謝你提醒我複雜的數字。的興趣,其他類別的東西可以'__builtin __。ab s()'成功應用於? – NPE

1

math.fabs()總是返回浮動,而abs()可能返回整數。

+6

'abs'的用戶定義類都可以返回任何類型,具體取決於調用類型的__abs__'特殊方法。 – agf

8

編輯:作爲@aix建議,更好(更公平)的方式來比較的速度差:

In [1]: %timeit abs(5) 
10000000 loops, best of 3: 86.5 ns per loop 

In [2]: from math import fabs 

In [3]: %timeit fabs(5) 
10000000 loops, best of 3: 115 ns per loop 

In [4]: %timeit abs(-5) 
10000000 loops, best of 3: 88.3 ns per loop 

In [5]: %timeit fabs(-5) 
10000000 loops, best of 3: 114 ns per loop 

In [6]: %timeit abs(5.0) 
10000000 loops, best of 3: 92.5 ns per loop 

In [7]: %timeit fabs(5.0) 
10000000 loops, best of 3: 93.2 ns per loop 

In [8]: %timeit abs(-5.0) 
10000000 loops, best of 3: 91.8 ns per loop 

In [9]: %timeit fabs(-5.0) 
10000000 loops, best of 3: 91 ns per loop 

如此看來abs()只有在fabs()的整數輕微的速度優勢。對於浮標,abs()fabs()表現出相似的速度。


除了什麼@aix說,多一個要考慮的就是速度差:

In [1]: %timeit abs(-5) 
10000000 loops, best of 3: 102 ns per loop 

In [2]: import math 

In [3]: %timeit math.fabs(-5) 
10000000 loops, best of 3: 194 ns per loop 

所以abs()math.fabs()更快。

+3

你沒有比較蘋果和蘋果。確實使用'從數學進口工廠',並嘗試'-5.0'。 – agf

+0

@agf感謝您指出!那真是愚蠢。 –

+0

也不可靠的時間結果?你首先在102ns有abs(-5),然後再顯示爲88.3ns。決不要從任何基準的單次運行中得出結論,即使它在內部儘量避免這些問題。 –

0

abs(): 根據參數返回絕對值,即如果參數是int,則返回int,如果參數爲float,則返回float。 而且它適用於複雜的變量也即abs(a+bj)也適用,並返回絕對值即 「math.sqrt(((A)** 2)+((B)** 2)」

math.abs(): 它只能在整數或浮點值上總是返回絕對浮點值

相關問題