Suche…


Rundung: rund, Boden, Decke, Rumpf

Zusätzlich zu den integrierten in round Funktion, die math - Modul bietet den floor , ceil und trunc Funktionen.

x = 1.55
y = -1.55

# round to the nearest integer
round(x)       #  2
round(y)       # -2

# the second argument gives how many decimal places to round to (defaults to 0)
round(x, 1)    #  1.6
round(y, 1)    # -1.6

# math is a module so import it first, then use it.
import math

# get the largest integer less than x
math.floor(x)  #  1
math.floor(y)  # -2

# get the smallest integer greater than x
math.ceil(x)   #  2
math.ceil(y)   # -1

# drop fractional part of x
math.trunc(x)  #  1, equivalent to math.floor for positive numbers
math.trunc(y)  # -1, equivalent to math.ceil for negative numbers
Python 2.x 2.7

floor , ceil , trunc und round immer einen float .

round(1.3)  # 1.0

round bricht immer Krawatten von Null.

round(0.5)  # 1.0
round(1.5)  # 2.0
Python 3.x 3.0

floor , ceil und trunc immer einen Integral , während round einen Integral zurückgibt, wenn sie mit einem Argument aufgerufen werden.

round(1.3)      # 1
round(1.33, 1)  # 1.3

round bricht Gleichungen zur nächsten geraden Zahl. Dies korrigiert die Tendenz zu größeren Zahlen, wenn eine große Anzahl von Berechnungen ausgeführt wird.

round(0.5)  # 0
round(1.5)  # 2

Warnung!

Wie bei jeder Gleitkommadarstellung können einige Brüche nicht genau dargestellt werden . Dies kann zu unerwartetem Rundungsverhalten führen.

round(2.675, 2)  # 2.67, not 2.68!

Warnung vor der Boden-, Abbruch- und Ganzzahlteilung negativer Zahlen

Python (und C ++ und Java) runden bei negativen Zahlen von Null ab. Erwägen:

>>> math.floor(-1.7)
-2.0
>>> -5 // 2
-3

Logarithmen

math.log(x) gibt den natürlichen Logarithmus (Basis e ) von x .

math.log(math.e)  # 1.0
math.log(1)       # 0.0
math.log(100)     # 4.605170185988092

math.log kann aufgrund von Beschränkungen der Fließkommazahlen mit Zahlen nahe 1 Genauigkeit verlieren. Um Logs nahe 1 zu berechnen, verwenden Sie math.log1p , die den natürlichen Logarithmus von 1 plus das Argument auswertet:

math.log(1 + 1e-20)  # 0.0
math.log1p(1e-20)    # 1e-20

math.log10 kann für Logs Base 10 verwendet werden:

math.log10(10)  # 1.0
Python 2.x 2.3.0

Bei Verwendung mit zwei Argumenten gibt math.log(x, base) den Logarithmus von x in der angegebenen base (dh log(x) / log(base) .

math.log(100, 10) # 2.0
math.log(27, 3)   # 3.0
math.log(1, 10)   # 0.0

Zeichen kopieren

In Python 2.6 und höher gibt math.copysign(x, y) x mit dem Zeichen von y . Der zurückgegebene Wert ist immer ein float .

Python 2.x 2.6
math.copysign(-2, 3)    # 2.0
math.copysign(3, -3)    # -3.0
math.copysign(4, 14.2)  # 4.0
math.copysign(1, -0.0)  # -1.0, on a platform which supports signed zero

Trigonometrie

Länge der Hypotenuse berechnen

math.hypot(2, 4) # Just a shorthand for SquareRoot(2**2 + 4**2)
# Out: 4.47213595499958

Grad in Radiant umrechnen

Alle math Funktionen erwarten Radiant, daher müssen Sie Grad in Radiant konvertieren:

math.radians(45)              # Convert 45 degrees to radians
# Out: 0.7853981633974483

Alle Ergebnisse der inversen trigonometischen Funktionen geben das Ergebnis im Bogenmaß zurück, daher müssen Sie es möglicherweise in Grad umrechnen.

math.degrees(math.asin(1))    # Convert the result of asin to degrees
# Out: 90.0

Sinus-, Cosinus-, Tangenten- und Umkehrfunktionen

# Sine and arc sine
math.sin(math.pi / 2)
# Out: 1.0
math.sin(math.radians(90))   # Sine of 90 degrees
# Out: 1.0

math.asin(1)
# Out: 1.5707963267948966    # "= pi / 2"
math.asin(1) / math.pi
# Out: 0.5

# Cosine and arc cosine:
math.cos(math.pi / 2)
# Out: 6.123233995736766e-17 
# Almost zero but not exactly because "pi" is a float with limited precision!

math.acos(1)
# Out: 0.0

# Tangent and arc tangent:
math.tan(math.pi/2)
# Out: 1.633123935319537e+16 
# Very large but not exactly "Inf" because "pi" is a float with limited precision
Python 3.x 3.5
math.atan(math.inf)
# Out: 1.5707963267948966 # This is just "pi / 2"
math.atan(float('inf'))
# Out: 1.5707963267948966 # This is just "pi / 2"

Neben dem math.atan gibt es auch eine math.atan2 Funktion mit zwei Argumenten, die den korrekten Quadranten berechnet und Fallstricke der Division durch Null vermeidet:

math.atan2(1, 2)   # Equivalent to "math.atan(1/2)"
# Out: 0.4636476090008061 # ≈ 26.57 degrees, 1st quadrant

math.atan2(-1, -2) # Not equal to "math.atan(-1/-2)" == "math.atan(1/2)"
# Out: -2.677945044588987 # ≈ -153.43 degrees (or 206.57 degrees), 3rd quadrant

math.atan2(1, 0)   # math.atan(1/0) would raise ZeroDivisionError
# Out: 1.5707963267948966 # This is just "pi / 2"

Hyperbolischer Sinus, Cosinus und Tangens

# Hyperbolic sine function
math.sinh(math.pi) # = 11.548739357257746
math.asinh(1)      # = 0.8813735870195429

# Hyperbolic cosine function
math.cosh(math.pi) # = 11.591953275521519
math.acosh(1)      # = 0.0

# Hyperbolic tangent function
math.tanh(math.pi) # = 0.99627207622075
math.atanh(0.5)    # = 0.5493061443340549

Konstanten

math enthalten zwei häufig verwendete mathematische Konstanten.

  • math.pi - Die mathematische Konstante pi
  • math.e - Die mathematische Konstante e (Basis des natürlichen Logarithmus)
>>> from math import pi, e
>>> pi
3.141592653589793
>>> e
2.718281828459045
>>>

Python 3.5 und höher haben Konstanten für unendlich und NaN ("keine Zahl"). Die ältere Syntax der Übergabe eines Strings an float() funktioniert immer noch.

Python 3.x 3.5
math.inf == float('inf')
# Out: True

-math.inf == float('-inf')
# Out: True

# NaN never compares equal to anything, even itself
math.nan == float('nan')
# Out: False

Imaginäre Zahlen

Imaginäre Zahlen in Python werden durch ein "j" oder "J" hinter der Zielnummer dargestellt.

1j         # Equivalent to the square root of -1.
1j * 1j    # = (-1+0j)

Infinity und NaN ("keine Zahl")

In allen Versionen von Python können wir unendlich und NaN ("keine Zahl") wie folgt darstellen:

pos_inf = float('inf')     # positive infinity
neg_inf = float('-inf')    # negative infinity
not_a_num = float('nan')   # NaN ("not a number")

In Python 3.5 und höher können wir auch die definierten Konstanten math.inf und math.nan :

Python 3.x 3.5
pos_inf = math.inf
neg_inf = -math.inf
not_a_num = math.nan

Die String-Darstellungen werden als inf und -inf und nan angezeigt:

pos_inf, neg_inf, not_a_num
# Out: (inf, -inf, nan)

Wir können mit der isinf Methode auf positive oder negative Unendlichkeit isinf :

math.isinf(pos_inf)
# Out: True

math.isinf(neg_inf)
# Out: True

Wir können durch direkten Vergleich gezielt auf positive Unendlichkeit oder auf negative Unendlichkeit testen:

pos_inf == float('inf')    # or  == math.inf in Python 3.5+
# Out: True

neg_inf == float('-inf')   # or  == -math.inf in Python 3.5+
# Out: True

neg_inf == pos_inf
# Out: False

Python 3.2 und höher ermöglicht auch die Überprüfung der Endlichkeit:

Python 3.x 3.2
math.isfinite(pos_inf)
# Out: False

math.isfinite(0.0)
# Out: True

Vergleichsoperatoren arbeiten erwartungsgemäß für positive und negative Unendlichkeit:

import sys

sys.float_info.max
# Out: 1.7976931348623157e+308  (this is system-dependent)

pos_inf > sys.float_info.max
# Out: True

neg_inf < -sys.float_info.max
# Out: True

Wenn jedoch ein arithmetischer Ausdruck einen Wert erzeugt, der größer als das Maximum ist, das als float , wird er unendlich.

pos_inf == sys.float_info.max * 1.0000001
# Out: True

neg_inf == -sys.float_info.max * 1.0000001
# Out: True

Die Division durch Null führt jedoch nicht zu einem Ergebnis von unendlich (oder, wenn angemessen, mit negativem unendlich), sondern löst eine ZeroDivisionError Ausnahme aus.

try:
    x = 1.0 / 0.0
    print(x)
except ZeroDivisionError:
    print("Division by zero")

# Out: Division by zero

Rechenoperationen im Unendlichen geben nur unendliche Ergebnisse oder manchmal NaN:

-5.0 * pos_inf == neg_inf
# Out: True

-5.0 * neg_inf == pos_inf
# Out: True

pos_inf * neg_inf == neg_inf
# Out: True

0.0 * pos_inf
# Out: nan

0.0 * neg_inf
# Out: nan

pos_inf / pos_inf
# Out: nan

NaN ist niemals irgendetwas gleich, nicht einmal sich selbst. Wir können es mit der isnan Methode isnan :

not_a_num == not_a_num
# Out: False

math.isnan(not_a_num)
Out: True

NaN wird immer als "nicht gleich" verglichen, aber niemals kleiner als oder größer als:

not_a_num != 5.0   # or any random value
# Out: True

not_a_num > 5.0   or   not_a_num < 5.0   or   not_a_num == 5.0
# Out: False

Rechenoperationen an NaN geben immer NaN. Dies beinhaltet die Multiplikation mit -1: Es gibt kein "negatives NaN".

5.0 * not_a_num
# Out: nan

float('-nan')
# Out: nan
Python 3.x 3.5
-math.nan
# Out: nan

Es gibt einen geringfügigen Unterschied zwischen den alten float Versionen von NaN und Infinity und den math Bibliothekskonstanten Python 3.5+:

Python 3.x 3.5
math.inf is math.inf, math.nan is math.nan
# Out: (True, True)

float('inf') is float('inf'), float('nan') is float('nan')
# Out: (False, False)

Pow für schnellere Potenzierung

Verwenden des Timeit-Moduls über die Befehlszeile:

> python -m timeit 'for x in xrange(50000): b = x**3'
10 loops, best of 3: 51.2 msec per loop
> python -m timeit 'from math import pow' 'for x in xrange(50000): b = pow(x,3)' 
100 loops, best of 3: 9.15 msec per loop

Der eingebaute ** -Operator ist oft praktisch, wenn Leistung jedoch von entscheidender Bedeutung ist, verwenden Sie math.pow. Beachten Sie jedoch, dass pow Float zurückgibt, auch wenn die Argumente Ganzzahlen sind:

> from math import pow
> pow(5,5)
3125.0

Komplexe Zahlen und das cmath-Modul

Das cmath Modul ähnelt dem math Modul, definiert jedoch Funktionen, die für die komplexe Ebene geeignet sind.

Komplexe Zahlen sind vor allem ein numerischer Typ, der Teil der Python-Sprache selbst ist und nicht von einer Bibliotheksklasse bereitgestellt wird. Daher müssen wir import cmath für gewöhnliche arithmetische Ausdrücke nicht import cmath .

Beachten Sie, dass wir j (oder J ) und nicht i .

z = 1 + 3j

Wir müssen 1j da j der Name einer Variablen und nicht ein numerisches Literal ist.

1j * 1j
Out: (-1+0j)

1j ** 1j
# Out: (0.20787957635076193+0j)     # "i to the i"  ==  math.e ** -(math.pi/2)

Wir haben den real und den imag (Imaginärteil) sowie das komplexe conjugate :

# real part and imaginary part are both float type
z.real, z.imag
# Out: (1.0, 3.0)

z.conjugate()
# Out: (1-3j)    # z.conjugate() == z.real - z.imag * 1j

Die integrierten Funktionen abs und complex sind ebenfalls Teil der Sprache selbst und erfordern keinen Import:

abs(1 + 1j)
# Out: 1.4142135623730951     # square root of 2

complex(1)
# Out: (1+0j)

complex(imag=1)
# Out: (1j)

complex(1, 1)
# Out: (1+1j)

Die complex Funktion kann eine Zeichenfolge enthalten, darf jedoch keine Leerzeichen enthalten:

complex('1+1j')
# Out: (1+1j)

complex('1 + 1j')
# Exception: ValueError: complex() arg is a malformed string

Für die meisten Funktionen benötigen wir jedoch das Modul, zum Beispiel sqrt :

import cmath

cmath.sqrt(-1)
# Out: 1j

Natürlich ist das Verhalten von sqrt bei komplexen Zahlen und reellen Zahlen unterschiedlich. In der nicht komplexen math löst die Quadratwurzel einer negativen Zahl eine Ausnahme aus:

import math

math.sqrt(-1)
# Exception: ValueError: math domain error

Es werden Funktionen zum Konvertieren in und von Polarkoordinaten bereitgestellt:

cmath.polar(1 + 1j)
# Out: (1.4142135623730951, 0.7853981633974483)    # == (sqrt(1 + 1), atan2(1, 1))

abs(1 + 1j), cmath.phase(1 + 1j)
# Out: (1.4142135623730951, 0.7853981633974483)    # same as previous calculation

cmath.rect(math.sqrt(2), math.atan(1))
# Out: (1.0000000000000002+1.0000000000000002j)

Das mathematische Feld der komplexen Analyse liegt außerhalb des Rahmens dieses Beispiels, aber viele Funktionen in der komplexen Ebene haben einen "Astschnitt", üblicherweise entlang der realen Achse oder der imaginären Achse. Die meisten modernen Plattformen unterstützen die "Vorzeichenlose Null", wie in IEEE 754 angegeben, wodurch die Funktionen dieser Funktionen auf beiden Seiten des Astschnittes erhalten bleiben. Das folgende Beispiel stammt aus der Python-Dokumentation:

cmath.phase(complex(-1.0, 0.0))
# Out: 3.141592653589793

cmath.phase(complex(-1.0, -0.0))
# Out: -3.141592653589793

Das cmath Modul bietet auch viele Funktionen mit direkten Gegenstücken aus dem math .

Neben sqrt gibt es komplexe Versionen von exp , log , log10 , den trigonometrischen Funktionen und ihren Inversen ( sin , cos , tan , asin , acos , atan ) und den hyperbolischen Funktionen und ihren Inversen ( sinh , cosh , tanh , asinh , acosh , atanh ). Es gibt jedoch kein komplexes Gegenstück zu math.atan2 , der Zwei-Argument-Form von arctangent.

cmath.log(1+1j)
# Out: (0.34657359027997264+0.7853981633974483j)

cmath.exp(1j * cmath.pi)
# Out: (-1+1.2246467991473532e-16j)   # e to the i pi == -1, within rounding error

Die Konstanten pi und e sind angegeben. Beachten Sie, dass diese float und nicht complex .

type(cmath.pi)
# Out: <class 'float'>

Das cmath Modul bietet auch komplexe Versionen von isinf und (für Python 3.2+) ist isfinite . Siehe " Infinity und NaN ". Eine komplexe Zahl wird als unendlich betrachtet, wenn entweder der Realteil oder der Imaginärteil unendlich ist.

cmath.isinf(complex(float('inf'), 0.0))
# Out: True

Ebenso bietet das cmath Modul eine komplexe Version von isnan . Siehe " Infinity und NaN ". Eine komplexe Zahl wird als "keine Zahl" betrachtet, wenn entweder ihr Realteil oder ihr Imaginärteil "keine Zahl" ist.

cmath.isnan(0.0, float('nan'))
# Out: True 

Beachten Sie, dass es kein cmath Gegenstück zu den Konstanten math.inf und math.nan (ab Python 3.5 und höher).

Python 3.x 3.5
cmath.isinf(complex(0.0, math.inf))
# Out: True

cmath.isnan(complex(math.nan, 0.0))
# Out: True

cmath.inf
# Exception: AttributeError: module 'cmath' has no attribute 'inf'

In Python 3.5 und höher gibt es in den Modulen cmath und math eine isclose Methode.

Python 3.x 3.5
z = cmath.rect(*cmath.polar(1+1j))

z
# Out: (1.0000000000000002+1.0000000000000002j)

cmath.isclose(z, 1+1j)
# True


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow